Crmgo Блог

Nginx & FastCG

Nginx & FastCG

Чтобы постоянно не запускать FastCGI из консоли создадим скрипт для запуска демона FastCGI и вставляем туда следующий код *) echo "Usage: $0 {start|stop|restart}" esac Сохраняем,выходим. Теперь можно запускать FCGI демоном. Из данного кода понятно что FastCGI сервер будет слушать 127.0.0.1…

Nginx & FastCG
статья от сюда
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 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;

Примечание: материал мог быть создан с помощью ИИ и затем отредактирован человеком. Ответственный: Dmytro Lomaka, Kaltenkirchen.