Не так давно на рынок вышел конкурент apache: nginx. Лёгкий, быстрый, но не так функционален. Многие форумы работают на нём, ибо требуется всего-то поддержка php+mysql. Поэтому тяжеловес apache отходит на задний план.
В этой статье поговорим о том, как установить nginx и добавить к нему поддержку php, cgi (perl).
1) Установка и начальная настройка.
Идём в порты и ставим:
#cd /usr/ports/www/nginx && make install clean
После этого идём в каталого с конфигом /usr/local/etc/nginx и приводим файл nginx.conf к такому виду:
user www www;
worker_processes 1;
error_log /var/log/nginx/error.log info;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
access_log /var/log/nginx/access.log main;
sendfile on;
keepalive_timeout 65;
gzip on;
server {
listen 10.0.3.132:80;
server_name localhost;
charset koi8-r;
location / {
root /usr/local/www/nginx;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/local/www/nginx-dist;
}
}
}
Этого вполне достаточно, что бы завести web-сервер. Остальные параметры можно посмотреть в мане или в конфиге-примере в той же директории.
Для запуска добавляем такую строку в /etc/rc.conf:
nginx_enable="YES"
, собственно запускаем и смотрим sockstat:
router2#/usr/local/etc/rc.d/nginx start
Performing sanity check on nginx configuration:
the configuration file /usr/local/etc/nginx/nginx.conf syntax is ok
configuration file /usr/local/etc/nginx/nginx.conf test is successful
Starting nginx.
router2# sockstat | grep nginx
www nginx 13925 7 stream -> ??
www nginx 13925 8 tcp4 10.0.3.132:80 *:*
www perl5.8.9 13789 3 stream /var/run/nginx-fcgi/nginx-fcgi.sock
root nginx 39606 6 stream -> ??
root nginx 39606 7 stream -> ??
root nginx 39606 8 tcp4 10.0.3.132:80 *:*
откуда видим, что всё ок.
2) Поддержка php.
Сам nginx не имеет встроенной поддержки php. Но, Nginx включает в себя поддержку технологииFastCGI для работы с внешними серверами и утилитами. PHP тоже поддерживает FastCGI и может быть использован для обработки FastCGI-запросов от nginx. Поэтому, будем использовать FastCGI-сервер, например, lighttpd. Идём в порты и ставим его:
#cd /usr/ports/www/lighttpd && make install clean
После установки отредактируем конфиг. В секции server.modules раскомментируем строку“mod_fastcgi”. Остальные параметры по желанию. Добавим строку запускаspawn_fcgi_enable=”YES” (обратите внимание, что не lighttpd!!!) в /etc/rc.conf и запустим его:
#/usr/local/etc/rc.d/spawn-fcgi start
Проверим работу (по дефолту он слушает 9000-порт):
router2# sockstat | grep 9000
www php-cgi 37548 0 tcp4 10.0.3.132:9000 *:*
www php-cgi 37547 0 tcp4 10.0.3.132:9000 *:*
www php-cgi 37546 0 tcp4 10.0.3.132:9000 *:*
www php-cgi 37545 0 tcp4 10.0.3.132:9000 *:*
www php-cgi 37544 0 tcp4 10.0.3.132:9000 *:*
www php-cgi 37543 0 tcp4 10.0.3.132:9000 *:*
Теперь важно понять как происходит обработка php-скриптов: nginx передаёт на выполнение скрипт lihttpd’y, тот выполняет и результат возвращает обратно.
Опишем это в конфиге nginx’a. Для этого в секцию server добавим такое:
location ~ \.php$ {
fastcgi_pass 10.0.3.132:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /usr/local/www/nginx$fastcgi_script_name;
include fastcgi_params;
}
а так же это
location / {
root /usr/local/www/nginx;
index index.html index.htm;
}
на это:
location / {
root /usr/local/www/nginx;
index index.php index.html index.htm;
}
то есть доабвим index.php.
После этого перечитываем конфиг nginx’a и наслаждаемся работой php.
3) Поддержка cgi(perl).
К сожалению мне так и не удалось заставить обрабатывать cgi-сценарии через lighttpd. Хотя, он по описанию умеет это делать. Поэтому, я пошёл другим путём. Нашёл в инете проэкт nginx-fcgi с помощью которого можно реализовать поддержку cgi. На самом сайте всё хорошо описано. Но для тех, кто не знает английский или кому нужно разжевать, приведу перевод со вставками.
И так, качаем с сайта саму программу (перловский скрипт) nginx-fcgi-0.4.3. Он с расширением txt! Скачаем его, сменил на расширение .pl и поместим в директорию /usr/loca/sbin. Для запуска скрипта требуются некоторые библиотеки. У меня не хватало 2-ух: FCGI, IO::All. Поставить их можно так:
#perl -MCPAN -e shell
cpan> install FCGI
cpan> IO::All
Если не хватает ещё как-то – поставить их можно будет аналогичным образом.
Теперь добавляем в nginx.conf поддержку cgi:
location ~ ^/cgi-bin/.*\.cgi$
{
fastcgi_pass unix:/var/run/nginx-fcgi/nginx-fcgi.sock;
fastcgi_read_timeout 5m;
fastcgi_index index.cgi;
fastcgi_param SCRIPT_FILENAME /usr/local/www$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;
fastcgi_param GATEWAY_INTERFACE CGI/1.1;
fastcgi_param SERVER_SOFTWARE nginx;
fastcgi_param SCRIPT_NAME $fastcgi_script_name;
fastcgi_param REQUEST_URI $request_uri;
fastcgi_param DOCUMENT_URI $document_uri;
fastcgi_param DOCUMENT_ROOT $document_root;
fastcgi_param SERVER_PROTOCOL $server_protocol;
fastcgi_param REMOTE_ADDR $remote_addr;
fastcgi_param REMOTE_PORT $remote_port;
fastcgi_param SERVER_ADDR $server_addr;
fastcgi_param SERVER_PORT $server_port;
fastcgi_param SERVER_NAME $server_name;
}
Скрипт будет запускаться от юзера www, создавать сокет в папке /var/run/nginx-fcgi, поэтому создадим директорию /var/run/nginx-fcgi и сделаем владельцем www. Далее, я создал стартовый скрипт для запуска nginx-fcgi (его нужно сделать исполняемым (chmod +x nginx-fastcgi) и положить в папку /usr/local/etc/rc.d):
router2# cat nginx-fastcgi
#!/bin/sh
#
#
# PROVIDE: nginx-fastcgi
# REQUIRE: DAEMON nginx
# KEYWORD: shutdown
sudo -u www /usr/local/sbin/nginx-fcgi.pl -l /var/log/nginx/nginx-fcgi.log -pid /var/run/nginx-fcgi/nginx-fcgi.pid -S /var/run/nginx-fcgi/nginx-fcgi.sock
Собственно, перечитываем конфиг nginx и запускаем nginx-fastcgi:
router2# /usr/local/etc/rc.d/nginx reload
Performing sanity check on nginx configuration:
the configuration file /usr/local/etc/nginx/nginx.conf syntax is ok
configuration file /usr/local/etc/nginx/nginx.conf test is successful
router2#/usr/local/etc/rc.d/nginx-fcgi
router2# sockstat | grep nginx-fcgi
www perl5.8.9 13789 3 stream /var/run/nginx-fcgi/nginx-fcgi.sock
Теперь можно пробовать выполнять скрипты.
2 коментарі “[nginx] php+cgi”
В портах есть:
fcgiwrap-1.0.3_3 Simple FastCGI wrapper for CGI scripts
со скриптом запуска, а в портах php уже есть php-fpm FastCGI сервер.
На самом деле начиная с версии php 5.3 в core есть поддержка fpm.