이 글에서는 주로 Nginx+PHP 프로덕션 환경을 구축하기 위해 php-fpm을 설치하고 구성하는 방법을 소개합니다. php-fpm의 기능은 FastCGI 프로세스 관리를 PHP 패키지에 통합하는 것입니다. 필요한 친구는
nginx를 참조할 수 있습니다. 자체적으로는 처리할 수 없습니다. PHP는 단지 웹 서버일 뿐입니다. 요청이 수신되면 PHP 요청인 경우 처리를 위해 PHP 인터프리터로 전송되고 결과가 클라이언트에 반환됩니다.
nginx는 일반적으로 처리를 위해 fastcgi 관리 프로세스에 요청을 보냅니다. fascgi 관리 프로세스는 결과를 처리할 cgi 하위 프로세스를 선택하고 이를 nginx로 반환합니다.
이 기사에서는 만드는 방법을 소개하기 위해 php-fpm을 예로 사용합니다. nginx 지원 PHP
1. php-fpm
컴파일 및 설치PHP-FPM
PHP-FPM은 PHP FastCGI 관리자로, PHP에만 사용되며 http://php- fpm.org/download.
PHP-FPM은 실제로 FastCGI 프로세스 관리를 PHP 패키지에 통합하도록 설계된 PHP 소스 코드에 대한 패치입니다. PHP 소스 코드에 패치해야 하며, PHP를 컴파일하고 설치한 후에 사용할 수 있습니다.
새 버전의 PHP에는 php-fpm이 통합되어 있습니다. 더 이상 타사 패키지를 사용하는 것이 좋습니다. PHP-FPM은 더 나은 PHP 프로세스 관리 방법을 제공하고, 메모리와 프로세스를 효과적으로 제어할 수 있으며, PHP 구성을 원활하게 다시 로드할 수 있습니다. 이는spawn-fcgi보다 더 많은 장점을 가지고 있어 공식적으로 PHP에 포함됩니다. ./configure의 –enable-fpm 매개변수를 사용하여 PHP-FPM을 켤 수 있습니다. 다른 매개변수는 php에 대해 구성됩니다. 옵션의 구체적인 의미는 여기에서 확인할 수 있습니다.
설치 전 준비
centos에서 실행
yum -y install gcc automake autoconf libtool make yum -y install gcc gcc-c++ glibc yum -y install libmcrypt-devel mhash-devel libxslt-devel
libjpeg libjpeg-devel libpng libpng-devel freetype freetype-devel libxml2 libxml2-devel zlib zlib-devel glibc glibc-devel glib2 glib2-devel bzip2 bzip2-devel ncurses ncurses-devel curl curl-devel e2fsprogs e2fsprogs-devel krb5 krb5-devel libidn libidn-devel openssl openssl-devel
새 버전의 php-fpm 설치(권장 설치 방법)
wget http://cn2.php.net/distributions/php-5.4.7.tar.gz tar zvxf php-5.4.7.tar.gz cd php-5.4.7 ./configure --prefix=/usr/local/php --enable-fpm --with-mcrypt
--enable-mbstring --disable-pdo --with-curl --disable-debug --disable-rpath --enable-inline-optimization --with-bz2 --with-zlib --enable-sockets --enable-sysvsem --enable-sysvshm --enable-pcntl --enable-mbregex --with-mhash --enable-zip --with-pcre-regex --with-mysql --with-mysqli --with-gd --with-jpeg-dir
make all install
위의 두 가지 php-fpm은 어떤 방법으로든 설치할 수 있습니다. 설치 후 내용은 /usr/local/php 디렉토리에 위치합니다
위로 php-fpm 설치가 완료됩니다.
다음은 php-fpm 실행 사용자를 설정하는 것입니다
cd /usr/local/php cp etc/php-fpm.conf.default etc/php-fpm.conf vi etc/php-fpm.conf
Modification
user = www-data group = www-data
www-data 사용자가 존재하지 않으면 www-data 사용자를 먼저 추가하세요
groupadd www-data useradd -g www-data www-data
2. nginx를 컴파일하고 설치합니다
3. php-fpm을 지원하도록 nginx 구성 파일을 수정합니다
nginx 설치가 완료된 후 nginx 구성 파일을 nginx.conf
로 수정합니다. 서버 섹션에 다음 구성을 추가하고 빨간색 콘텐츠 구성 표시에 주의하세요. 그렇지 않으면 입력 파일이 지정되지 않습니다.
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000 # location ~ .php$ { root html; fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; }
IV. 테스트 PHP 파일 만들기
PHP 파일 만들기
/usr/local/nginx/html 아래에 index.php 파일을 생성하고, 다음 내용을 입력하세요.
<?php echo phpinfo(); ?>
5. 서비스 시작
php-fpm 및 nginx 시작
/usr/local/php/sbin/php-fpm #手动打补丁的启动方式/usr/local/php/sbin/php-fpm start sudo /usr/local/nginx/nginx
php-fpm 닫았다가 다시 시작하면 글 끝부분 참조
6. 브라우저 접속
http://your server ip/index.php에 접속하시면 php 정보를 보실 수 있습니다.
7. 오류 해결
Nginx를 사용하다 보면 502 Bad Gateway 및 504 Gateway Time-out 오류가 자주 발생합니다. Nginx+PHP-FPM을 사용하여 이러한 두 가지 일반적인 오류를 분석해 보겠습니다. 오류의 해결책.
1.502 잘못된 게이트웨이 오류
php.ini와 php-fpm.conf에는 각각 max_execution_time과 request_terminate_timeout이라는 두 가지 구성 항목이 있습니다.
이 두 항목은 PHP 스크립트의 최대 실행 시간을 구성하는 데 사용됩니다. 이 시간을 초과하면 PHP-FPM은 스크립트 실행을 종료할 뿐만 아니라 스크립트를 실행하는 작업자 프로세스도 종료합니다. 따라서 Nginx는 자신과 통신하기 위한 연결이 끊어진 것을 발견하고 클라이언트에 502 오류를 반환합니다.
1) Nginx 오류 액세스 로그:
2013/09/19 01:09:00 [error] 27600#0: *78887 recv() failed (104: Connection reset by peer) while reading response header from upstream, client: 192.168.1.101, server: test.com, request: "POST /index.php HTTP/1.1", upstream: "fastcgi://unix:/dev/shm/php-fcgi.sock:", host: "test.com", referrer: "http://test.com/index.php"
WARNING: child 25708 exited on signal 15 (SIGTERM) after 21008.883410 seconds from start
따라서 전역 php.ini를 변경하지 않으려면 PHP-FPM의 구성을 변경하면 됩니다.
그래서 max_fail을 늘리고 failure_timeout을 줄일 수 있습니다.
PHP-FPM设置的脚本最大执行时间已经够长了,但执行耗时PHP脚本时,发现Nginx报错从502变为504了。这是为什么呢? 以Nginx超时时间为90秒,PHP-FPM超时时间为300秒为例,报504 Gateway Timeout错误时的Nginx错误访问日志如下: 调高这三项的值(主要是read和send两项,默认不配置的话Nginx会将超时时间设为60秒)之后,504错误也解决了。 配置举例: 위 내용은 Nginx+PHP 프로덕션 환경을 구축하려면 php-fpm을 설치하고 구성하세요.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!
因为我们修改的只是PHP的配置,Nginx中也有关于与上游服务器通信超时时间的配置factcgi_connect/read/send_timeout。
2013/09/19 00:55:51 [error] 27600#0: *78877 upstream timed out (110: Connection timed out) while reading response header from upstream,
client: 192.168.1.101, server: test.com, request: "POST /index.php HTTP/1.1", upstream: "fastcgi://unix:/dev/shm/php-fcgi.sock:",
host: "test.com", referrer: "http://test.com/index.php"
而且这三项配置可以配置在http、server级别,也可以配置在location级别。担心影响其他应用的话,就配置在自己应用的location中吧。
要注意的是factcgi_connect/read/send_timeout是对FastCGI生效的,而proxy_connect/read/send_timeout是对proxy_pass生效的。location ~ \.php$ {
root /home/cdai/test.com;
include fastcgi_params;
fastcgi_connect_timeout 180;
fastcgi_read_timeout 600;
fastcgi_send_timeout 600;
fastcgi_pass unix:/dev/shm/php-fcgi.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /home/cdai/test.com$fastcgi_script_name;
}