Замена Apache. Nginx и FastCGI

Совсем недавно я писал о том как заставить работать связку Apache+Nginx.  Там все немного проще из-за того что backend’ом выступал многим знакомый Apache с его mod_php .htaccess и прочими радостями. Принципиально не хочу сравнивать Apache и Nginx, так как у каждого на этот счет свои соображения. И разжигать холивар я не хочу. Моя цель максимально доступно описать установку и настройку сабжа. Итак, что нам понадобится для того чтобы полностью выкинуть индейца? (О том как поставить и более менее настроить сам nginx я писал тут) Устанавливаем нужные пакеты:

sudo pacman -S fcgi php-cgi

Чтобы постоянно не запускать FastCGI из консоли создадим скрипт для запуска демона FastCGI

sudo 'ваш любимый текстовый редактор' /etc/rc.d/php-cgi

и вставляем туда следующий код

#!/bin/bash
. /etc/rc.conf
. /etc/rc.d/functions
case "$1" in
start)
stat_busy 'Starting Fastcgi Server'
if /usr/bin/php-cgi -b 127.0.0.1:9000 &
then
add_daemon fastcgi
stat_done
else
stat_fail
fi
;;
stop)
stat_busy 'Stopping Fastcgi Server'
[ -e /var/run/daemons/fastcgi ] && kill $(pidof php-cgi) &> /dev/null;
if [ $? -gt 0 ]; then
stat_fail
else
rm_daemon fastcgi
stat_done
fi
;;
restart)
$0 stop
$0 start
;; 
*) echo "Usage: $0 {start|stop|restart}"
esac

Сохраняем,выходим. Теперь можно запускать FCGI демоном.


sudo /etc/rc.d/php-cgi start|stop|restart

Из данного кода понятно что FastCGI сервер будет слушать 127.0.0.1 на порту 9000. И поэтому настраиваем nginx так, чтобы он проксировал именно туда все запросы на скрипты, вобщем все кроме статики. Открываем конфиг nginx и вносим примерно такие изменения: В зависимости от того где у вас лежат скрипты — location’s будут разные. Покажу пример на location /forum {


}
location /forum { limit_conn one 10; limit_rate_after 1m; proxy_redirect off; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; client_max_body_size 10m; client_body_buffer_size 128k; proxy_connect_timeout 90; proxy_send_timeout 90; proxy_read_timeout 90; proxy_buffer_size 4k; proxy_buffers 4 32k; proxy_busy_buffers_size 64k; proxy_temp_file_write_size 64k; root /srv/http/;
index index.html index.htm index.php;
location ~ .php$ { root /srv/http/forum; fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME /srv/http$fastcgi_script_name; fastcgi_param QUERY_STRING $query_string; fastcgi_buffers 8 16K; include fastcgi_params;
}

 В директиве location надо указать точку входа относительно доступа извне так сказать. Тобишь если URL вашего сайта syslinux.ru то соответствующий ему location будет


location / { root /srv/http;

Аналогично при запросе syslinux.ru/forum так:


location /forum { root /srv/http;

Другими словами при указании разных location в конфиге мы рулим локэйшенами и можем создать индивидуальные настройки для каждой из них. Наверняка вышеприведенную часть конфига можно записать и короче, но у меня пока на это не хватает знаний. Ключевые моменты этого конфига :


location /forum {

Указывает на URL при переходе на который будет выполняться нижеследующее правило.


root /srv/http/;

Здесь указывается соответствие URL файловой системе. Другими словами задается абсолютный путь до файлов которые требуется отдать nginx’y при переходе в корневой каталог сайта. (syslinux.ru)


index index.html index.htm index.php;

Указывает на mime тип индексных файлов, при отсутствии которых страница открываться не будет даже при наличии в ней любых отличных от заданных файлов.


location ~ .php$ {

Указывает на то что все скрипты .php из нижеуказанного root /srv/http/forum будут проксироваться в FastCGI настройки которого приведены ниже.


fastcgi_pass 127.0.0.1:9000;

Собственно это и есть строка которая указывает куда проксировать .php при запросе syslinux.ru/forum , в нашем случае это FastCGI (в настройках демона мы указали 127.0.0.1:9000) Для проксирования в Апач надо соответственно настроить Апач на прослушку порта 8080 и прописать


proxy_pass ;

И тогда все запросы приходящие в /forum будет обрабатывать Apache.


fastcgi_param SCRIPT_FILENAME /srv/http$fastcgi_script_name;

Не очень разобрался но как я понял указывает на скрипт. У меня работает так. Кстати насчет индексных файлов. Очень долго искал как же разрешить листинг файлов при отсутствии в директории index.php *html .. etc. Оказалось конечно очень просто, все было в документации nginx, но так как сразу всю ее прочитать не представлялось возможным гуглил по предмету наличия аналога апачевскому +Indexes. В директиву location целевой директории нужно всего лишь добавить


autoindex on;

После всех этих телодвижений можно перезапустить nginx и стартануть php-cgi


sudo /etc/rc.d/nginx restart
sudo /etc/rc.d/php-cgi start

Заходим браузером в свой localhost и проверяем выполняются ли скрипты. Работает? Замечательно!

Теперь о awstats.

Все что описал выше я завел довольно быстро, но вот прикрутить awstats для работы через fcgi мне долгое время не удавалось. Пару дней Апач у меня существовал чисто для того чтобы отображать статистику посещения 🙂 Итак для этого нам потребуется fcgiwrap из AUR и spawn-fcgi оттуда же. Собираем их, устанавливаем и открываем скрипт для запуска демона fcgi-wrap


sudo 'ваш любимый текстовый редактор' /etc/conf.d/fcgiwrap

Редактируем его, указываем пользователя и группу от которых будет запускаться скрипт. (Пользователь тот — от которого работает worker процесс nginx, группу можно nobody или такую же как у пользователя nginx) указываем IP и порт для прослушки:

# Address and port to bind to
ADDRESS="127.0.0.1"
PORT="9001"

После чего лезем в конфиг nginx и вставляем это: (только так у меня и заработало)

location /awstats { root /srv/http/awstats/cgi-bin; fastcgi_pass localhost:9001; fastcgi_index index.php; fastcgi_param SCRIPT_NAME /awstats.pl; fastcgi_param QUERY_STRING $query_string; fastcgi_param REQUEST_METHOD $request_method; fastcgi_param CONTENT_TYPE $content_type; fastcgi_param CONTENT_LENGTH $content_length; include fastcgi_params; allow 127.0.0.1; deny all; } 
location /awstatsclasses/ {
alias /srv/http/awstats/classes/;
}
location /awstatscss/ {
alias /srv/http/awstats/css/;
}
location /awstatsicons/ {
alias /srv/http/awstats/icon/;
}

 Так как ссылка на генерацию отчета awstats выглядит таки образом :http://localhost/awstats/awstats.pl?config=syslinux.ru, то указываем


location /awstats {

root /path/to/yourserverroot/awstats/cgi-bin;

Указание на директорию где конкретно лежит сам скрипт анализатора логов (awstats.pl)


fastcgi_pass localhost:9001;

Аналогия — Указываем куда проксировать запрос, в данном случае в наш FastCGI сервер.


fastcgi_param SCRIPT_NAME /awstats.pl;

Указываем имя скрипта, как я понял тут он берется относительно root (srv/http/awstats/cgi-bin) При указании другим способом я всегда получал 404 либо 403 ошибку, либо «input file not specified»


allow 127.0.0.1; deny all;

Прячем стату от гостей извне, доступ только с локал хоста (не обязательно, вы можете и открыть доступ) Все остальное это alias’ы Которые нужны для того чтоб awstats подхватил иконки прогрессбары и прочие красивости которые лежат в директории awstats. Ну вот собственно и все.

Оцените статью