Что-то я ковырялся, ковырялся в попытках прикрутить правильно 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.
Чтиво