Tworzysz stronę internetową i potrzebujesz pomocy?

Wprawdzie kiedyś już pisałem o instalacji i konfiguracji webserwera Nginx, to dziś chciałbym jeszcze wrócić do tego tematu, i pokazać Wam jak usprawnić zarządzanie większą ilością domen za pomocą kilku dodatkowych współdzielonych plików konfiguracyjnych, które później wystarczy tylko aktywować dla danej domeny.

Nginx Snippets

Będzie to też w pewnym sensie nawiązanie m.in. do wpisu dotyczącego filtrowania adresów IP należących do Cloudflare, z tym, że wtedy tworzyliśmy dodatkowy plik konfiguracyjny automatycznie aktywny dla wszystkich domen:

/etc/nginx/conf.d/cloudflare.conf

Natomiast możemy do dodatkowych plików konfiguracyjnych przenieść również ustawienia, które możemy później dołączać do wybranych domen samodzielnie.

Pomysł na ten wpis pojawił się przy aktualizacji Nginx z wersji 1.2.* (Debian Wheezy) do wersji 1.6.* (Debian Jessie) na serwerze znajomego, na którym łącznie skonfigurowanych jest ponad 20 domen, dla których po aktualizacji ręcznie trzeba było zmieniać ustawienia PHP, ze względu na „biały ekran śmierci”.

A tak wystarczyłoby zmienić te ustawienia tylko w jednym pliku… ;-)

Konfiguracja domen w Nginx wydzielona do plików wspólnych

Przykładowa (stworzona na szybko, dla tego poradnika, więc celowo dość rozbudowana ;-)) konfiguracja domeny (vHosta) wraz z dodatkowymi ustawieniami m.in. dla WordPressa może wyglądać np. tak:

# www.domena -> domena
server {
server_name www.webinsider.pl;
return 301 $scheme:https://webinsider.pl$request_uri;
}

server {
listen   80;
listen   443 ssl;

ssl on;
ssl_certificate /etc/ssl/private/webinsider.pl/ssl.crt;
ssl_certificate_key /etc/ssl/private/webinsider.pl/ssl.key;

ssl_session_timeout 10m;
keepalive_timeout 60;
ssl_protocols TLSv1.1 TLSv1.2;
ssl_ciphers ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:ECDH+3DES:DH+3DES:RSA+AESGCM:RSA+AES:RSA+3DES:!aNULL:!MD5:!DSS;
ssl_prefer_server_ciphers on;

root /var/www/webinsider.pl/public_html/;
index index.html index.htm index.php;

server_name webinsider.pl *.webinsider.pl;

location /wp-admin {
auth_basic "STOP";
auth_basic_user_file /var/www/.passwords/.password_file01;
}

location ~* wp-config.php {
deny all;
}

location /wp-admin/admin-ajax.php {
allow all;
}

location ~* /(?:uploads|files)/.*\.php$ {
deny all;
}

location ~* /wp-content/.*\.php$ {
deny all;
}

location ~* /wp-includes/.*\.php$ {
deny all;
}

location ~* /(?:uploads|files|wp-content|wp-includes)/.*\.php$ {
deny all;
}

charset utf-8;

location = /favicon.ico {
log_not_found off;
access_log off;
}

location = /robots.txt {
allow all;
log_not_found off;
access_log off;
}

location ~ /\. {
deny all;
access_log off;
log_not_found off;
}

location ~* ^.+\.(ogg|ogv|svg|svgz|eot|otf|woff|mp4|ttf|rss|atom|jpg|jpeg|gif|png|ico|zip|tgz|gz|rar|bz2|doc|xls|exe|ppt|tar|mid|midi|wav|bmp|rtf)$ {
access_log off;    log_not_found off; expires max;
}

location / {
try_files $uri $uri/ /index.php?$args;
}

access_log /var/log/nginx/webinsider.pl_access.log;
error_log /var/log/nginx/webinsider.pl_error.log;


error_page 404 /404.html;

location ~ \.php$ {
try_files $uri =404;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass unix:/var/run/php5-fpm.sock;
fastcgi_index index.php;
# Nginx 1.2:
#include fastcgi_params;
# Nginx 1.6:
include fastcgi.conf;
}

}

A w przypadku wykorzystania plików wspólnych mogłaby wyglądać tak:

# www.domena -> domena
server {
server_name www.webinsider.pl;
return 301 $scheme:https://webinsider.pl$request_uri;
}

server {
listen   80;
listen   443 ssl;

ssl on;
ssl_certificate /etc/ssl/private/webinsider.pl/ssl.crt;
ssl_certificate_key /etc/ssl/private/webinsider.pl/ssl.key;

# ----- ssl-config -----
include global/ssl-config;
# ----- ssl-config -----

root /var/www/webinsider.pl/public_html/;
index index.html index.htm index.php;

server_name webinsider.pl *.webinsider.pl;

# ----- WordPress -----
include global/wordpress;
# ----- WordPress -----

# ----- Dodatkowe ustawienia globalne dla stron -----
include global/all-site;
# ----- Dodatkowe ustawienia globalne dla stron -----

location / {
try_files $uri $uri/ /index.php?$args;
}

access_log /var/log/nginx/webinsider.pl_access.log;
error_log /var/log/nginx/webinsider.pl_error.log;

error_page 404 /404.html;

# ----- Dodatkowe ustawienia globalne dla stron - PHP -----
include global/php;
# ----- Dodatkowe ustawienia globalne dla stron - PHP -----

}

Jak widać – zdecydowanie przejrzyściej, a dodatkowo ew. zmiana np. w ustawieniach dla PHP czy wspólnych dla wszystkich stron sprowadza się do edycji jednego, wspólnego pliku.

Zawartość tych plików mam nadzieję, że jest dla Was oczywista – po prostu jest to kod wyjęty z pliku konfiguracyjnego domeny, i przerzucony do oddzielnego pliku wczytywanego np. za pomocą takiego kodu:

# ----- Dodatkowe ustawienia globalne dla stron - PHP -----
include global/php;
# ----- Dodatkowe ustawienia globalne dla stron - PHP -----

A w pliku global/php (/etc/nginx/global/php) znajduje się np. taki kod:

location ~ \.php$ {
        try_files $uri =404;
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass unix:/var/run/php5-fpm.sock;
        fastcgi_index index.php;
        # Nginx 1.2:
        #include fastcgi_params;
        # Nginx 1.6:
        include fastcgi.conf;
 }

Czemu global a nie snippets

Warto może jeszcze wspomnieć o lokalizacji tych plików – na powyższych przykładach jest to lokalizacja:

/etc/nginx/global

Stąd ścieżka wykorzystana w pliku konfiguracyjnym domeny:

include global/nazwa-pliku;

Jest to jeszcze pozostałość z czasów Nginx 1.2 (tak się kiedyś uczyłem), obecnie (Nginx 1.6) instalator tworzy katalog „snippets”:

/etc/nginx/snippets

Teraz tu przechowywane są konfiguracyjne pliki współdzielone, a więc jeśli zdecydujecie się na przechowywanie plików w tym katalogu (w „global” też będą działać), to ich wczytywanie do konfiguracji będzie odbywać się za pomocą takiego kodu:

include snippets/nazwa-pliku.conf;

Konfiguracja demo

W przypadku Nginx w wersji 1.6+ już na dzień dobry w podanym powyżej katalogu macie 2 pliki do wykorzystania w konfiguracji swoich domen:

  • fastcgi-php.conf
  • snakeoil.conf

Pierwszy to przykładowe ustawienia dla PHP (fragment), drugi odpowiada za wczytanie plików przykładowego certyfikatu SSL (ścieżki do plików certyfikatu).

(!) Zgłoś błąd na stronie
Pomogłem? To może postawisz mi wirtualną kawę?
LUTy dla D-Cinelike (DJI Mini 3 Pro, DJI Avata, OSMO Pocket) od MiniFly
Wdrożenie Omnibusa w sklepie na WooCommerce
Jak (legalnie) latać dronem w Kategorii Otwartej
Kurs "WordPress: Pierwsze kroki" (na dobry początek)
Patryk
Kurs "WordPress: Pierwsze kroki" (bezpłatna lekcja)