Własny format logu
Domyślnie nginx nie umieszcza w logu informacji na temat nagłówka Host:
z żądania HTTP.
Można to zmienić tworząc np. plik /etc/nginx/conf.d/log_with_host.conf
z następującą zawartością:
log_format combined_with_host '$remote_addr - $remote_user [$time_local] "$request" "Host: $http_host" '
'$status $body_bytes_sent "$http_referer" "$http_user_agent"';
i umieszczając w konfiguracji poszczególnych vhostów:
access_log /var/log/nginx/access.log combined_with_host;
Słuchanie na IPv4 i IPv6
Ngix wymaga innych ustawień listen
dla pierwszego (domyślnego) vhosta i innych dla kolejnych.
Konfiguracja domyślnego vhosta (np. /etc/nginx/sites-enabled/00-default
) może wyglądać np. następująco:
server {
listen 80 default_server;
listen [::]:80 default_server ipv6only=on;
listen 443 ssl default_server;
listen [::]:443 ssl default_server ipv6only=on;
server_name NAZWA_DOMENOWA;
rewrite ^(.*)$ $scheme://www.NAZWA_DOMENOWA$1 permanent;
access_log /var/log/nginx/access.log combined_with_host;
ssl_certificate /etc/letsencrypt/live/NAZWA_DOMENOWA/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/NAZWA_DOMENOWA/privkey.pem;
}
Vhost ten obsługuje wszystkie adresy związane z naszym serwerem (nie skonfigurowane w innych vhostach) po HTTP i HTTPS, a jego podstawowym adresem jest NAZWA_DOMENOWA
.
Dla każdego zapytania, które do niego trafi wysyła on redirect http przekierowujący na analogiczny URL w www.NAZWA_DOMENOWA
.
Należy zwrócić uwagę 4 linie listen
związane z konfiguracją słuchania na IPv4 i IPv6 na HTTP i HTTPS.
W kolejnych vhostach konfiguracja adresów na których słuchają może być już dużo prostsza i ograniczać się do:
listen 80;
listen [::]:80;
listen 443;
listen [::]:443;
W przypadku HTTPS konieczne jest także użycie dyrektyw ssl_certificate
i ssl_certificate_key
.
Współdzielenie konfiguracji pomiędzy vhostami
Jak już można zauważyć, w wielu wypadkach co najmniej kilka takich samych linii musi być powielane w konfiguracji każdego vhost'a.
Można wyeliminować konieczność ich kopiowania i poprawić czytelność konfigów umieszczając je w wydzielonym pliku (np. /etc/nginx/default-vhost.conf
) i włączac je do konfiguracji vhosta poprzez dyrektywę:
include default-vhost.conf;
Zamieszczam przykład takiego współdzielonego konfigu. Oprócz konfiguracji słuchania i certyfikatów SSL odpowiada on m.in. za:
- usuwanie podwójnych ukośników oraz nazw plików index.html i index.xhtml z URLi
- konfigurację domyślnego kodowania i typów mime dla poszczególnych rozszerzeń i nazw plików
- wysyłanie XHTML jako HTML dla wybranych przeglądarek
Przykładowy vhost może mieć wtedy konfigurację:
server {
include default-vhost.conf;
server_name www.NAZWA_DOMENOWA;
root /path/to;
# konfiguracja specyficzna dla vhost'a
}
Wymuszenie typu tekstowego (text/plain)
Może się zdarzyć że dla niektórych lokalizacji wszystkie pliki w nich umieszczone chcemy wysyłać jako pliki tekstowe.
Możemy to łatwo uzyskać tworząc np. plik /etc/nginx/all-as-text.conf
z następująca zawartością:
default_type "text/plain; charset=utf-8";
types {
"text/plain; charset=utf-8" *;
}
i używając go w sposób następujący (pliki z /konfigi/
będa wysyłane jako tekst):
location ~ ^/konfigi/.*$ {
include all-as-text.conf;
}
Natomiast jeżeli chcemy nadpisanie typu ograniczyć tylko do pewnego podzbioru plików (żeby np. nie wysyłać obrazków jako "text/plain") /etc/nginx/all-as-text.conf
może wyglądać następująco:
default_type "text/plain; charset=utf-8";
types {
"text/plain; charset=utf-8" html htm shtml css xml xhtml js atom rss json h c h++ hpp hxx hh c++ cpp cxx cc sh py php lua mk cmake tex ltx sty cls md markdown diff patch conf ini;
}
PHP
Nginx może korzystać z PHP jako fastcgi, wymaga to zainstalowania i uruchomienia php-fpm oraz np. następującego wpisu w konfiguracji:
location ~ .php$ {
fastcgi_split_path_info ^(.+\.php)(.*)$;
fastcgi_pass unix:/var/run/php/php7.3-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /var/www$fastcgi_script_name;
include fastcgi_params;
fastcgi_param QUERY_STRING $query_string;
fastcgi_param REQUEST_METHOD $request_method;
fastcgi_param CONTENT_TYPE $content_type;
fastcgi_param CONTENT_LENGTH $content_length;
fastcgi_intercept_errors on;
fastcgi_ignore_client_abort off;
fastcgi_connect_timeout 60;
fastcgi_send_timeout 180;
fastcgi_read_timeout 180;
fastcgi_buffer_size 128k;
fastcgi_buffers 4 256k;
fastcgi_busy_buffers_size 256k;
fastcgi_temp_file_write_size 256k;
}
Inne
- automatyczny indeks katalogu:
autoindex on;
np. w ramachlocation
określającego dany katalog - zabronienie dostępu do wybranych plików:
deny all;
np. w ramachlocation
określającego regexp dla nazwy plików - własna strona błędu:
error_page 404 /404.html;
(błąd 404 spowoduje wyświetlenie zawartości/404.html
z kodem 404) - autoryzacja http
auth_basic "Restricted"; auth_basic_user_file /etc/nginx/htpasswd;
np. w ramachlocation
określającego dany katalog, plik z hasłami obsługiwany apachowymhtpasswd
- przekierowania
rewrite ^/katalog(/.*)?$ http://INNA_STRONA$1;
(z zachowaniem częsci URLa) lubrewrite ^/katalog(/.*)?$ http://INNA_STRONA/inny/url
(wiele URLi na tą samą lokalizację)