Crmgo Blog

Nginx & FastCG

Nginx & FastCG

Da ne biste stalno pokretali FastCGI iz konzole, kreirajte skriptu za pokretanje FastCGI demona i ubacite sledeći kod: ```bash echo "Usage: $0 {start|stop|restart}" esac ``` Sačuvajte i izađite. Sada možete pokrenuti FCGI kao demon. Iz ovog koda je jasno da će FastCGI server slušati na 127.0.0.1…

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

Da ne biste stalno pokretali FastCGI iz konzole, kreirajmo skriptu za pokretanje FastCGI demona

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

i ubacite sledeći 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 "Usage: $0 {start|stop|restart}"
esac

 

Sačuvajte i izađite. Sada možete pokrenuti FCGI kao demon.

 

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

 

Iz ovog koda je jasno da će FastCGI server slušati na 127.0.0.1 na portu 9000. Zato konfigurišite nginx tako da proxy-uje sve zahteve ka skriptama (sve osim statičkih fajlova) na tu adresu. Otvorite nginx konfiguraciju i unesite približno sledeće izmene: Zavisno od toga gde se nalaze vaše skripte, lokacije (location) će biti različite. Pokazaću primer za lokaciju /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;
}

 

U direktivi location treba navesti tačku ulaza u odnosu na spoljni pristup. Na primer, ako je URL vašeg sajta syslinux.ru, onda će odgovarajuća lokacija biti

 

location / { root /srv/http;

 

Slično, za zahtev syslinux.ru/forum, to bi izgledalo ovako:

 

location /forum { root /srv/http;

 

Dakle, navođenjem različitih lokacija u konfiguraciji upravljamo lokacijama i možemo kreirati individualne podešavanja za svaku od njih. Verovatno se gore navedeni deo konfiguracije može zapisati kraće, ali mi trenutno nedostaje znanja za to. Ključni delovi ove konfiguracije su:

 

location /forum {

 

Određuje URL na koji se prelazi i za koji se primenjuje sledeće pravilo.

 

root /srv/http/;

 

Ovde se određuje preslikavanje URL-a u fajl sistem. Drugim rečima, zadaje se apsolutni put do fajlova koje treba da posluži nginx prilikom pristupa root direktorijumu sajta. (syslinux.ru)

 

index index.html index.htm index.php;

 

Određuje MIME tip indeksnih fajlova. Ako oni ne postoje, stranica se neće otvoriti čak ni ako postoje drugi fajlovi koji nisu navedeni.

 

location ~ \.php$ {

 

Određuje da će svi .php skripti iz donjeg root /srv/http/forum biti proxy-ovani u FastCGI, čija su podešavanja data ispod.

 

fastcgi_pass 127.0.0.1:9000;

 

Zapravo, ovo je linija koja određuje kuda proxy-ovati .php fajlove pri zahtevu syslinux.ru/forum. U našem slučaju, to je FastCGI (u podešavanjima demona smo naveli 127.0.0.1:9000). Da biste proxy-ovali u Apache, morate odgovarajuće konfigurisati Apache da sluša na portu 8080 i dodati

 

proxy_pass http://127.0.0.1:8080;

 

I tada će svi zahtevi koji dolaze u /forum obrađivati Apache.

 

fastcgi_param SCRIPT_FILENAME /srv/http$fastcgi_script_name;

 

Nisam baš shvatio, ali kako sam razumeo, ukazuje na skriptu. Kod mene radi ovako. Usput, u vezi sa indeksnim fajlovima. Dugo sam tražio kako da omogućim listanje fajlova kada u direktorijumu nema index.php, .html itd. Ispostavilo se da je veoma jednostavno, sve je bilo u dokumentaciji nginx-a, ali pošto nije bilo moguće odmah pročitati celu dokumentaciju, guglao sam da li postoji ekvivalent Apache-ovom +Indexes. U direktivu location za ciljani direktorijum treba samo dodati

 

autoindex on;

 

Nakon svih ovih radnji, možete restartovati nginx i pokrenuti php-cgi

 

sudo /etc/rc.d/nginx restart

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

 

Ulazimo browserom na svoj localhost i proveravamo da li se skripte izvršavaju. Radi? Odlično!

 

Sada o awstats.

 

Sve što sam gore opisao, uspeo sam da podesim prilično brzo, ali sam dugo vremena pokušavao da povežem awstats za rad preko fcgi bez uspeha. Par dana Apache je kod mene postojao isključivo da bi prikazivao statistiku poseta :) Dakle, za ovo će nam biti potreban fcgiwrap iz AUR-a i spawn-fcgi iz istog izvora. Kompajliramo ih, instaliramo i otvaramo skriptu za pokretanje demona fcgi-wrap

 

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

 

Uređujemo je, navodeći korisnika i grupu pod kojima će se skripta pokretati. (Korisnik je isti onaj pod kojim radi worker proces nginx-a, grupu možete postaviti na nobody ili istu kao kod korisnika nginx-a) navodimo IP i port za slušanje:

 

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

 

Nakon toga idemo u nginx konfiguraciju i ubacujemo ovo: (samo na ovaj način je kod mene radilo)

 

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

 

Kako link za generisanje izveštaja awstats izgleda ovako: http://localhost/awstats/awstats.pl?config=syslinux.ru, navodimo

 

location /awstats {

 

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

 

Ukazivanje na direktorijum gde se konkretno nalazi sama skripta za analizu logova (awstats.pl)

 

fastcgi_pass localhost:9001;

 

Analogija - Ukazujemo gde da se prosledi zahtev, u ovom slučaju na naš FastCGI server.

 

fastcgi_param SCRIPT_NAME /awstats.pl;

 

Navodimo ime skripte, kako sam shvatio, ovde se uzima relativno u odnosu na root (srv/http/awstats/cgi-bin). Kada sam koristio drugi način, uvek bih dobijao grešku 404 ili 403, ili "input file not specified"

 

allow 127.0.0.1; deny all;

Napomena: tekst može biti uz pomoć AI uz ljudsku proveru. Odgovoran: Dmytro Lomaka, Kaltenkirchen.