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
Spodobał Ci się artykuł? Zapisz się do naszego Newslettera - ZERO SPAMu, same konkrety, oraz dostęp do dodatkowych materiałów przeznaczonych dla subskrybentów!
Na podany adres e-mail otrzymasz od nas wiadomość e-mail, w której znajdziesz link do potwierdzenia subskrypcji naszego Newslettera. Dzięki temu mamy pewność, że nikt nie dodał Twojego adresu przez przypadek. Jeśli wiadomość nie przyjdzie w ciągu najbliższej godziny (zazwyczaj jest to maksymalnie kilka minut) sprawdź folder SPAM.

Patryk

CEO WebInsider.pl, a do tego CTO, CIO, CFO, CMO, CSO, COO i CRO ;-)
Pasjonat nowych technologii - od sprzętu po oprogramowanie, od serwerów po smartfony i rozwiązania IoT. Potencjalnie kiepski bloger, bo nie robi zdjęć "talerza" zanim zacznie jeść.

Dumny przyjaciel swoich psów :-)
Napisz komentarz
wipl_napisz-komentarz_01
Jeśli informacje zawarte na tej stronie okazały się pomocne, możesz nam podziękować zostawiając poniżej swój komentarz.

W tej formie możesz również zadać dodatkowe pytania dotyczące wpisu, na które – w miarę możliwości – spróbujemy Ci odpowiedzieć.
Linki partnerskie
Niektóre z linków na tej stronie to tzw. „linki partnerskie”, co oznacza, że jeśli klikniesz na link i dokonasz wymaganej akcji (np. zakup/rejestracja) możemy otrzymać za to prowizję. Pamiętaj, że polecamy tylko te produkty i usługi, z których sami korzystamy, i uważamy, że są tego na prawdę warte… :-)
Znaki towarowe i nazwy marek
W niektórych wpisach (oraz innych miejscach na stronie) mogą być przedstawione/użyte znaki towarowe i/lub nazwy marek, które stanowią własność intelektualną tych podmiotów, a zostały użyte wyłącznie w celach informacyjnych.