우분투 16에서 prefork에서 이벤트로 아파치를 전환하고 PHP 7을 작동 시키십시오.


11

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

sudo apachectl -V

그리고 서버 MPMprefork 라는 것을 알게되면서 경보를 받았습니다 . 그들은 프로덕션 서버에서 PREFORK를 사용하지 마십시오. 우분투 패키지 (아마도 데비안에서 상속 받았습니까?)는 아파치에서 PHP를 실행 하는 권장 방법이 proxy_fcgi 및 php-fpm을 명확하게 권장 한다는 사실에도 불구하고 프리 포크 모드에서 아파치를 실행해야한다고 주장 합니다. 프리 포크 사용 :

더 이상 prefork mpm과 함께 mod_php를 사용하지 않아야하는 이유

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

이 페이지에는 PHP-FPM에 대한 세부 정보 도 포함되어 있지만 약간 정교하고 명확하지 않으며 많은 수동 구성이 필요한 것 같습니다. 실망스럽고 Ubuntu 16에는 fastCGI 모드 또는 기타 패키지 옵션이 없습니다.

a2enmod를 사용하여 아파치를 이벤트 모드로 전환 하려고했는데 아파치를 다시 시작하려고 할 때 오류가 발생했습니다.

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

어쨌든 누구나 패키지 설치 프로그램에 최대한 의존 하여 PHP 7.0의 Ubuntu 16에서 fastCGI 모드를 실행하는 데 필요한 최소한의 단계별 지침이 있는지 궁금 합니다. 저는 현재 잘 설명이 안되고 모호한 지침을 많이보고 있으며 의사 결정으로 생산 환경을 정리하는 데 관심이 있습니다.

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


마지막 오류는 이벤트로 전환했지만 여전히 mod_php를 사용하고 있기 때문입니다. mod_php를 비활성화하고 php-fpm으로 전환하면 사라집니다. 그리고 nginx를 추천 할 수 있습니까?
Michael Hampton

@MichaelHampton 제목은 PHP를 언급해야합니다. 아파치를 이벤트로 전환하는 것은 어렵지 않습니다. 아파치를 이벤트로 전환하고 PHP 7을 작동시키는 것은 어렵습니다.
S. Imp

1
@MichaelHampton은 분명히 "mod_php를 비활성화하고 php-fpm으로 전환하는 방법"에 대해 혼란스러워한다는 것을 알고 있습니다. 내 게시물에서 묻는 바로 그 질문이 아닙니까? 또한 질문은 nginx에 관한 것이 아니라 또 다른 학습 영역을 제시합니다. 팀과 함께 일하고 있기 때문에이 프로젝트에는 nginx로 전환하는 것이 실용적이지 않습니다.
S. Imp

아파치 모듈을 비활성화하는 방법은 언급하지 않았다. php-fpm 활성화에 대해서는이 질문에 대한 답변, 온라인 자습서 등을 참조하십시오.
Michael Hampton

답변:


15

ezra-s 는 좋은 접근 방식을 제안하지만 패키지 관리자에 의존하는 사람들에게는 혼란 스러울 수있는 세부 사항은 포함하지 않습니다. 참고 :이 단계가 정확한지 확실하지 않습니다. 누구든지 문제가 발생하거나 문제가 발생하면 알려 주시면이 게시물을 업데이트하겠습니다.

먼저,이 글을 쓰는 시점에서 우분투의 apache2 패키지는 PHP를 설치하려면 프리 포크를 요구합니다. 그래도 설치 패키지 설치를 사용하고 업데이트 PHP 수 있기 때문에, 그러나 절망하지 마십시오 아파치 작업 구성 얻을 여전히 아파치와 이벤트 PHP-FPM를 사용하는 모드로 아파치 위키 추천 하고 자세히 설명 하이 mod_proxy_fcgi 및 php-fpm을 사용하는 Apache httpd 2.4.x의 성능 PHP . 기본 아이디어는 apache2와 PHP-FPM이 Apache 모듈로 실행되는 PHP가 아니라 소켓을 통해 통신한다는 것입니다.

1) Apache PHP 모듈 제거 또는 비활성화

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

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으로 PHP 파일 요청을 처리하도록 지시하며이 지시문의 경로 ( /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출력에서 볼 수 있습니다.


5
ProxyPassMatch 사용하지 않는 것이 좋습니다. 디렉토리에서 .htaccess를 사용할 수 없기 때문입니다. "|있는 fcgi /run/php/php7.0-fpm.sock : // 로컬 호스트 / 프록시 : 유닉스"</ FilesMatch> <FilesMatch \ .PHP $> SetHandler이 대신 사용
waza123


/etc/apache2/sites-available/default-ssl.conf,?와 달리이 파일을 건드리지 않으면 어떻게됩니까? 내 https & http 둘 다 잘 작동
user5858

ProxyPassMatch를 제외하고 @ waza123의 주석에서 000-default.conf의 맨 위에 Filesmatch 줄을 추가하고 apache2를 다시 시작하면 모든 것이 완벽하게 작동합니다. 당신이 내 작은 VPS 모두 덕분에 🥳 mpm_prefork를 통해 메모리와 CPU의 톤을 저장
DW1

Ubuntu Server 19.10을 사용하여 ProxyPass 또는 파일 편집을 수행 할 필요가 없었습니다. 3 단계 (PHP-FPM 설치) 후 방금 수행 a2enconf /etc/apache2/conf-available/php7.3-fpm.conf; systemctl reload apache했으며 <?php phpinfo();내부 로 phpinfo.php 파일을 만들 때 서버 API 줄에 FPM / FastCGI가 표시됩니다. BTW, 나는이 글을 쓸 당시에는 적어도 그 버전에 있어야하고 Ubuntu Server 19.10의 Ubuntu apt 저장소는 현재 php7.3으로 올라 가기 때문에 php7.3을 설치했습니다.
ServerChecker

6

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

가장 성능이 좋은 방법은 apache w / event + 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는 해당 구성에만 관심이 있으므로 모듈을 언로드하면됩니다.


답변 주셔서 감사합니다. 나는 많은 시행 착오를 겪어 왔으며 이것이 현재 작동하는 것처럼 보입니다. 실제 프로세스는 prefork에서 이벤트로 아파치를 가져오고 libapache2-mod-php7.0 등을 제거해야하기 때문에 조금 더 복잡합니다. 여기에 좀 더 완전한 대답을 공식화하기를 바랍니다.
S. Imp

아파치 httpd 관점에서 "설치 제거"할 필요없이 모듈을 언로드하십시오. 이벤트 / 프리 포크와 마찬가지로 mpm도 2.4의 모듈이므로 프리 포크를 언로드하고 이벤트를로드합니다.
ezra-s

좋아, 아마도 패키지를 제거 할 필요는 없지만 최소한 아파치에 대해 php 모듈을 비활성화해야합니다-그리고 설정을 깨는 apt-get 업그레이드가 걱정됩니다. 이러한 세부 사항은 귀하의 답변에서 누락되었습니다. 정확히 내가 한 일에 대한 세부 사항을 정확하게 얻을 수있는 능력에 대해 확신이 없기 때문에 추가하면 기쁠 것입니다.
S. Imp

아마도 필자는 아파치가 데비안 패키지뿐만 아니라 기능 구성 만 신경 쓰지 않는다고 가정했을 것입니다.
ezra-s

Apache apt 패키지 업데이트가 구성을 변경하는지 여부 관리합니다. 이는 한 시점에서 발생한 문제입니다. 원래 게시물의 정신으로, 패키지 설치 프로그램 (및 업데이트)에 의존하는 다른 사람들에게 자세한 지침을 제공하고 싶습니다.
S. Imp
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.