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.