3

Nginx + (LiteSpeed + Nginx) = fajna zabawa :)

Opublikowane 18 marca. 2010 w Linux otagowane , , przez Ciacho
google-head

Zauważyłem, że serwer na którym stoi moja strona chodzi wolno, przez co według Google „Wczytanie strony w Twojej witrynie trwa średnio 10,3 s (aktualizacja: 14-03-2010). Trwa to dłużej niż w przypadku 93% witryn”.



Zmiana na lepsze…

W końcu podjąłem męską decyzję – zmieniam maszynę na ciut wydajniejszą i mniej obciążoną. Szybka instalacja VPS (nie lubię mieć dziwnych rzeczy uruchomionych w głównym systemie – wszystko mam w obrębie różnych wirtualnych serwerów), i staję przed dylematem – jaki serwer WWW? Wcześniej używałem LiteSpeed – fajny, lekki ale w wersji darmowej działa tylko na jednym rdzeniu (a na nowym mam cztery rdzenie, na starym dwa). Apache jest powolny (co prawda mocno rozbudowany, dający duże możliwości konfiguracyjne) – jednak nie dla mnie. Do wyboru pozostały dwie opcje Lighttpd oraz nginx. Lighttpd jest lepszym rozwiązaniem jeżeli mamy bardzo rozbudowane regułki mod_rewrite (Nginx nie obsługuje plików .htaccess), jednak jest „ciut” wolniejszy.

Przenosiny

Wybrałem nginx, szybko i prosto go zainstalowałem, skonfigurowałem, pobawiłem się opcjami i… czas przenieść stronę. Można to zrobić na szybko – przenieść dane i zmienić wpisy w DNS – jednak… Czas propagacji zmiany domeny może sięgnąć nawet 72godziny – przez ten czas niektóre osoby mogą widzieć starą stronę. Nie chcę/nie mogę pozwolić sobie na taką sytuację. Już myślałem jak rozwiązać ten problem – redirect, forwardowanie pakietów itd…

Dlaczego nginx jest (naj)lepszy?

Próbując wymyślić większe koło, przypomniałem sobie jeden z powodów dlaczego nginx jest lepszy od (znanych mi) serwerów WWW. Może być proxy dla dowolnie innego serwera WWW – w moim wypadku Litespeed.
Wystarczy zmienić adres IP w DNS, serwis (pliki, baza) zostaje narazie na starym serwerze i.. nikt nawet nie odczuje problemu. Osoby które będą miały „nieświeże” IP – dostaną content ze starego serwera, osoby ze „świeżym” mają content ze… starego serwera :)

W ten sposób ciacho.pl zyskało nowy serwer WWW:

Takie rozwiązanie już poprawiło (w moim odczuciu) prędkość ładowania się strony, jednak… czegoś mi brakowało. Skrypty php dostawały jako adres IP gościa, adres użyty w serwerze proxy. Niby nic, jednak nie podobało mi się to rozwiązanie…. Z pomocą przyszedł drugi nginx, odpalony obok Litespeed (na innym porcie) z obsługą FastCGI – który ze zmiennej $http_x_real_ip przenosi adres IP do $REMOTE_ADDR. Konfiguracja jest prosta:
Na serwerze proxy – ustawiamy prawdziwy adres IP gościa jako X-Real-IP:

1
2
3
4
5
6
7
location / {
        proxy_pass http://172.20.10.15:83/;
        proxy_redirect off;
        proxy_set_header Host ciacho.pl;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}

Na hoście docelowym, ze zmiennek X-Real-IP przekazujemy do REMOTE_ADDR:

1
2
3
4
5
6
7
8
location ~ \.php$ {
        fastcgi_pass   127.0.0.1:9002;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME $document_root/$fastcgi_script_name;
        fastcgi_intercept_errors on;
        include /etc/nginx/fastcgi_params;
        fastcgi_param REMOTE_ADDR $http_x_real_ip;
}

A co z Rewrite?

Nginx obsługuje rewrite, nawet ma większe opcje niż Apache (nie wiem jak jest w Lighttpd – nie używałem go), i według mnie jest łatwiejszy do konfiguracji.

Dla przykładu:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
<ifmodule mod_rewrite.c>
RewriteEngine on
RewriteCond %{HTTP_HOST} !^ciacho.pl
RewriteRule ^(.*)$ http://ciacho.pl/$1 [R=permanent,L]
</ifmodule>
 
# BEGIN Szeryf
<ifmodule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^XXXX/(.*)$ /1dcd5466f51dfb897dce/$1 [L]
</ifmodule>
# END Szeryf
 
<ifmodule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^/feed/$ http://feeds.feedburner.com/ciacho [R,L]
</ifmodule>
 
<ifmodule mod_rewrite.c>
RewriteEngine on
RewriteCond %{HTTP_USER_AGENT} !FeedBurner
RewriteRule ^index\.xml$ http://feeds.feedburner.com/ciacho [R,L]
</ifmodule>
 
# BEGIN WordPress
<ifmodule mod_rewrite.c>
RewriteEngine On
RewriteBase /
# STEALTH-LOGIN
RewriteRule ^wykrzycz /wp-login.php?action=logout&amp;_wpnonce=XXXXX8&stealth_out_key=XXXX [L]
RewriteRule ^zakrzycz /wp-login.php?stealth_in_key=XXX&redirect_to=http://ciacho.pl/wpc/wp-admin/ [R,L]
RewriteRule ^krzykacz /wp-admin/?stealth_admin_key=XXXX [R,L]
RewriteCond %{HTTP_REFERER} !^http://ciacho.pl/wp-admin
RewriteCond %{HTTP_REFERER} !^http://ciacho.pl/wp-login\.php
RewriteCond %{HTTP_REFERER} !^http://ciacho.pl/login
RewriteCond %{HTTP_REFERER} !^http://ciacho.pl/admin
RewriteCond %{QUERY_STRING} !^stealth_in_key=XXXX
RewriteCond %{QUERY_STRING} !^stealth_out_key=XXXX
RewriteCond %{QUERY_STRING} !^stealth_reg_key=XXXX
RewriteCond %{QUERY_STRING} !^stealth_admin_key=XXXX
RewriteRule ^wp-login\.php http://ciacho.pl/wpc [L]
RewriteCond %{QUERY_STRING} ^loggedout=true
RewriteRule ^wp-login\.php http://ciacho.pl/wpc [L]
 
# END STEALTH-LOGIN
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</ifmodule>

Rewrite dla nginx wygląda następująco:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
location / {
        if (-e $request_filename) {
                break;
        }
        rewrite ^/4280067ece3c58a92766/(.*)$ //1dcd5466f51dfb897dce/$1 last;
        if (  $http_user_agent !~ FeedBurner ) {
                rewrite ^/index\.xml$ http://feeds.feedburner.com/ciacho last;
                rewrite ^/feed http://feeds.feedburner.com/ciacho last;
                rewrite ^/comments/feed/(.*)$ /http://feeds.feedburner.com/ciacho-komentarze last;
        }
 
        rewrite ^/wykrzycz /wp-login.php?action=logout&amp;_wpnonce=XXXXX8&stealth_out_key=XXXX last;
        rewrite ^/zakrzycz /wp-login.php?stealth_in_key=XXX&redirect_to=http://ciacho.pl/wpc/wp-admin/  permanent;
        rewrite ^/krzykacz /wp-admin/?stealth_admin_key=XXXX permanent;
        rewrite ^(.+)$ /index.php?q=$1 last;
}

Powyższe ustawienie działają dla pluginu stealth login.

Pogrzebałem sobie i co dalej

Teraz pozostaje mi poczekać – za tydzień przeniosę fizycznie pliki ze starego serwera na nowy. Przez ten czas spróbuję się pobawić opcjami proxy, i oczywiście czekam na nowy „raport” z Google – jak bardzo powolna jest moja strona ;)

REKLAMA

Komentarzy: 3 na razie.

  1. Gravatar
    Piotr pisze:

    Witam, chciałem zapytać z jakiego hostingu korzystasz ?

  2. [...] reklama Ciacho przed chwilą Zmiana serwera www z #litespeed na #nginx proxy i nginx jako content. ciacho.pl/…x-litespeed-nginx-fajna-z… [...]

Zostaw komentarz





Powiadom mnie o odpowiedziach
CommentLuv badge

Pamiętaj: Na mojej stronie działa system cachowania oraz filtr antyspamowy. Twój komentarz może się pojawić na stronie z pewnym opóźnieniem - cierpliwości.
Pod postami dyskutujemy tylko o ich stronie merytorycznej. Jeśli zauważycie jakiś błąd na stronie, zgłoś ten fakt za pomocą formularza. Avatary pochodzą z serwisu Gravatar.