Kohana 3 i Nginx (konfiguracja)

Kohana 3 i Nginx (konfiguracja)

Written by sbl

Topics: Kohana 3, Linux

Bardzo dobrym rozwiązaniem jest serwer HTTP zwany nginx, który cieszy się bardzo dużą popularnością wśród osób ceniących profesjonalizm i niezawodność. Charakteryzuje się on dużo większą wydajnością niż popularny Apache.

Ale nie o tym mowa w tym wpisie, opiszę krótko szybką instalację nginx + php + mysql na serwerze z systemem Debian/Linux.

Nginx wraz z Kohaną może stanowić doskonałe połączenie skutkujące stabilnością i szybkością działania. Sami przekonacie się, jakie są rezultaty zmiany Apache na Nginx :)

1. Instalacja środowiska (nginx + php z fast_cgi + mysql):

aptitude install php5-cgi php5-mysql php5-curl php5-gd php5-idn php-pear php5-imagick php5-imap php5-mcrypt php5-memcache php5-common php5-ming php5-pspell php5-recode php5-snmp php5-sqlite php5-tidy php5-xmlrpc php5-xsl php5-cli spawn-fcgi nginx -y

2. Tworzenie katalogów stron i logów dla naszej domeny:

mkdir -p /var/www/domena.pl/public_html /var/www/domena.pl/logs
Tworzymy plik virtualhosta dla nginx z użyciem wybranego edytora (ja użyłem vim):
sudo vim /etc/nginx/sites-available/domena.pl
Wrzucamy tam przygotowany przez nas plik hosta (pamiętaj aby zamienić użytą przeze mnie domenę i ścieżki do strony):
server {
	# główna sekcja, konfiguracja portu nasłuchującego
	# nazwa domeny oraz logi dostępu i błędów.
    listen   80;
    server_name domena.pl www.domena.pl;
    access_log /var/www/domena.pl/logs/access.log;
    error_log /var/www/domena.pl/logs/error.log;

    location / {
        root   /var/www/domena/public_html; # ścieżka do katalogu publicznego naszej strony
        index  index.html index.php; # ustawienie indeksów
		try_files $uri index.php;

		# wykluczenie z rewrite istniejących plików i katalogów
        if (-f $request_filename) { break;}
        if (-d $request_filename) { break;}

		# główny rewrite, przekierowujący wszystko na index.php
		rewrite ^(.+)$ /index.php?kohana_uri=$1 last;
    }

	# zablokowanie dostępu do katalogów frameworka
    location ~* ^/(modules|application|system) {
		return 403;
    }

	# konfiguracja obsługi PHP na FastCGI
    location ~ \.php$ {
        include /etc/nginx/fastcgi_params;
        fastcgi_pass  127.0.0.1:9000;
        fastcgi_index index.php;
        fastcgi_param  SCRIPT_FILENAME  /var/www/domena.pl/public_html$fastcgi_script_name;
	include	fastcgi_params;
    }

	# blokada wyświetlania plików .htaccess .htapasswd itd.
    location ~ /\.ht {
	deny all;
    }

}
Włączamy wirtualnego hosta za pomocą dowiązania symbolicznego:
ln -s /etc/nginx/sites-available/domena.pl /etc/nginx/sites-enabled/domena.pl

3. Tworzymy obsługę PHP FastCGI przez specjalny skrypt.

vim /usr/bin/php-fastcgi

Wklejamy do niego następujący kod:

#!/bin/sh
/usr/bin/spawn-fcgi -a 127.0.0.1 -p 9000 -C 6 -u www-data -f /usr/bin/php5-cgi

Oraz nadajemy mu prawa wykonywania:

chmod +x /usr/bin/php-fastcgi

Tworzenie skryptu rozruchowego dla fastcgi

vim /etc/init.d/php-fastcgi

W którym umieszczamy następującą zawartość:

#!/bin/bash
PHP_SCRIPT=/usr/bin/php-fastcgi
FASTCGI_USER=www-data
RETVAL=0
case "$1" in
start)
su - $FASTCGI_USER -c $PHP_SCRIPT
RETVAL=$?
;;
stop)
killall -9 php5-cgi
RETVAL=$?
;;
restart)
killall -9 php5-cgi
su - $FASTCGI_USER -c $PHP_SCRIPT
RETVAL=$?
;;
*)
echo "Usage: php-fastcgi {start|stop|restart}"
exit 1
;;
esac
exit $RETVAL
Nadajemy mu prawa wykonywania i uruchamiamy fast cgi
chmod 755 /etc/init.d/php-fastcgi
/etc/init.d/php-fastcgi start

4. Instalacja serwera baz danych MySQL

aptitude install mysql-server mysql-client

Podczas instalacji, zostaniemy poproszeni u ustanowienie hasła dla głównego konta „root”, nie zapomnijcie go ;)

Teraz możemy zainstalować jakiś soft do graficznej obsługi MySQL np, phpmyadmin:

aptitude install phpmyadmin

I dokonać dowiązania symbolicznego do naszej domeny:

ln -s /usr/share/phpmyadmin /var/www/domena.pl/public_html/phpmyadmin

Gotowe. Należy teraz w katalogu strony, umieścić framework i cieszyć się jego działaniem ;)

W razie problemów, proszę pisać w komentarzach.

  • jarek

    IfIsEvil, użyj try_files.

  • sbl

    Użyłem try_files jeśli nie widzisz :) w 12 linijce vhosta.

  • jarek

    Widzę – ale z tego wynika że niepotrzebnie stosujesz tego potworka:
    if (-f $request_filename) { break;}
    Aby nie być gołosłownym: http://wiki.nginx.org/IfIsEvil
    Try_files już sprawdza czy dany plik/katalog istnieje. Na twoim miejscu nawet wywaliłbym tego rewrite na końcu i zrobił coś takiego:
    try_files $uri $uri/ index.php?kohana_uri=$uri ;

  • sbl

    Testowałem Twoje rozwiązania i niestety nie działa :) jak usunę moje potworki, wszystko przesyła na routing nawet statyczne pliki pomimo try_files.
    A try_files $uri $uri/ index.php?kohana_uri=$uri; zupełnie nie działa. Więc musi być rewrite na dole.

  • jarek

    Taka uwaga – napisz w artykule o ktorą wersję nginxa chodzi bo bywało dośc sporo zmian między wersjami.
    „wszystko przesyła na routing nawet statyczne pliki pomimo try_files.”
    „try_files – Checks for the existence of files in order, and returns the first file that is found.”
    Soa#1 + doczytaj dokumentację. Coś jest źle że nginx nie widzi tego statycznego pliku (zobacz w logach, nieprawidłowy root?).
    „try_files $uri $uri/ index.php?kohana_uri=$uri; zupełnie nie działa.”
    U mnie działa produkcyjnie + nawet coś takiego jest w przykładach zastosowania tej dyrektywy dla Drupala (chyba że kohana potrzebuje czegoś specyficznego). Ew. napisz co nie działa – czy nie przekazują się parametry itd.?

  • http://twitter.com/lukaszce Łukasz Ce

    Zapraszam do komentowania. Zainstalowałem nowy system komentarzy, tamte wbudowane w WordPress niestety się usunęły.

  • http://www.facebook.com/franek Marcin Franek

    sbl nie podlinkował :<