Różnice pomiędzy wersjami 1 i 7 (Spinanie 6 wersji)
⇤ ← Wersja 1 z 2014-11-28 00:12:29 →
Rozmiar: 938
Edytor: wtps0n
Komentarz: *** KREACJA ***
← Wersja 7 z 2018-06-16 17:10:51 → ⇥
Rozmiar: 10456
Edytor: wtps0n
Komentarz: + cgi, http auth, aktualizacje
Usunięcia zostały oznaczone w ten sposób. Dodatki zostały oznaczone w ten sposób.
Linia 4: Linia 4:
<<TableOfContents()>> <<BR>> <<TableOfContents()>><<Navigation(children)>> <<BR>>
Linia 9: Linia 9:
Zgodnie z sugestiami [[https://calomel.org/freebsd_network_tuning.html|Calomel.org|target="_blank"]] warto włączyć następujące moduły:
{{{
Zgodnie z sugestiami [[https://calomel.org/freebsd_network_tuning.html|calomel.org|target="_blank"]] warto włączyć następujące moduły:
{{{#!highlight bash numbers=off
Linia 17: Linia 17:
Opcji jest bardzo dużo. Na dzień '''18.05.2018''' zostały wybrane następujące:
{{{#!highlight make numbers=off
OPTIONS_FILE_SET+=DSO
OPTIONS_FILE_SET+=FILE_AIO
OPTIONS_FILE_SET+=IPV6
OPTIONS_FILE_SET+=THREADS
OPTIONS_FILE_SET+=WWW
OPTIONS_FILE_SET+=HTTP
OPTIONS_FILE_SET+=HTTP_CACHE
OPTIONS_FILE_SET+=HTTP_GZIP_STATIC
OPTIONS_FILE_SET+=HTTP_REWRITE
OPTIONS_FILE_SET+=HTTP_SLICE
OPTIONS_FILE_SET+=HTTP_SSL
OPTIONS_FILE_SET+=HTTP_STATUS
OPTIONS_FILE_SET+=HTTPV2
OPTIONS_FILE_SET+=STREAM
OPTIONS_FILE_SET+=STREAM_SSL
OPTIONS_FILE_SET+=STREAM_SSL_PREREAD
OPTIONS_FILE_SET+=BROTLI
OPTIONS_FILE_SET+=HTTP_ACCEPT_LANGUAGE
OPTIONS_FILE_SET+=HTTP_AUTH_DIGEST
OPTIONS_FILE_SET+=HTTP_AUTH_LDAP
OPTIONS_FILE_SET+=HTTP_AUTH_PAM
OPTIONS_FILE_SET+=HTTP_JSON_STATUS
OPTIONS_FILE_SET+=HTTP_UPLOAD
OPTIONS_FILE_SET+=HTTP_UPLOAD_PROGRESS
}}}
Linia 20: Linia 46:
PHP (lang/php) powinno mieć wybrane następujące opcje:
{{{
[x] CLI Build CLI version
[x] FPM Build FPM version
[x] FPM_IPV6 Enable ipv6 patch for FPM
[x] IPV6 Enable ipv6 support
[x] LINKTHR Link thread lib (for threaded extensions)
}}}
Została opisana w [[KonfiguracjaPhp|oddzielnej dokumentacji]].

= Konfiguracja nginx.conf =

Konfiguracja `nginx.conf` może być "''rozbita''" na wiele plików i poprzez mechanizm ''include'' dołączanana do głównego pliku konfiguracyjnego.

Inną dobrą zaletą konfiguracji jest możliwość ''wyciągnięcia'' wspólnych ustawień dla wszystkich serwerów wirtualnych do sekcji '''http''' (np. ustawienia dla szyfrowania HTTPS). Dzięki temu konfiguracja znacznie się upraszcza, jak również jest możliwe dość szybko zmienić ustawiania "globalnie".

== Sekcja globalna ==
(Nazwa na wyrost :-) ). Ustawienia globalne, to głównie dołączenie zewnętrznych modułów (plików umieszczonych w katalogu `/usr/local/libexec/nginx/`):

{{{#!highlight nginx numbers=off
# --- ustawienia globalne ---------------------------------------------------
#
user www;
worker_processes 4;

# --- za/l/adowanie potrzebnych modu/l/ow ----
#
load_module "/usr/local/libexec/nginx/ngx_http_brotli_filter_module.so";
load_module "/usr/local/libexec/nginx/ngx_http_brotli_static_module.so";

error_log /var/log/nginx/global/error.log;
pid /var/run/nginx.pid;

events {
    worker_connections 1024;
}

}}}

== Konfiguracja protkołu HTTP(S) ==
Ustawienia dla protokołu http(s). Wspólne i globalne dla każdego serwera wirtualnego:

{{{#!highlight nginx numbers=off
http {
    include mime.types;
    default_type application/octet-stream;

    log_format main '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log /var/log/nginx/global/access.log main;

    server_tokens off;
    charset utf-8;
    source_charset utf-8;
    aio on;
    sendfile off;
    #tcp_nopush on;
    lingering_time 10s;
    max_ranges 0;
    output_buffers 2 128k;
    postpone_output 0;
    reset_timedout_connection on;
    send_timeout 10s;

    keepalive_timeout 0;
    #keepalive_timeout 65;

    brotli on;
    brotli_static on;
    brotli_types text/css text/javascript text/mathml text/plain text/xml application/x-javascript application/atom+xml application/rss+xml application/xhtml+xml image/svg+xml;

    gzip off;
    gzip_static on;
    gzip_buffers 256 8k;
    gzip_comp_level 9;
    gzip_http_version 1.0;
    gzip_min_length 0;
    gzip_types text/css text/javascript text/mathml text/plain text/xml application/x-javascript application/atom+xml application/rss+xml application/xhtml+xml image/svg+xml;
    gzip_vary on;
    gzip_disable "MSIE [1-6]\.(?!.*SV1)";

    ssl_ciphers 'EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH';
    ssl_ecdh_curve secp521r1:secp384r1;
    ssl_prefer_server_ciphers on;
    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout 5m;
    ssl_protocols TLSv1.2 TLSv1.1 TLSv1;
}}}

=== Konfiguracja przekierowania do https ===
{{{#!highlight nginx numbers=off
server {
    listen 10.2.2.XXX:80;
    server_name www.mojadomena.pl;
        location / {
            return 301 https://$server_name$request_uri;
        }
        location /pma/ {
            return 301 https://mgt.mojadomena.pl/pma/;
        }
        include 014-acmele.conf;
        include 005-x-frame.conf;
}
}}}

=== Konfiguracja serwera HTTPS ===
Poniżej konfiguracja samego serwera https. Od razu dołączana jest konfiguracja dla obsługi certyfikatów [[LetsEncrypt|Let's Encrypt]]:
{{{#!highlight nginx numbers=off
server {
    listen 10.2.2.239:443 ssl;
    server_name crm.limesmp.pl;

    ssl_certificate certs/www.mojadomena.pl.chained.pem;
    ssl_certificate_key certs/www.mojadomena.pl.key;
    ssl_dhparam certs/www.mojadomena.pl.2048.dh.pem;

    # dla paneli, kt/ore maj/a by/c pomini/ete przez wyszukiwarki
    add_header X-Robots-Tag none;

    add_header X-Content-Type-Options nosniff;
    add_header X-XSS-Protection "1; mode=block";
    add_header Strict-Transport-Security "max-age=15768000; includeSubDomains; preload";
    add_header Public-Key-Pins 'pin-sha256="VZRoSKCpoY3HzxId7gGq25lX0sITzskJGKuwqDt/Sq8="; pin-sha256="kvC0r0fZ885Ojc2JkQLC8bFvZutAx5w2DgvVsE8LlMo="; max-age=2592000; includeSubdomains';
    ### add_header Content-Security-Policy-Report-Only "upgrade-insecure-requests; default-src https:; form-action https:; script-src 'self' 'unsafe-eval' 'unsafe-inline'; img-src 'self'; style-src 'self' 'unsafe-inline' font-src 'self' object-src 'none'; report-uri /cgi-bin/csp-report.cgi"

    # logowanie
    access_log /var/log/nginx/www.mojadomena.pl/access.log main;
    error_log /var/log/nginx/www.mojadomena.pl/error.log;

    root /var/www/htdocs/virtuls/crm.limesmp.pl/web;
    index app.php;

    location / {
        try_files $uri $uri/ /app.php$is_args$args;
    }

    # obs/luga Let's Encrypt dla protoko/lu bez szyfrowania
    location /.well-known/ {}

    location /pma/ {
        return 301 https://ev.ath.pl/pma/;
    }

    error_page 404 /50x.html;
    # redirect server error pages to the static page /50x.html
    #
    error_page 500 502 503 504 /50x.html;
    location = /50x.html {
        root /usr/local/www/nginx-dist;
    }

    # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
    #
    location ~ \.php$ {
        fastcgi_pass unix:/var/run/phph-fpm.socket;
        fastcgi_param HTTPS on;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;

    }

    # deny access to .htaccess files, if Apache's document root
    # concurs with nginx's one
    #
    location ~ /\.ht {
        deny all;
    }
        include 000-cmsploit.conf;
        include 004-pillaging-dvcs.conf;
        include 005-x-frame.conf;
}
}}}

== Konfiguracja wspólne ==
Poniżej konfiguracje, które zostały umieszczone w [[UniMaster|repozytorium skryptów]]:

=== Obsługa plików .ht* ===
{{{#!highlight nginx numbers=off
    # deny access to .htaccess files, if Apache's document root
    # concurs with nginx's one
    #
    location ~ /\.ht {
        deny all;
    }
}}}

=== Obsługa PHP-FPM ===
To jest do przemyślenia. Bo może to być jednak mocno zależne od konkretnej aplikacji. Niemniej dość generyczne ustawienia powinno być poprawne:
{{{#!highlight nginx numbers=off
    # pass the PHP scripts to FastCGI server via unix socket
    #
    location ~ \.php$ {
        fastcgi_pass unix:/var/run/phph-fpm.socket;
        fastcgi_param HTTPS on;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }

    # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
    #
    location ~ \.php$ {
        root html;
        fastcgi_pass 127.0.0.5:9000;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
        include fastcgi_params;
    }
}}}

=== Obsługa CGI ===
Obsługa skryptów CGI jest bardzo prosta. Należy zainstalować oraz uruchomić [[FcgiWrap|fcgiwrap]].W konfiguracji `nginx` należy wykonać konfigurację:
{{{#!highlight nginx numbers=off
        location ~ \.cgi$ {
            try_files $uri =404;
            gzip off;
            #rewrite ^/cgi-bin/nagios/(.*)$ /nagios/$1;
            fastcgi_pass unix:/var/run/fcgiwrap/fcgiwrap.sock;
            include fastcgi_params;
            fastcgi_param SCRIPT_FILENAME $request_filename;
            fastcgi_param REMOTE_USER $remote_user;
        }
}}}

=== Nagłówki bezpieczeństwa dla HTTPS ===
{{{#!highlight nginx numbers=off
    add_header X-Content-Type-Options nosniff;
    add_header X-XSS-Protection "1; mode=block";
    add_header Strict-Transport-Security "max-age=15768000; includeSubDomains; preload";
}}}

=== http auth ===
Domyślnie nie ma żadnych ograniczeń dla danego zasobu (''location''). Niemniej można go ograniczać poprzez ACLki (adresy IP) oraz autentykację użytkownika. W tym celu należy wykonać konfigurację (na przykładzie konfiguracji dla [[FreshPorts:net-mgmt/nagios3|net-mgmt/nagios3]]):
{{{#!highlight nginx numbers=off
    location /nagios/ {
        alias /usr/local/www/nagios/;
        index index.php;
        satisfy any;
        allow 10.0.0.0/8;
        allow 127.0.0.4;
        deny all;

        auth_basic "Special Area";
        auth_basic_user_file /var/www/authdb/auth.db;
    }
}}}
Linia 31: Linia 289:
 * https://calomel.org/nginx.html
 * https://calomel.org/freebsd_network_tuning.html
 * https://pyd.io/freebsd-nginx-php-fpm/
 * http://www.defcon1.org/html/nginx.html
 * [[https://calomel.org/nginx.html||target="_blank"]]
 * [[https://calomel.org/freebsd_network_tuning.html||target="_blank"]]
 * [[https://pyd.io/freebsd-nginx-php-fpm/||target="_blank"]]
 * [[http://www.defcon1.org/html/nginx.html||target="_blank"]]
Linia 37: Linia 295:
{i} A jak coś nie jest jasne, to napisz do administratora. {i} ` `<<GetVal(SlownikNewBsd,adm-podpis)>>


Instalacja oraz konfiguracja nginx

/boot/loader.conf

Zgodnie z sugestiami calomel.org warto włączyć następujące moduły:

aio_load="YES"
accf_data_load="YES"
accf_http_load="YES"

Opcje konfiguracyjne

Opcji jest bardzo dużo. Na dzień 18.05.2018 zostały wybrane następujące:

OPTIONS_FILE_SET+=DSO
OPTIONS_FILE_SET+=FILE_AIO
OPTIONS_FILE_SET+=IPV6
OPTIONS_FILE_SET+=THREADS
OPTIONS_FILE_SET+=WWW
OPTIONS_FILE_SET+=HTTP
OPTIONS_FILE_SET+=HTTP_CACHE
OPTIONS_FILE_SET+=HTTP_GZIP_STATIC
OPTIONS_FILE_SET+=HTTP_REWRITE
OPTIONS_FILE_SET+=HTTP_SLICE
OPTIONS_FILE_SET+=HTTP_SSL
OPTIONS_FILE_SET+=HTTP_STATUS
OPTIONS_FILE_SET+=HTTPV2
OPTIONS_FILE_SET+=STREAM
OPTIONS_FILE_SET+=STREAM_SSL
OPTIONS_FILE_SET+=STREAM_SSL_PREREAD
OPTIONS_FILE_SET+=BROTLI
OPTIONS_FILE_SET+=HTTP_ACCEPT_LANGUAGE
OPTIONS_FILE_SET+=HTTP_AUTH_DIGEST
OPTIONS_FILE_SET+=HTTP_AUTH_LDAP
OPTIONS_FILE_SET+=HTTP_AUTH_PAM
OPTIONS_FILE_SET+=HTTP_JSON_STATUS
OPTIONS_FILE_SET+=HTTP_UPLOAD
OPTIONS_FILE_SET+=HTTP_UPLOAD_PROGRESS

Obsługa PHP

Została opisana w oddzielnej dokumentacji.

Konfiguracja nginx.conf

Konfiguracja nginx.conf może być "rozbita" na wiele plików i poprzez mechanizm include dołączanana do głównego pliku konfiguracyjnego.

Inną dobrą zaletą konfiguracji jest możliwość wyciągnięcia wspólnych ustawień dla wszystkich serwerów wirtualnych do sekcji http (np. ustawienia dla szyfrowania HTTPS). Dzięki temu konfiguracja znacznie się upraszcza, jak również jest możliwe dość szybko zmienić ustawiania "globalnie".

Sekcja globalna

(Nazwa na wyrost :-) ). Ustawienia globalne, to głównie dołączenie zewnętrznych modułów (plików umieszczonych w katalogu /usr/local/libexec/nginx/):

# --- ustawienia globalne ---------------------------------------------------
#
user  www;
worker_processes  4;

# --- za/l/adowanie potrzebnych modu/l/ow ----
#
load_module "/usr/local/libexec/nginx/ngx_http_brotli_filter_module.so";
load_module "/usr/local/libexec/nginx/ngx_http_brotli_static_module.so";

error_log  /var/log/nginx/global/error.log;
pid        /var/run/nginx.pid;

events {
    worker_connections  1024;
}

Konfiguracja protkołu HTTP(S)

Ustawienia dla protokołu http(s). Wspólne i globalne dla każdego serwera wirtualnego:

http {
    include       mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/global/access.log  main;

    server_tokens off;
    charset  utf-8;
    source_charset  utf-8;
    aio on;
    sendfile        off;
    #tcp_nopush     on;
    lingering_time        10s;
    max_ranges            0;
    output_buffers        2 128k;
    postpone_output       0;
    reset_timedout_connection on;
    send_timeout          10s;

    keepalive_timeout  0;
    #keepalive_timeout  65;

    brotli on;
    brotli_static on;
    brotli_types text/css text/javascript text/mathml text/plain text/xml application/x-javascript application/atom+xml application/rss+xml application/xhtml+xml image/svg+xml;

    gzip  off;
    gzip_static on;
    gzip_buffers      256 8k;
    gzip_comp_level   9;
    gzip_http_version 1.0;
    gzip_min_length   0;
    gzip_types        text/css text/javascript text/mathml text/plain text/xml application/x-javascript application/atom+xml application/rss+xml application/xhtml+xml image/svg+xml;
    gzip_vary         on;
    gzip_disable      "MSIE [1-6]\.(?!.*SV1)";

    ssl_ciphers 'EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH';
    ssl_ecdh_curve secp521r1:secp384r1;
    ssl_prefer_server_ciphers on;
    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout  5m;
    ssl_protocols TLSv1.2 TLSv1.1 TLSv1;

Konfiguracja przekierowania do https

server {
    listen       10.2.2.XXX:80;
    server_name  www.mojadomena.pl;
        location / {
            return 301 https://$server_name$request_uri;
        }
        location /pma/ {
            return 301 https://mgt.mojadomena.pl/pma/;
        }
        include 014-acmele.conf;
        include 005-x-frame.conf;
}

Konfiguracja serwera HTTPS

Poniżej konfiguracja samego serwera https. Od razu dołączana jest konfiguracja dla obsługi certyfikatów Let's Encrypt:

server {
    listen       10.2.2.239:443 ssl;
    server_name  crm.limesmp.pl;

    ssl_certificate      certs/www.mojadomena.pl.chained.pem;
    ssl_certificate_key  certs/www.mojadomena.pl.key;
    ssl_dhparam          certs/www.mojadomena.pl.2048.dh.pem;

    # dla paneli, kt/ore maj/a by/c pomini/ete przez wyszukiwarki
    add_header X-Robots-Tag none;

    add_header X-Content-Type-Options nosniff;
    add_header X-XSS-Protection "1; mode=block";
    add_header Strict-Transport-Security "max-age=15768000; includeSubDomains; preload";
    add_header Public-Key-Pins 'pin-sha256="VZRoSKCpoY3HzxId7gGq25lX0sITzskJGKuwqDt/Sq8="; pin-sha256="kvC0r0fZ885Ojc2JkQLC8bFvZutAx5w2DgvVsE8LlMo="; max-age=2592000; includeSubdomains';
    ### add_header Content-Security-Policy-Report-Only "upgrade-insecure-requests; default-src https:; form-action https:; script-src 'self' 'unsafe-eval' 'unsafe-inline'; img-src 'self'; style-src 'self' 'unsafe-inline' font-src 'self' object-src 'none'; report-uri /cgi-bin/csp-report.cgi"

    # logowanie
    access_log /var/log/nginx/www.mojadomena.pl/access.log main;
    error_log /var/log/nginx/www.mojadomena.pl/error.log;

    root /var/www/htdocs/virtuls/crm.limesmp.pl/web;
    index  app.php;

    location / {
        try_files $uri $uri/ /app.php$is_args$args;
    }

    # obs/luga Let's Encrypt dla protoko/lu bez szyfrowania
    location /.well-known/ {}

    location /pma/ {
        return 301 https://ev.ath.pl/pma/;
    }

    error_page  404              /50x.html;
    # redirect server error pages to the static page /50x.html
    #
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/local/www/nginx-dist;
    }

    # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
    #
    location ~ \.php$ {
        fastcgi_pass   unix:/var/run/phph-fpm.socket;
        fastcgi_param  HTTPS on;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
        include        fastcgi_params;

    }

    # deny access to .htaccess files, if Apache's document root
    # concurs with nginx's one
    #
    location ~ /\.ht {
        deny  all;
    }
        include 000-cmsploit.conf;
        include 004-pillaging-dvcs.conf;
        include 005-x-frame.conf;
}

Konfiguracja wspólne

Poniżej konfiguracje, które zostały umieszczone w repozytorium skryptów:

Obsługa plików .ht*

    # deny access to .htaccess files, if Apache's document root
    # concurs with nginx's one
    #
    location ~ /\.ht {
        deny  all;
    }

Obsługa PHP-FPM

To jest do przemyślenia. Bo może to być jednak mocno zależne od konkretnej aplikacji. Niemniej dość generyczne ustawienia powinno być poprawne:

    # pass the PHP scripts to FastCGI server via unix socket
    #
    location ~ \.php$ {
        fastcgi_pass   unix:/var/run/phph-fpm.socket;
        fastcgi_param HTTPS on;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
        include        fastcgi_params;
    }

    # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
    #
    location ~ \.php$ {
        root           html;
        fastcgi_pass   127.0.0.5:9000;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
        include        fastcgi_params;
    }

Obsługa CGI

Obsługa skryptów CGI jest bardzo prosta. Należy zainstalować oraz uruchomić fcgiwrap.W konfiguracji nginx należy wykonać konfigurację:

        location ~ \.cgi$ {
            try_files $uri =404;
            gzip off;
            #rewrite ^/cgi-bin/nagios/(.*)$ /nagios/$1;
            fastcgi_pass  unix:/var/run/fcgiwrap/fcgiwrap.sock;
            include fastcgi_params;
            fastcgi_param SCRIPT_FILENAME  $request_filename;
            fastcgi_param REMOTE_USER $remote_user;
        }

Nagłówki bezpieczeństwa dla HTTPS

    add_header X-Content-Type-Options nosniff;
    add_header X-XSS-Protection "1; mode=block";
    add_header Strict-Transport-Security "max-age=15768000; includeSubDomains; preload";

http auth

Domyślnie nie ma żadnych ograniczeń dla danego zasobu (location). Niemniej można go ograniczać poprzez ACLki (adresy IP) oraz autentykację użytkownika. W tym celu należy wykonać konfigurację (na przykładzie konfiguracji dla net-mgmt/nagios3):

    location /nagios/ {
        alias /usr/local/www/nagios/;
        index index.php;
        satisfy any;
        allow 10.0.0.0/8;
        allow 127.0.0.4;
        deny all;

        auth_basic "Special Area";
        auth_basic_user_file /var/www/authdb/auth.db;
    }

Źródła w sieci internet


{i}  (c) 2004 - 2026 BSD Serwis Krzysztof Stryjek. W przypadku błędów, poprawek proszę kontaktować się z administratorem wiki.

NginxWebServer (ostatnio edytowane 2020-05-03 20:29:13 przez wtps0n)