안녕. 저는 젠투 리눅스를 사용하고 있습니다. 스레드 apache2로 mod_perl을 이머지/설치할 수 없는 것 같아서 apache2의 작업자 모듈을 cgi-perl과 함께 사용하고 apache2의 prefork 모듈을 mod_perl과 함께 사용하는 것의 장단점이 무엇인지 알고 싶습니다.
뭐가 더 빨라? 자원이 적게 드는 것은 무엇입니까? 보안상 차이가 있나요?
감사해요!
답변1
Linux에서는 mod_perl이 포함된 prefork apache를 사용하세요. Threaded MPM은 프로세스 생성 비용이 많이 드는 Win32 사용자에게 큰 이점입니다. 리눅스에서 fork()는 꽤 저렴한 호출입니다. 그러나 Mod_perl2 개발자들은 mod_perl2가 apache2 + 스레드와 함께 작동하도록 하기 위해 많은 노력을 기울였지만 Perl의 스레드 모델은 약간 메모리 집약적입니다.
우리는 큰 mod_perl 앱을 개발하고 있는데, 만약 오늘 그것을 다시 만들어야 한다면 아마도 다양한 프레임워크 중 하나를 추천하고 FastCGI를 사용하거나PSGI. FCGI 또는 기본 PSGI/FCGI 기능이 포함된 프레임 작업을 사용하면 프런트 엔드(nginx, lighttpd, apache2)를 선택할 수 있습니다. 앱을 루트로 전환하고 권한을 낮출 수 있습니다(프런트 엔드와 통신하려면 소켓만 필요함). 앱에서 mod_perl2를 사용하게 하면 Apache2와 거의 결혼하게 됩니다.
답변2
IMHO, prefork+mod_per가 훨씬 빠르겠지만, mod_perl 메일링 리스트에 문의하면 더 정확한 답변을 얻을 수 있습니다.
답변3
Modperl은 Catalyst를 위한 완벽한 어댑터입니다. Modpython과 Modwsgi는 모두 Django용이고 modphp는 Cakephp용인 반면 Modruby는 cgi, fcgi 및 (Modrails/Modpassenger/Modlocomotive)가 Rails용보다 좋거나 나쁘다는 논쟁이 벌어지고 있는 것과 같습니다. 특히 스레드 모드를 사용하는 동안(그러나 대안으로 Modrake 및 프록시 Mongrel 앱 서버가 있습니다). 단점을 피하고 장점만 얻으려면 항상 분기 모드를 사용하세요. 저는 Rails에서 영감을 받은 다른 프로그래밍 언어인 Catalyst, Django, Cakephp 및 Rails의 mvc만을 언급하고 있습니다.
제 생각에는 멀티포크 mpm-itk-mode가 가장 좋고, 멀티스레드 mpm-event-mode가 그 뒤를 따르고, 그 다음이 싱글 스레드 mpm-prefork-mode이고, 마지막으로 싱글 스레드 mpm-worker-mode가 옵니다.
일부 프로그래밍 언어의 경우 mod-php 및 mod-tcl과 같은 해당 apache2 어댑터는 특별히 prefork 모드에서만 실행되고 itk 모드에서는 실행되지 않는 반면 mod-ruby는 여전히 linux-apache2에서만 실행되고 아직 실행되지 않습니다. windows-apache2로 만드세요.
그러나 다행스럽게도 mode-perl, mod-python 및 mod-ruby는 더 다재다능하며 libapache-mpm-worker 모드, libapache-mpm-prefork 모드, libapache-mpm-event의 네 가지 모드 모두에서 실행되도록 만들 수 있습니다. 모드 및 libapache-mpm-itk 모드. 이는 Perl, Python 및 Ruby 사용자에게는 좋은 소식이지만, 물론 세 가지 어댑터 모두의 경우에도 분기 모드는 스레드 모드보다 더 빠르고, 더 다양하며, 충돌이 없습니다. 한 가지 확실한 점은 이러한 모든 어댑터가 cgi보다 빠르게 실행되도록 설계되었으며 틀림없이 fcgi(fastcgi)만큼 빠르다는 것입니다.
나는 itk(멀티포크) 모드를 사용합니다. 프리포크(싱글 포크) 모드가 필요한 일부 소프트웨어가 누락되더라도 말입니다.
나는 항상 Ubuntu에서 itk-mode를 선호했으며 전제 조건으로 prefork-mode가 필요한 응용 프로그램을 설치하는 것을 결코 선택하지 않았습니다. Gentoo 버전인 Sabayon과 같은 일부 배포판은 기본적으로 작업자 모드에서 apache2를 설치합니다. 하지만 이는 Apache 시스템 구성 파일을 편집하고 다음을 포함하는 줄의 주석 처리를 제거하여 언제든지 변경할 수 있습니다.그렇죠(그리고 다음 줄에 주석을 달았습니다.노동자) 그런 다음 apache2를 다시 컴파일하고 다시 시작합니다. 따라서 Sabayon에 적용되는 모든 것은 Gentoo에도 적용되어야 합니다. Sabayon과 Gentoo는 모든 프리포크 종속 또는 작업자 종속 소프트웨어를 설치하지만 구성하는 동안 시스템에서 종속성을 충족하는 소프트웨어만 실행해야 합니다.
매우 큰 타격을 입은 것은 실행에 실패한 일부 PHP 기반 프레임워크(콘텐츠 관리 시스템에 필요함)입니다. itk, 이벤트(또는 작업자) 모드에서 실행될 수 있는 유일한 PHP 프레임워크는 cake-php인데, 불행하게도 거의 사용되지 않습니다. 나는 더 잘 알려진 Horde(PHP) 프레임워크도 작동해야 한다고 생각합니다.
스레드가 포크보다 나쁘다는 또 다른 증거는 창에서 볼 수 있듯이 두 개 이상의 웹 서버 어댑터가 서로 및 시스템에 발생하는 충돌 수 또는 충돌을 살펴보는 것입니다.
Windows의 경우 apache2는 작업자 모드로 구성합니다. 왜냐하면 prefork 및 itk 모드는 불가능하지만 이벤트 모드는 매우 가능해야 하기 때문입니다. 따라서 apache2 이벤트(다중 스레드) 모드로 전환하면 대부분의 문제가 해결됩니다. 그러나 apache2는 매우 유연하고 modperl(따라서 perl-catalyst mvc), modpython(따라서 django mvc)에 대해 사용자 정의가 가능하지만 windows-modruby는 아직 안정적이지 않습니다. 이에 상응하는 modpassenger(modpassenger -- linux, modrails -- windows, locomotive -- macosx)는 abyss-webserver 또는 lighttpd-webserver(따라서 Rails mvc)에 존재합니다.
주의 사항: 시스템이 Windows인 경우 Perl/Python/Ruby/PHP/Tcl의 MVC를 설치하기 전에 모든 것이 하나의 단일 웹 서버(apache2, lighttpd 또는 cherokee)로만 구성되어 있는지 확인하십시오. abyss, modrails가 있는 레일을 사용하려는 경우 wamp, modphp가 포함된 drupal/jhoomla 구성이 존재하지 않는지 확인하십시오. 그렇지 않으면 때때로 windowsxp의 기본 windows-shell이 충돌할 수 있습니다(대체 옵션과 함께 windowsxp를 사용하여 여전히 복구할 수 있습니다). ros-explorer, Cubic-explorer, ultra-explorer 등과 같은 대체 파일 관리자가 있는 Reactos-Shell, Emerge-Desktop, Sharp-enviro, bblean-Blackbox 등과 같은 쉘 - 모든 사용자가 적응하는 데 신경 쓰지 않는 경우 다르게 보이는 데스크탑 쉘 및 파일 관리자와 동일한 OS를 사용합니다.
따라서 Windows에서는 Modrail이 modphp와 충돌하고(안정적인 Modruby를 사용할 수 있을 때까지) ASP 기반 windows-desktop-shell(windows 네트워크 개체 모델 환경)은 한 번에 하나만 보유할 수 있는 반면, 대체 쉘은 코드 블록으로 작성되었습니다. (Reactos 및 Emerge-Desktop)은 충돌하지 않는 반면, Delphi(Sharp-Enviro)로 작성된 것들은 부분적으로 충돌하지만 Sharp-Enviro의 Lazarus 리메이크는 충돌하지 않아야 합니다.
따라서 Linux 웹 기술이 훨씬 더 다양하면서도 성공적인 이유 중 하나는 스레드 모드에 비해 포크 모드의 장점 때문입니다. Windows 웹 기술은 많은 노력을 기울인 후에도 여전히 소수의 플레이어와 소수의 오픈 소스 기술을 중심으로 발전하고 있습니다.
답변4
몇 가지 추가 정보입니다. 방금 Win32에서 mod_perl을 덤프하고 Plack을 사용하여 PSGI로 전환했습니다. 우리에게 매우 잘 작동하는 CGI::Application에 대한 호환성 레이어가 있습니다. Catalyst가 PSGI로 전환 중이거나 전환되었습니다.