
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.
Ostatnie odpowiedzi
1 rok 34 tygodnie temu
2 lata 24 tygodnie temu
2 lata 27 tygodni temu
2 lata 27 tygodni temu
2 lata 28 tygodni temu