Настройка Nginx для поддержки PHP при помощи FastCGI
После моего первого рассказа о веб- и reverse-proxy сервере nginx, я получил много писем с коментариями и вопросами насчет него. Одним из самых распространенных вопросом был “Как использовать PHP вместе с nginx?”. А этой маленькой пошаговой инструкции я постараюсь описать, как это можно сделать.
Since this article has been published long time ago, there is MUCH better option to manage PHP FastCGI processes than the one I described below. Please check out php-fpm project from Andrei Nigmatulin which IMHO is the best possible way to manage PHP processes.
Nginx включает в себя поддержку технологии FastCGI для работы с внешними серверами и утилитами. PHP тоже поддерживает FastCGI и может быть использован для обработки FastCGI-запросов от nginx.
Итак, для начала нам необходимо установить PHP с поддержкой технологии fastcgi и запустить его на каком-либо tcp-порту, на который потом будут переправляться запросы из nginx. Процесс инсталляции может отличаться на разных системах, потому я опишу процесс сборки PHP из исходного кода как один из самых распространенных методов. Для того, чтобы получить версию интерпретатора PHP с поддержкой FastCGI, Вы можете использовать следующий набор команд:
# ./configure --prefix=/opt/php --enable-fastcgi ... # make ... # make install ... #
Когда эта последовательность команд будет успешно завершена, Вы сможете запустить свой fastcgi-сервер. Но существует два возможных варианта, как это сделать:
- Запуск встроенного в PHP сервера FastCGI – метод, не требующий никаких дополнительных утилит.
- Запуск PHP внутри какого-либо стороннего обработчика запросов – этот вариант может быть более удобным из-за большей гибкости в настройке.
Если Вы решили не использовать никакого стороннего ПО, то можете запустить PHP с использованием его встроенного менеджера FastCGI-запросов при помощи следующего скрипта:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 | #!/bin/bash ## ABSOLUTE path to the PHP binary PHPFCGI="/opt/php/bin/php" ## tcp-port to bind on FCGIPORT="8888" ## IP to bind on FCGIADDR="127.0.0.1" ## number of PHP children to spawn PHP_FCGI_CHILDREN=5 ## number of request before php-process will be restarted PHP_FCGI_MAX_REQUESTS=1000 # allowed environment variables sperated by spaces ALLOWED_ENV="ORACLE_HOME PATH USER" ## if this script is run as root switch to the following user USERID=www-data ################## no config below this line if test x$PHP_FCGI_CHILDREN = x; then PHP_FCGI_CHILDREN=5 fi ALLOWED_ENV="$ALLOWED_ENV PHP_FCGI_CHILDREN" ALLOWED_ENV="$ALLOWED_ENV PHP_FCGI_MAX_REQUESTS" ALLOWED_ENV="$ALLOWED_ENV FCGI_WEB_SERVER_ADDRS" if test x$UID = x0; then EX="/bin/su -m -c \"$PHPFCGI -q -b $FCGIADDR:$FCGIPORT\" $USERID" else EX="$PHPFCGI -b $FCGIADDR:$FCGIPORT" fi echo $EX # copy the allowed environment variables E= for i in $ALLOWED_ENV; do E="$E $i=${!i}" done # clean environment and set up a new one nohup env - $E sh -c "$EX" &> /dev/null & |
Если же Вы решили попробовать использовать какое-либо стороннее программное обеспечение для запуска PHP как FastCGI-серера, могу посоветовать Вам взглянуть на утилиту spawn-fcgi из пакета lighttpd.
Итак, Ваше сервер PHP запущен в режиме FastCGI и последнее, что Вам осталось сделать, это изменить конфигурацию Вашего сервера nginx таким образом, чтобы он переправлял все запросы к файлам php на определенный tcp-порт, на котором слушает PHP. Для этого может быть использован следующий пример секции location из конфигурационного файла nginx (полная версия примера нвходится здесь):
1 2 3 4 5 6 7 8 9 10 11 12 | # pass the PHP scripts to FastCGI server listening on 127.0.0.1:8888 # location ~ .php$ { fastcgi_pass 127.0.0.1:8888; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME /usr/local/nginx/html$fastcgi_script_name; fastcgi_param QUERY_STRING $query_string; fastcgi_param REQUEST_METHOD $request_method; fastcgi_param CONTENT_TYPE $content_type; fastcgi_param CONTENT_LENGTH $content_length; } |
Вот и все! Теперь Вы можете использовать Ваш сервер nginx для обслуживания любых сайтов, написанных на PHP с производительностью, близкой к той, с которой работает модель mod_php в Apache, но при этом у вас будет больше свободной памяти, что позволит Вам обрабатывать больше запросов от посетитесей Ваших сайтов.
Как всегда, если у вас есть какие либо вопросы или пожелания, оставляйте их здесь в области для комментирования или отправляйте их почтой прямо ко мне. Если Вам понравилась эта статья, проголосуйте за нее на digg.com.
Related posts:
- Обзор Типичных Конфигураций Для Nginx
- Nginx – Маленький, Но Очень Мощный И Эффективный Web-Сервер
- Сбор Статиcтики О Работе Сервера nginx При Помощи rrdtool
- Варианты настройки Ruby On Rails на максимальную производительность: mongrel vs lighttpd vs nginx
- Использование Nginx Как Reverse-Proxy Сервера На Загруженных Сайтах

76 Responses to this entry
[...] Nginx With PHP As FastCGI Howto :: Homo-Adminus Blog by Alexey Kovyrin (tags: nginx php fastcgi performance web httpd deployment) [...]
[...] Nginx With PHP As FastCGI Howto (with fcgi-start script) [...]
[...] roughly followed these instructions, but with these [...]
Please respond to this comment by also CCing me. Because you don’t have other kind of subscription.
Thank you for posting this. But I think it is a bit complex.
1. What if I want to run PHP through nginx but without fastcgi (which is way too painful for anything beyond the basic PHP functionality).
2. Also, in my Apache the “DefaultType” is PHP. So I have many programs without a “.php” configuration. In your example config, you tell nginx to serve php files based on the file-extension (.php). Can I tell nginx to serve php files based on “Type” and not the “File Extension”?
Thanks!
[...] Reconfigure the server. Thinking Nginx, MySQL and FastCGI/PHP. [...]
[...] provided by the web server lighttpd. You can use PHP’s built-in FastCGI manager php-cgi to do the same thing, but it’s not as straight-forward. Plus, if you learn how to use spawn-fcgi, you can easily [...]
Уважаемые подскажите!
Скрипт запуска Fast CGI (который представлен в этой статье) – не полный, у него отсутствует нижняя часть!
Подскажите пожалуйста , где взять этот скрипт полностью?
Большое спасибо
[...] provided by the web server lighttpd. You can use PHP’s built-in FastCGI manager php-cgi to do the same thing, but it’s not as straight-forward. Plus, if you learn how to use spawn-fcgi, you can easily adapt [...]
Здравствуйте Алексей..
Если не затруднит, подскажите пожалуйста.. имеет-ли смысл играть с директивами буферизации (proxy_buffers, proxy_buffer_size) при проксировании на fastcgi.. ?
Заранее благодарю..
[...] nginx, потому что есть замечательная статья “Настройка Nginx для поддержки PHP при помощи FastCGI“, просто отмечу некоторые детали, упрощающие жизнь. [...]
[...] Alexei Kovyrin, who posted a nice nginx/PHP/FCGI howto. [...]
Здраствуйте, у меня к вам вопрос, я сделал всё как вы описали в этой статье, но почему то через некоторое время nginx выдает bad gateway, в качестве сревера стоит spawn-fcgi , такое ощущение что cgi сервер коннекты намеренно отбрасывает, перелопатил весь конфиг nginx но проблемы так и не решил
[...] configuré un script ejecutado cada vez que se arranca el sistema que se crean 7 procesos php en fastcgi a la espera que Nginx les pase algo por hacer. Dado que BlogHogwarts estaba en un VPS, tuve que [...]
hello do you know how to add 1 alias that will affect to all vhost?
If you want to use alias + fastcgi, you could add something like this into config:
location /gallery2-base/ {
alias /usr/share/gallery2/;
index index.php index.html index.htm;
}
location ~ /gallery2-base/.*\.php$ {
if ($fastcgi_script_name ~ /gallery2-base(/.*\.php)$) {
set $valid_fastcgi_script_name $1;
}
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /usr/share/gallery2$valid_fastcgi_script_name;
include /etc/nginx/fastcgi_params;
}
спасибо за статью.
очень полезно
Помогите передать бэкенду PHP заголовок запроса “If-Modified-Since”, спасибо за статью, но мало чем помогло в моем случае.
[...] host: "**************" ho compilato php con il supporto fastcgi poi ho seguito questa guida facendo partire lo script usando questo comando: [...]
Здравстуйте. У ngnix я заметил такой недостаток как то, что он делает буферизацию пост запросов, а в моих сайтах часто используюся аплоады прогресс бары и из – за этой буферизации скрипты полчуют в tmp уже полность загруженный файл, то есть поргресс бар стоит на нуле а птом сразу 100%
Есть ли у ngnix какая – нид возможность отключить будеризацию пост запросос и сразу направлять их php
Искренне рекомендую пользоваться swfupload
этот вариант только если в проекте допускаются флэшки. ЩАс пока у нас сделали так что к апачу можно пробиться вне ngnix по нестандартному порту и через него работаем с нашим аплоадером.
У нас обычно nginx проксирует запросы к нескольким монгрелам, поэтому отдельный порт не укажешь.
nginx 0.7.16, настроил rewrite – упорно отдаёт http://server/index.php?Login как octet-stream и нипочём не хочет прогнать его сквозь php
Само php работает…
Даже добавление
location ~ \(.*\) {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME трампампам$fastcgi_script_name;
include fastcgi_params;
}
не помогает
Может nginx принципиально прогоняет через php только один раз?
[...] Nginx With PHP As FastCGI Howto (with fcgi-start script) [...]
[...] Use the following script to start the PHP FastCGI processes, adapted from Nginx With PHP As FastCGI Howto: [...]
[...] php-cgi 直接创建 FCGI 服务,但无法成功,只好使用 lighttpd 的 spawn-fcgi 程序创建 FCGI 服务(这里偷懒用 [...]