Замена 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 http://127.0.0.1:8080;
И тогда все запросы приходящие в /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 restartsudo /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. Ну вот собственно и все.
Комментарии
42 недели 6 дней назад
1 год 5 недель назад
1 год 5 недель назад
1 год 5 недель назад
1 год 10 недель назад
1 год 26 недель назад
1 год 40 недель назад
2 года 30 недель назад
2 года 32 недели назад
2 года 42 недели назад