Crmgo Blog

Nginx i FastCG

Nginx i FastCG

Aby nie uruchamiać FastCGI za każdym razem z konsoli, stworzymy skrypt do uruchamiania demona FastCGI i wkleimy do niego następujący kod: *) echo "Usage: $0 {start|stop|restart}" esac Zapisujemy i wychodzimy. Teraz można uruchomić FCGI jako demona. Z powyższego kodu wynika, że serwer FastCGI będzie nasłuchiwał na 127.0.0.1…

Nginx i FastCG
статья от сюда
sudo pacman -S fcgi php-cgi

Aby nie uruchamiać FastCGI ciągle z konsoli, utworzymy skrypt do uruchamiania demona FastCGI.

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

i wklejamy do niego następujący kod:

#!/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 "Użycie: $0 {start|stop|restart}"
esac

 

Zapisujemy i wychodzimy. Teraz można uruchamiać FCGI jako demona.

 

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

 

Z powyższego kodu wynika, że serwer FastCGI będzie nasłuchiwał na adresie 127.0.0.1 porcie 9000. Dlatego konfigurujemy nginx tak, aby przekazywał (proxy) wszystkie żądania dotyczące skryptów właśnie tam, czyli wszystko oprócz plików statycznych. Otwieramy konfigurację nginx i wprowadzamy następujące zmiany: W zależności od tego, gdzie znajdują się Twoje skrypty, lokalizacje (location) będą różne. Pokażę przykład dla lokalizacji /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;
}

 

W dyrektywie location należy wskazać punkt wejścia względem dostępu z zewnątrz. Mówiąc inaczej, jeśli URL Twojej strony to syslinux.ru, to odpowiadająca mu lokalizacja będzie wyglądać następująco:

 

location / { root /srv/http;

 

Analogicznie, przy żądaniu syslinux.ru/forum konfiguracja wygląda tak:

 

location /forum { root /srv/http;

 

Innymi słowy, określając różne lokalizacje w konfiguracji, zarządzamy nimi i możemy utworzyć indywidualne ustawienia dla każdej z nich. Prawdopodobnie powyższą część konfiguracji można zapisać krócej, ale na razie nie mam wystarczającej wiedzy, aby to zrobić. Kluczowe momenty tej konfiguracji to:

 

location /forum {

 

Wskazuje URL, po przejściu na który zostanie wykonane poniższe reguły.

 

root /srv/http/;

 

Tutaj określa się mapowanie URL na system plików. Innymi słowy, ustawiany jest bezwzględna ścieżka do plików, które mają być dostarczone przez nginx po przejściu do katalogu głównego strony (syslinux.ru).

 

index index.html index.htm index.php;

 

Wskazuje typ MIME plików indeksowych. Jeśli ich nie ma, strona nie zostanie otwarta, nawet jeśli znajdują się w niej inne pliki różniące się od określonych.

 

location ~ \.php$ {

 

Wskazuje, że wszystkie skrypty .php z poniższego root /srv/http/forum będą przekazywane do FastCGI, którego ustawienia są podane poniżej.

 

fastcgi_pass 127.0.0.1:9000;

 

To właśnie jest linia wskazująca, gdzie przekazywać .php przy żądaniu syslinux.ru/forum. W naszym przypadku jest to FastCGI (w ustawieniach demona wskazaliśmy 127.0.0.1:9000). Aby przekazywać do Apache, należy odpowiednio skonfigurować Apache do nasłuchiwania na porcie 8080 i wpisać:

 

proxy_pass http://127.0.0.1:8080;

 

I wtedy wszystkie żądania przychodzące do /forum będą obsługiwane przez Apache.

 

fastcgi_param SCRIPT_FILENAME /srv/http$fastcgi_script_name;

 

Nie do końca się zorientowałem, ale jak zrozumiałem, wskazuje on na skrypt. U mnie działa to w następujący sposób. Co do plików indeksowych. Bardzo długo szukałem sposobu na włączenie listingu plików, gdy w katalogu nie ma index.php, html itp. Okazało się, że jest to bardzo proste – wszystko było w dokumentacji nginx, ale ponieważ nie było możliwe przeczytanie jej od razu w całości, szukałem w Google odpowiednika apache'owskiego +Indexes. W dyrektywie location dla docelowego katalogu wystarczy dodać

 

autoindex on;

 

Po tych wszystkich zabiegach można zrestartować nginx i uruchomić php-cgi

 

sudo /etc/rc.d/nginx restart

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

 

Wchodzimy przeglądarką na swój localhost i sprawdzamy, czy skrypty się wykonują. Działa? Świetnie!

 

Teraz o awstats.

 

Wszystko, co opisałem wyżej, skonfigurowałem dość szybko, ale przyłączenie awstats do pracy przez fcgi nie udawało mi się przez długi czas. Przez parę dni Apache służył mi wyłącznie do wyświetlania statystyk odwiedzin :) Aby to zrobić, będziemy potrzebować fcgiwrap z AUR oraz spawn-fcgi z tego samego źródła. Budujemy je, instalujemy i otwieramy skrypt uruchamiający demona fcgi-wrap

 

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

 

Edytujemy go, wskazując użytkownika i grupę, pod którymi będzie uruchamiany skrypt. (Użytkownik to ten sam, pod którym działa proces worker nginx, grupę można ustawić jako nobody lub taką samą jak użytkownik nginx) Wskazujemy IP i port do nasłuchiwania:

 

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

 

Następnie wchodzimy do konfiguracji nginx i wklejamy to: (tylko w ten sposób u mnie to zadziałało)

 

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/;
}

 

Ponieważ link do generowania raportu awstats wygląda następująco: http://localhost/awstats/awstats.pl?config=syslinux.ru, wskazujemy

 

location /awstats {

 

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

 

Wskazanie na katalog, w którym znajduje się sam skrypt analizatora logów (awstats.pl)

 

fastcgi_pass localhost:9001;

 

Analogia – wskazujemy, gdzie przekierować żądanie, w tym przypadku na nasz serwer FastCGI.

 

fastcgi_param SCRIPT_NAME /awstats.pl;

 

Wskazujemy nazwę skryptu, jak zrozumiałem, jest ona brana względem root (srv/http/awstats/cgi-bin). Przy wskazywaniu w inny sposób zawsze otrzymywałem błąd 404 lub 403, albo „input file not specified”

 

allow 127.0.0.1; deny all;

Uwaga: wpis mógł powstać z pomocą AI i redakcji. Odpowiedzialny: Dmytro Lomaka, Kaltenkirchen.