Nginx + PHP-FastCGI или избавляемся от apache
В предыдущем шаге мы уже убрали apache слушать только локальные запросы (те которые приходят от nginx) теперь же пришло время убрать его совсем и заставить nginx обрабатывать все самому!
Для этого понадобится php5-cgi, если он еще не установлен, необходимо поставить:
1 | sudo apt-get install php5-cgi |
Для запуска php потребуется утилита spawn-fcgi от lighttpd. Сейчас она идёт как отдельный проект и расположена по адресу http://redmine.lighttpd.net/projects/spawn-fcgi. Можно получить последнюю версию оттуда, а можно воспользоваться советом отсюда и взять её из lighttpd:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | mkdir ~/sources cd ~/sources # возможно будет уже и более свежая версия wget http://www.lighttpd.net/download/lighttpd-1.4.19.tar.bz2 tar jxvf lighttpd-1.4.19.tar.bz2 # необходимые пакеты для установочного скрипта sudo apt-get install libpcre3-dev libbz2-dev cd lighttpd-1.4.19 # здесь может возникнуть ошибка, но и тут же предлагается решение - # конфигурировать с параметром --without-zlib ./configure --without-zlib make sudo cp src/spawn-fcgi /usr/bin/spawn-fcgi # И удалим за собой ненужныеболее файлы cd ~/ rm -Rf sources/ |
Таким образом, или взяв отдельный пакет, но spawn-fcgi у нас получился установлен. Теперь необходимо все это дело запускать. Сделаем скрипт, который будет устанавливать дополнительные управляющие переменные и запускать php5-cgi:
1 | sudo vim /usr/bin/php-fastcgi |
и вставляем:
1 2 3 4 5 6 | #!/bin/sh # сколько процессов запускать PHP_FCGI_CHILDREN=3 # через сколько обработанных запросов перезапускать экземпляр PHP_FCGI_MAX_REQUESTS=1000 exec /usr/bin/php5-cgi |
Скрипт для запуска php5-cgi готов, теперь нам нужен скрипт, для запуска spawn-fcgi, который будет дергать уже наш скрипт для установки переменных и запуска php5-cgi:
1 | sudo vim /etc/init.d/init-fastcgi |
и вставляем сюда:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | #!/bin/bash PHP_SCRIPT="/usr/bin/spawn-fcgi -a 127.0.0.1 -p 9000 -u www-data -g www-data -f /usr/bin/php-fastcgi" RETVAL=0 case "$1" in start) $PHP_SCRIPT RETVAL=$? ;; stop) killall -9 php5-cgi RETVAL=$? ;; restart) killall -9 php5-cgi $PHP_SCRIPT RETVAL=$? ;; *) echo "Usage: sudo /etc/init.d/init-fastcgi {start|stop|restart}" exit 1 ;; esac exit $RETVAL |
Осталось только сделать оба новых скрипта доступных для запуска:
1 2 | sudo chmod 755 /usr/bin/php-fastcgi sudo chmod 755 /etc/init.d/init-fastcgi |
Теперь можно попробовать запустить наш FastCGI:
1 2 3 | sudo /etc/init.d/init-fastcgi start # В ответ должно получится примерно следующее: spawn-fcgi.c.197: child spawned successfully: PID: 16428 |
Осталось только добавит наш скрипт в автозагрузку:
1 | sudo update-rc.d init-fastcgi defaults |
Теперь надо подправить все конфиги, что бы nginx обрабатывал PHP сам, а не передавал их на apache. У меня в конфиге
1 | sudo vim /etc/nginx/sites-available/svdev.ru |
получилось примерно следующее:
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 | server { listen 80; server_name www.svdev.ru; # здесь при заходе на www.svdev.ru происходит редирект на svdev.ru rewrite ^(.*) http://svdev.ru$1 permanent; } server { listen 80; server_name svdev.ru; error_log /var/www/svdev.ru/logs/error.log warn; access_log /dev/null; root /var/www/svdev.ru/htdocs; charset utf-8; # страницы с ошибками, вместо стандартных, путь указывается от root (выше) error_page 404 /error/404.html; error_page 403 /error/403.html; error_page 500 /error/500.html; location ~ .*(gif|jpg|jpeg|png|ico|css|swf|js|html|htm)$ { } # Для wordpess - это директория с upload и по умолчанию получится # что залив php скрипт можно будет выполнить его по прямой ссылке location ~ wp-content/uploads/.*\.php { } location ~ \.php$ { include /etc/nginx/fastcgi_params; fastcgi_param SCRIPT_FILENAME /var/www/svdev.ru/htdocs$fastcgi_script_name; fastcgi_param QUERY_STRING $query_string; fastcgi_pass 127.0.0.1:9000; # Директива определяет что ответы FastCGI-сервера с кодом больше или равные 400 # перенаправлять на обработку nginx'у с помощью директивы error_page fastcgi_intercept_errors on; break; } location / { fastcgi_index index.php; fastcgi_pass 127.0.0.1:9000; fastcgi_param SCRIPT_FILENAME /var/www/svdev.ru/htdocs$fastcgi_script_name; fastcgi_param QUERY_STRING $query_string; include /etc/nginx/fastcgi_params; fastcgi_intercept_errors on; } } |
и на этом можно пока остановиться. Теперь apache можно окончательно удалить с сервера.
1 | sudo apt-get remove apache2 |
Ноябрь 4th, 2009 at 14:56
И насколько существенный прирост производительности при php+fastcgi+nginx?
Ноябрь 22nd, 2009 at 18:19
Именно на каком то проекте не проверял как до и после.
Но есть один проект работающих в связке php + fastCGI + Memcached