1) Apache PHP 모듈을 제거하거나 비활성화합니다.

1) Apache PHP 모듈을 제거하거나 비활성화합니다.

Apache가 프로덕션에서 느리게 실행되었습니다. 한동안 답변을 검색한 후 마침내 #apache IRC 채널로 이동했고 전문가들은 다음 명령으로 Apache 모드를 확인하도록 했습니다.

sudo apachectl -V

그리고 그 사실을 알고는 놀랐습니다.서버 MPM~이다프리포크. 그들은 강조해서 말했습니다.프로덕션 서버에서는 PREFORK를 사용하지 마십시오.결과적으로 Ubuntu 패키지(아마도 Debian에서 상속되었나요?)는 다음과 같은 사실에도 불구하고 prefork 모드에서 Apache를 실행해야 한다고 주장합니다.Apache와 함께 PHP를 실행하기 위한 권장 방법분명히 Proxy_fcgi와 php-fpm을 권장한 다음 fcgid를 권장하고 궁극적으로 프리포크를 사용해서는 안 된다고 말합니다.

더 이상 prefork mpm과 함께 mod_php를 사용하면 안되는 이유

  • mod_php는 항상 모든 httpd 프로세스에 로드됩니다. httpd가 정적/비 PHP 콘텐츠를 제공하는 경우에도 해당 메모리가 사용 중입니다.
  • mod_php는 스레드로부터 안전하지 않으며 가능한 가장 느린 구성인 prefork mpm(다중 프로세스, 스레드 없음)을 고수해야 합니다.

해당 페이지에는 다음 내용도 포함되어 있습니다.PHP-FPM에 대한 세부 사항하지만 이는 다소 정교하고 불분명해 보이며 수동 구성이 많이 필요한 것 같습니다. 저는 Ubuntu 16에 fastCGI 모드 등을 위한 패키지 옵션이 없다는 사실에 실망하고 놀랐습니다.

나는 아파치를 전환하려고 시도했다.이벤트 모드a2enmod를 사용하여 Apache 백업을 실행하려고 했을 때 오류가 발생했습니다.

Apache가 스레드 MPM을 실행하고 있지만 PHP 모듈이 스레드 안전하도록 컴파일되지 않았습니다. PHP를 다시 컴파일해야 합니다.

어쨌든 PHP 7.0을 사용하여 Ubuntu 16에서 fastCGI 모드를 실행하기 위한 최소한의 단계별 지침이 있는지 궁금합니다.가능한 한 패키지 설치 프로그램에 의존합니다.저는 현재 설명이 부족하고 모호한 지침을 많이 보고 있으며, 잘못된 결정으로 인해 생산 환경이 망가지는 것을 걱정하고 있습니다.

또한 누군가 mpm-event를 태그 옵션으로 추가해야 합니다. 이것이 #apache IRC 직원이 권장한 것입니다.

답변1

에즈라좋은 접근 방식을 제안하지만 패키지 관리자에 의존하는 사람들에게 혼란스러울 수 있는 몇 가지 세부 정보는 포함되어 있지 않습니다.메모: 이 단계가 정확한지 잘 모르겠습니다. 누구든지 문제가 발생하거나 문제가 발견되면 알려주시면 이 게시물을 업데이트하겠습니다.

첫째, 이 글을 쓰는 시점에서 Ubuntu의 apache2 패키지는 PHP를 설치하려는 경우 prefork를 요구합니다. 하지만 절망하지 마십시오. 패키지 설치 프로그램을 사용하여 PHP를 설치하고 업데이트할 수 있기 때문입니다.그리고apache2를 사용하고 여전히 Apache에서 작동하는 구성을 얻습니다.이벤트PHP-FPM을 사용하는 모드Apache 위키에서 추천함더 자세히 설명되어 있습니다.mod_proxy_fcgi 및 php-fpm을 사용하는 Apache httpd 2.4.x의 고성능 PHP. 기본 아이디어는 apache2와 PHP-FPM이 Apache 모듈로 실행되는 PHP가 아닌 소켓을 통해 통신한다는 것입니다.

1) Apache PHP 모듈을 제거하거나 비활성화합니다.

Ubuntu 패키지는 PHP 설치 시 Apache prefork를 요구하기 때문에 이들을 분리해야 합니다. 더 이상 패키지가 필요하지 않기 때문에 libapache2-mod-php7.0을 제거하기 위해 apt를 사용하여 이 작업을 수행했습니다.

sudo apt-get remove libapache2-mod-php7.0

또는 php7.0 Apache 모듈을 비활성화할 수도 있지만 시스템에서 apt 패키지가 제거되지 않아 짜증나는 시스템 문제가 남습니다.

sudo a2dismod php7.0

2) Apache를 이벤트 모드로 전환하고 fcgid를 활성화합니다.

나는 다음 명령이 트릭을 수행해야 한다고 생각합니다.

sudo a2dismod mpm_prefork
sudo a2enmod mpm_event
sudo a2enmod proxy_fcgi

3) PHP-FPM 설치

이미 다양한 모듈과 함께 PHP 7이 설치되어 있으므로 다음 명령을 사용하여 PHP-FPM을 설치합니다.

sudo apt-get install php7.0-fpm

4) PHP-FPM으로 PHP 파일을 처리하도록 VirtualHost 구성을 편집합니다.

제 경우에는 기본 SSL 호스트를 편집했는데,/etc/apache2/sites-available/default-ssl.conf을 클릭하고 상단 근처에 다음 줄을 추가했습니다.

ProxyPassMatch ^/(.*\.php(/.*)?)$ unix:/run/php/php7.0-fpm.sock|fcgi://localhost/var/www/html/

중요한이는 Apache가 PHP-FPRM 및 이 지시어의 경로(/run/php/php7.0-fpm.sock)는 다음에 의해 지정된 경로와 일치해야 합니다.듣다파일의 지시문/etc/php/7.0/fpm/pool.d/www.conf

5) 아파치를 다시 시작

sudo service apache2 restart

이벤트 모드가 활성화되어 있는지 확인하려면 다음 명령을 사용하십시오.

sudo apachectl -V

출력에 다음이 표시되어야 합니다.

Server MPM:     event

phpinfo 페이지를 생성하고 브라우저에서 접속해보세요. Server API: FPM/FastCGI출력에서 확인해야 합니다 .

답변2

Distros는 편의를 위해 "mod_php" 방법을 제공합니다.

가장 성능이 좋은 방법은 이벤트 + mod_proxy_fcgi -> php-fpm을 사용하는 아파치입니다.

아마도 시대에 따라 업그레이드해야 할 것입니다. 그러나 너무 많은 프레임워크가 일종의 "플러그 앤 플레이" 방식으로 .htaccess mod_php 구성을 제공하는 경우에는 어렵습니다. 결국 사이트를 올바르게 관리하고 구성하는 책임은 관리자에게만 있습니다.

프로덕션 환경에서는 테스트 서버를 사용하여 업그레이드 및 변경 사항을 연습하는 것이 좋습니다.

위키에 대해 나는 "처리기" 방법을 선호하거나 제안하고 싶습니다. https://wiki.apache.org/httpd/PHP-FPM#Proxy_via_handler.

즉, 소켓을 준비하고 Apache 사용자가 요청을 보낼 수 있는 충분한 권한을 갖도록 php-fpm을 구성하고 이를 사용하도록 Apache를 구성합니다.

간단한 예:

# needed modules for reverse proxying to php-fpm
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_fcgi_module modules/mod_proxy_fcgi.so


<Virtualhost *:443>
    ServerName whatever.example.com
    #other typical directives here
    <Directory /var/www/php-app>
        <FilesMatch \.php>
            SetHandler "proxy:unix:/path/to/app.sock|fcgi://localhost/"
        <FilesMatch>
    </Directory>
</VirtualHost>

편집하다:

이 방법을 사용하면 Apache가 신경 쓰지 않기 때문에 어떤 PHP 버전을 사용하는지는 중요하지 않습니다. 적절한 요청을 php-fpm으로 역방향 프록시하기만 하면 됩니다.

또한 mpm_event를 사용하려면 mod_php를 언로드하는 것을 잊지 마십시오.

편집 2:

요청에 따라 debian/ubuntu에서 mod_php 패키지를 제거할 필요가 없습니다. Apache는 해당 구성에만 관심이 있으므로 모듈을 언로드하면 됩니다.

관련 정보