Apache+PHP -> nginx+FastCGI

May 07, 2010 18:15


Что-то я ковырялся, ковырялся в попытках прикрутить правильно PHP к nginx через Apache. Но то PHP работает, то не работает rewrite…
Задача

Перейти с Apache и PHP на nginx, используя FastCGI - клиент-серверный протокол взаимодействия вебсервера и приложения. Причины: прокачка скиллов и повышение производительности.
Решение

Способ решения как всегда нагугливается по ключевым словам с добавлением «debian». Нашлась статья «Установка и настройка сервера nginx с поддержкой PHP в Debian/Ubuntu», в соответствии с которой всё удалось сделать.
Установка новых пакетов и пост-настройка

Доставил пакет php5-cgi, изменил настройки PHP. Читая ещё другую статью, поставил lighttpd. Он ставится с ошибками (порты заняты), но он и не нужен:

$ sudo /etc/init.d/lighttpd stop

$ sudo update-rc.d -f lighttpd remove

nginx уже установлен и работает, но из него необходимо инициировать подключения к lighttpd, из которого нужен только скрипт /usr/bin/spawn-fcgi.
Настройка и запуск FastCGI

В статье всё хорошо описано, но редактировать /etc/rc.local, имхо, совсем не debian way, как я уже говорил. Поэтому я воплотил мечту о написании собственного демона по всем канонам.

$ sudo cp /etc/init.d/skeleton /etc/init.d/fcgi

$ sudo vim /etc/init.d/fcgi

Я отредактировал /etc/init.d/fcgi таким образом:
PATH=/sbin:/usr/sbin:/bin:/usr/bin
DESC="PHP FCGI daemon"
NAME=spawn-fcgi
DAEMON=/usr/bin/$NAME
DAEMON_ARGS="-a 127.0.0.1 -p 8082 -u www-data -g www-data -f /usr/bin/php5-cgi -P /var/run/fastcgi-php.pid"
PIDFILE=/var/run/$NAME.pid
SCRIPTNAME=/etc/init.d/$NAME
...
#[ -r /etc/default/$NAME ] && . /etc/default/$NAME

Дал права на запуск:
$ sudo chmod a+x /etc/init.d/fcgi

В итоге запустил, как и все демоны, и всё - он заработал:
$ sudo /etc/init.d/fcgi start
spawn-fcgi: child spawned successfully: PID: 7663
(До|Пере)настройка nginx

Для конфигурирования web-сервера, висящего на 8080 я создал отельный файлик, вместо default - /etc/nginx/sites-available/cyberty. Вобщем, файл вышел таким:

server {
listen 8080;
server_name localhost;

access_log /var/log/nginx/cyberty.access.log;

location = /favicon.ico {
alias /usr/share/icons/Tango/16x16/status/info.png;
access_log off;
}

location / {
root /var/www;
index index.php index.html index.htm;

# рирайтинг для drupal
if (!-e $request_filename) {
rewrite ^/dpupal6/(.*)$ /drupal6/index.php?q=$1 last;
break;
}
}

location ~ \.php$ {
fastcgi_pass 127.0.0.1:8082;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /var/www$fastcgi_script_name;
include fastcgi_params;
fastcgi_param QUERY_STRING $query_string;
# POST
fastcgi_param REQUEST_METHOD $request_method;
fastcgi_param CONTENT_TYPE $content_type;
fastcgi_param CONTENT_LENGTH $content_length;
} }

Чтобы заработал мой «виртуалхост», нужно сделать симлинк (нет утилит, как у Apache: a2ensite, a2dissite):
$ sudo ln -s /etc/nginx/sites-available/cyberty /etc/nginx/sites-enabled/cyberty
Если в будущем нужно запретить виртуалхост, то симлинк просто удаляется:
$ sudo rm /etc/nginx/sites-enabled/cyberty

nginx запустился без проблем, и сайт стал летать: все проблемы с rewrite разрешились, картинки отдавались нормально (без 127.0.0.1 в URL). Нравится.

$ sudo /etc/init.d/nginx restart
Restarting nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
configuration file /etc/nginx/nginx.conf test is successful nginx.
Чтиво

programming, debian, design, software, web, linux

Previous post Next post
Up