Drupal 6.0 i nginx - konfiguracja i optymalizacja

Portret użytkownika bluszcz

Na samym wstępie zaznaczę, że jestem początkującym użytkownikiem drupala. Nie znam również PHP - swoją przygodę z tym językiem programowania skończyłem na wersji bodajże 4.0. Z racji tego faktu, za bardzo nie chciałem dotykać opcji konfiguracyjnych drupala, których do końca nie rozumiem - za to stwierdziłem, że pobawię się na warstwie serwera www. To króciutkie howto pokazuje również jak skonfigurować Drupal 6.0 tak, aby działał z nginx, małym i super szybkim serwerem www (jego zaletą wobec lighttp są chociażby uproszczone rewrite...).

Przy optymalizacji posiłkowałem się Firebug oraz YSlow (pluginy do Firefoksa).

Poczatkowa konfiguracja wyglądała następująco:

server {
        listen 80;
        server_name web-dev.pl www.web-dev.pl;
        access_log /var/log/nginx/web-dev.pl.access.log;
        error_log  /var/log/nginx/web-dev.pl.error.log;
        root    /chroots/web-dev.pl/home/web-dev/drupal;
        index  index.html index.htm index.php;

        location ~ \.php$ {
                include /etc/nginx/fastcgi_params;
                fastcgi_param   SCRIPT_FILENAME  /home/web-dev/drupal$fastcgi_script_name;
                fastcgi_pass    127.0.0.1:60080;
                fastcgi_index index.php;
        }
}

Jest to w miarę standardowa konfiguracja nginx dla site'ów php + fastcgi. W miarę, ponieważ jak widać Drupal został zainstalowany w środowisku chroot (ze względów bezpieczeństwa - nie ufam aplikacjom www).

Gdzieś w tle jest odpalony proces php5-cgi:

web-dev   17475  0.0  0.9  69208 19824 ?        S    09:48   0:00 php5-cgi -b 127.0.0.1:60080

do którego przekierowywane są żadania fastcgi.

Ok, zacząłem od dodania ładnych urli i włączeniu modułu path co wymagało ze strony nginx dodania jednego rewrite'a:

server {
        listen 80;
        server_name web-dev.pl www.web-dev.pl;
        access_log /var/log/nginx/web-dev.pl.access.log;
        error_log  /var/log/nginx/web-dev.pl.error.log;
        root    /chroots/web-dev.pl/home/web-dev/drupal;
        index  index.html index.htm index.php;
        location / {
                if (!-e $request_filename) {
                        rewrite  ^/(.*)$  /index.php?q=$1  last;
                        break;
            }
        }
        location ~ \.php$ {
                include /etc/nginx/fastcgi_params;
                fastcgi_param   SCRIPT_FILENAME  /home/web-dev/drupal$fastcgi_script_name;
                fastcgi_pass    127.0.0.1:60080;
                fastcgi_index index.php;
        }
}

Następnie przy użyciu Firebug i YSlow sprawdziłem ilość dociąganych plików statycznych wraz z ich wielkością. Praktycznie przy każdej odsłoenie wyglądało to następująco:

[img:1]

Sprawdziłem czy są ustawiane nagłówki Expires:

[img:2]

Jak widać - nie, więc postanowiłem je dodać (na maksymalne dla plików statycznych):

server {
        listen 80;
        server_name web-dev.pl www.web-dev.pl;
        access_log /var/log/nginx/web-dev.pl.access.log;
        error_log  /var/log/nginx/web-dev.pl.error.log;
        root    /chroots/web-dev.pl/home/web-dev/drupal;
        index  index.html index.htm index.php;
        location / {
                if (!-e $request_filename) {
                        rewrite  ^/(.*)$  /index.php?q=$1  last;
                        break;
            }
        }
        location ~ \.php$ {
                include /etc/nginx/fastcgi_params;
                fastcgi_param   SCRIPT_FILENAME  /home/web-dev/drupal$fastcgi_script_name;
                fastcgi_pass    127.0.0.1:60080;
                fastcgi_index index.php;
        }
        location ~* /files/.*\.(gif|jpg|jpeg|png|css)$ {
                expires max;
        }
        location /misc/feed.png {
                expires max;
        }
}

Jak możemy zaobserwować liczba ściąganych plików się zmiejszyła:

[img:3]

Finalnie postanowiłem włączyć kompresję gzip (w nginx trzeba podać dodatkowo dla typów ma się ona wykonywać, domyślnie jest to tylko text/html. W tym momencie konfiguracja ngxing wygląda następująco:

server {
        listen 80;
        server_name web-dev.pl www.web-dev.pl;
        access_log /var/log/nginx/web-dev.pl.access.log;
        error_log  /var/log/nginx/web-dev.pl.error.log;
        gzip on;
        gzip_comp_level 9;
        gzip_proxied any;
        gzip_types text/html image/png image/gif text/css       image/jpeg;
        root    /chroots/web-dev.pl/home/web-dev/drupal;
        index  index.html index.htm index.php;
        location / {
                if (!-e $request_filename) {
                        rewrite  ^/(.*)$  /index.php?q=$1  last;
                        break;
            }
        }
        location ~ \.php$ {
                include /etc/nginx/fastcgi_params;
                fastcgi_param   SCRIPT_FILENAME  /home/web-dev/drupal$fastcgi_script_name;
                fastcgi_pass    127.0.0.1:60080;
                fastcgi_index index.php;
        }
        location ~* /files/.*\.(gif|jpg|jpeg|png|css)$ {
                expires max;
        }
        location /misc/feed.png {
                expires max;
        }
}

Porównanie wczytania na czysto strony (po wyczyszczeniu cache przeglądarki):

bez gzip:

[img:4]

z gzip:

[img:5]

Zysk jak widać ogromny - z 58Kb na 22Kb.

Finalny wynik YSLow to A 98 punktów - całkiem nieźle, zaczynałem od D.

[img:6]

Oczywiście to początek optymalizacja - następnym razem przyjrzę się bazie danych oraz samemu php w kodzie.

Bookmark and Share