Совсем недавно я писал о том как заставить работать связку 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. Ну вот собственно и все.