OpCode.eu.org

Blog O autorze O serwisie
2020-07-03

Zapiski na temat konfiguracji nginx

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:

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

Tagi: debian