Категорії
FreeBSD WWW

[nginx] php+cgi

Не так давно на рынок вышел конкурент apachenginx. Лёгкий, быстрый, но не так функционален. Многие форумы работают на нём, ибо требуется всего-то поддержка php+mysql. Поэтому тяжеловес apache отходит на задний план.

В этой статье поговорим о том, как установить nginx и добавить к нему поддержку phpcgi (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”

На самом деле начиная с версии php 5.3 в core есть поддержка fpm.

Залишити відповідь

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *

Домашняя страничка Andy
Записки молодого админа
Самостоятельная подготовка к Cisco CCNA
Самостоятельная подготовка к Cisco CCNP
Powered by Muff