|
Rozmiar: 6533
Komentarz: + konfiguracja php; poprawienie linków
|
Rozmiar: 27699
Komentarz: + definiowanie i wykorzystanie zmiennych; aktualizacja ustawień opcji w pakiecie
|
| 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: |
| Linia 17: | Linia 17: |
| Opcji jest bardzo dużo. Na dzień '''02.09.2017''' zostały wybrane następujące: | Opcji jest bardzo dużo. Na dzień '''25.11.2019''' zostały wybrane następujące: |
| Linia 20: | Linia 20: |
| OPTIONS_FILE_SET+=FILE_AIO | |
| Linia 21: | Linia 22: |
| OPTIONS_FILE_SET+=THREADS OPTIONS_FILE_SET+=WWW |
|
| Linia 23: | Linia 26: |
| OPTIONS_FILE_SET+=HTTP_DAV OPTIONS_FILE_SET+=HTTP_GZIP_STATIC OPTIONS_FILE_SET+=HTTP_MP4 |
|
| Linia 25: | Linia 31: |
| OPTIONS_FILE_SET+=HTTP_SLICE_AHEAD | |
| Linia 27: | Linia 34: |
| OPTIONS_FILE_SET+=HTTP_XSLT | |
| Linia 31: | Linia 39: |
| OPTIONS_FILE_SET+=THREADS OPTIONS_FILE_SET+=WWW |
OPTIONS_FILE_SET+=BROTLI OPTIONS_FILE_SET+=CT OPTIONS_FILE_SET+=HEADERS_MORE |
| Linia 37: | Linia 46: |
| OPTIONS_FILE_SET+=HTTP_DAV_EXT OPTIONS_FILE_SET+=HTTP_FANCYINDEX |
|
| Linia 38: | Linia 49: |
| OPTIONS_FILE_SET+=HTTP_MP4_H264 | |
| Linia 40: | Linia 52: |
| OPTIONS_FILE_SET+=BROTLI | |
| Linia 44: | Linia 55: |
| PHP ([[FreshPorts:lang/php71|lang/php71]]) powinno mieć wybrane następujące opcje: | 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; } }}} == Zwiększenie parametrów związanych z server_name == W przypadku konfiguracji wykorzystującej bardzo dużo wartości ''server_name'' należy ustawić parametry w sekcji ''http'': {{{#!highlight nginx numbers=off http { # [...] server_names_hash_max_size 1024; server_names_hash_bucket_size 512; # [...] }}} == 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/php-fpm-www.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 http2 == Protokół HTTP/2 nie jest domyślnie włączony. Nie ma możliwości również jego ustawienia w sekcji ''http''. Można go jedynie włączyć dla konfiguracji HTTPS poprzez następującą konfigurację: {{{#!highlight nginx numbers=off server { listen 11.22.33.44 ssl http2; # [...] } }}} == Konfiguracja IPv6 == Konfiguracja protokołu IPv6 jest wykonywana w dyrektywie ''listen'' dla danego serwera wirtualnego. W konfiguracji '''JEDNEGO i TYLKO JEDNEGO''' serwera wirtualnego możliwe jest zaznaczenie, że nginx ma pracować w podwójnym trybie IPv4/IPv6: {{{#!highlight nginx numbers=off server { listen [::1]:80 ipv6only=off; # [...] } }}} == 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 === 1. Konieczne jest uruchomienie [[KonfiguracjaPhp#Konfiguracja_php-fpm.conf|php-fpmd]] analogicznie do [[FcgiWrap|fcgiwrapd]]. 1. Poniższa konfiguracja jest dość generyczna. Ale nie ma możliwości jej ''włączania'' z oddzielnego pliku konfiguracyjnego<<FootNote(Kluczowy jest parametr '''fastcgi_index''', który w niektórych przypadkach może być inny, aniżeli `index.php`. Odpowiednia konfiguracja została umieszczona w [[UniMaster|repozytorium konfiguracji]] i sprawdza się.)>>. Raczej ma zasadzie ''copy-paste'': {{{#!highlight nginx numbers=off # pass the PHP scripts to FastCGI server via unix socket # location ~ \.php$ { fastcgi_pass unix:/var/run/php-fpm-www.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; } }}} ==== Właczenie short_open_tag w konkretnym serwerze (wirtualce) ==== W celu włączenia obsługi ''short_open_tag'' w konkretnym serwerze wirtualnym należy w dodać następującą konfigurację {{{#!highlight nginx numbers=off location ~ \.php$ { fastcgi_pass unix:/var/run/php-fpm-www.socket; fastcgi_param PHP_ADMIN_VALUE short_open_tag=On; # [...] } }}} ==== Inne ustawienia dla php w lokalizacji ==== Analogicznie do ustawienia ''short_open_tag'' można ustawić inne zmienne. Jak podano poniżej<<FootNote(Do sprawdzenia, ponieważ dla przykładowej witryny powodowało to błędne działanie całej aplikacji webowej.)>>: {{{#!highlight nginx numbers=off location ~ \.php$ { fastcgi_pass unix:/var/run/php-fpm-www.socket; fastcgi_param PHP_ADMIN_VALUE open_basedir=/var/www/htdocs/virtuals/www.gdbd.pl/nowa-strona:/var/tmp:/usr/local/share/pear:/usr/local/share/phpmailer:/usr/local/share/adodb:/usr/local/share/smarty:/usr/local/share/fpdf:/usr/local/share/jpgraph; fastcgi_param PHP_ADMIN_VALUE sys_temp_dir=/var/www/htdocs/virtuals/www.gdbd.pl/nowa-strona/tmp; fastcgi_param PHP_ADMIN_VALUE upload_tmp_dir=/var/www/htdocs/virtuals/www.gdbd.pl/nowa-strona/tmp; fastcgi_param PHP_ADMIN_VALUE session.save_path=/var/www/htdocs/virtuals/www.gdbd.pl/nowa-strona/tmp; # [...] } }}} ==== Ustawienie wartości domyślnych wybranych zmiennych ==== Możliwe jest "''sterowanie''" konfiguracją serwera poprzez ustawienie zmiennych. Ważne jest również ustawienie wartości domyślnej, tak aby dokonywać zmian jedynie w wybranych ''wirtualkach''. Jest to możliwe poprzez polecenie '''map''', jak podano na poniższych przykładach (dotyczy ustawień !WordPress-a): ===== Sekcja http (nginx.conf) ===== {{{#!highlight nginx numbers=off http { # [...] # ustawienie zmiennych (warto/sci domy/slnych) map $host $fpmuser { default www; } map $host $bsd_php_https_param { default on; } map $host $bsd_php_ini_display_errors { default off; } # [...] } }}} ===== Sekcja server (virtuals.serwer.conf) ===== {{{#!highlight nginx numbers=off server { # [...] set $fpmuser __fpm_user__; set $bsd_php_ini_display_errors on; include 022-wordpress-core.conf; # [...] } }}} ===== Konfiguracja WordPress ===== Plik zapisany w [[UniMaster|repozytorium konfiguracji]]. Poniżej przykład użycia zmiennych w konfiguracji: {{{#!highlight nginx numbers=off # [...] location ~ \.php$ { #NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini fastcgi_pass unix:/var/run/php-fpm-$fpmuser.socket; fastcgi_param HTTPS $bsd_php_https_param; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param PHP_ADMIN_VALUE display_errors=$bsd_php_ini_display_errors; # [...] } }}} === 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; } }}} === Obsługa uWSGI === W celu uruchamiania aplikacji napisanych w języku [[http://www.python.org|python|target="_blank"]] wykorzystywany jest [[https://uwsgi-docs.readthedocs.io/en/latest/|uWSGI|target="_blank"]]. Po uruchomieniu aplikacji w samym uWSGI należy wykonać konfigurację w '''nginx'''. Najlepiej pokazuje to [[MoinModUwsgi#wiki_jako_root|konfiguracja moinmoin]]. === 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"; }}} === FancyIndex === W celu uruchomienia "''ładnego''" wyświetlania zawartości katalogu należy dodać moduł do konfiguracji ngnix-a (sekcja globalna): {{{#!highlight nginx numbers=off load_module "/usr/local/libexec/nginx/ngx_http_fancyindex_module.so"; }}} A następnie dla danej ''location'' wskazać użycie !FancyIndex (na przykładzie konfiguracji dla [[PoudriereBinaryPkg|poudriere]]): {{{#!highlight nginx numbers=off location /pkg/data/ { alias /pkg/data/logs/bulk/; fancyindex on; fancyindex_exact_size off; } }}} === 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; } }}} === ssl verify client === Rozbudowa uwierzytelniania (HTTP AUTH) w oparciu o certyfikat klienta. {{{#!highlight nginx numbers=off ssl_client_certificate /etc/ssl/ca.crt.pem; ssl_verify_client on; ssl_verify_depth 10; if ($ssl_client_verify != SUCCESS) { return 403; } }}} Klient powinien posiadać [[CertyfikatySsl|certyfikat wygenerowany]] jako ''autentykacja klienta''. ''Certificate Authority'', które podpisało certyfikat klienta musi się znaleźć w pliku podanym jako parametr dla '''ssl_client_certificate'''. Zgodnie z dokumentacją [ [[#url11|11]] ] plik powinien zawierać kolejne certyfikaty CA, które są wystawcami certyfikatów klienckich (analogicznie do listy certyfiaktów ''root''-owych). Wykonanie ''HTTP AUTH'' z wykorzystaniem certyfikatów wymaga, aby w bazie z użytkownikami znalazły się wpisy zawierające ''subject'' z certyfikatu. Hasło dla takiego specjalnego ''użytkownika'' może być dowolne - nie jest wykorzystywane; należy spełnić wymagania dotyczące bazy autentykacyjnej: |
| Linia 46: | Linia 434: |
| [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) }}} == Konfiguracja php.ini == {{{#!highlight ini numbers=off engine = On short_open_tag = Off precision = 14 output_buffering = 4096 zlib.output_compression = Off implicit_flush = Off unserialize_callback_func = serialize_precision = -1 disable_functions = disable_classes = zend.enable_gc = On expose_php = On max_execution_time = 30 max_input_time = 60 memory_limit = 128M error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT display_errors = Off display_startup_errors = Off log_errors = On log_errors_max_len = 1024 ignore_repeated_errors = Off ignore_repeated_source = Off report_memleaks = On track_errors = Off html_errors = On variables_order = "GPCS" request_order = "GP" register_argc_argv = Off auto_globals_jit = On post_max_size = 1048M auto_prepend_file = auto_append_file = default_mimetype = "text/html" default_charset = "UTF-8" doc_root = user_dir = enable_dl = Off file_uploads = On upload_tmp_dir = /var/tmp/www upload_max_filesize = 1035M max_file_uploads = 20 allow_url_fopen = On allow_url_include = Off default_socket_timeout = 60 [CLI Server] cli_server.color = On [Date] date.timezone = Europe/Warsaw [filter] [iconv] [intl] [sqlite3] [Pcre] [Pdo] [Pdo_mysql] pdo_mysql.cache_size = 2000 pdo_mysql.default_socket= [Phar] [mail function] SMTP = localhost smtp_port = 25 mail.add_x_header = On [SQL] sql.safe_mode = Off [ODBC] odbc.allow_persistent = On odbc.check_persistent = On odbc.max_persistent = -1 odbc.max_links = -1 odbc.defaultlrl = 4096 odbc.defaultbinmode = 1 [Interbase] ibase.allow_persistent = 1 ibase.max_persistent = -1 ibase.max_links = -1 ibase.timestampformat = "%Y-%m-%d %H:%M:%S" ibase.dateformat = "%Y-%m-%d" ibase.timeformat = "%H:%M:%S" [MySQLi] mysqli.max_persistent = -1 mysqli.allow_persistent = On mysqli.max_links = -1 mysqli.cache_size = 2000 mysqli.default_port = 3306 mysqli.default_socket = mysqli.default_host = mysqli.default_user = mysqli.default_pw = mysqli.reconnect = Off [mysqlnd] mysqlnd.collect_statistics = On mysqlnd.collect_memory_statistics = Off [OCI8] [PostgreSQL] pgsql.allow_persistent = On pgsql.auto_reset_persistent = Off pgsql.max_persistent = -1 pgsql.max_links = -1 pgsql.ignore_notice = 0 pgsql.log_notice = 0 [bcmath] bcmath.scale = 0 [browscap] [Session] session.save_handler = files session.use_strict_mode = 0 session.use_cookies = 1 session.use_only_cookies = 1 session.name = PHPSESSID session.auto_start = 0 session.cookie_lifetime = 0 session.cookie_path = / session.cookie_domain = session.cookie_httponly = session.serialize_handler = php session.gc_probability = 1 session.gc_divisor = 1000 session.gc_maxlifetime = 1440 session.referer_check = session.cache_limiter = nocache session.cache_expire = 180 session.use_trans_sid = 0 session.sid_length = 26 session.trans_sid_tags = "a=href,area=href,frame=src,form=" session.sid_bits_per_character = 5 session.save_path = "/var/tmp/www" [Assertion] zend.assertions = -1 [COM] [mbstring] [gd] [exif] [Tidy] tidy.clean_output = Off [soap] soap.wsdl_cache_enabled=1 soap.wsdl_cache_dir="/tmp" soap.wsdl_cache_ttl=86400 soap.wsdl_cache_limit = 5 [sysvshm] [ldap] ldap.max_links = -1 [mcrypt] [dba] [opcache] [curl] [openssl] openssl.capath = /etc/ssl ; Local Variables: ; tab-width: 4 ; End: }}} == Konfiguracja php-fpm.conf == {{{#!highlight ini numbers=off [global] pid = run/php-fpm.pid syslog.facility = daemon syslog.ident = php-fpm log_level = notice emergency_restart_threshold = 0 process.max = 128 daemonize = yes include=/usr/local/etc/php-fpm.d/*.conf }}} === Konfiguracja etc/php-fpm.d/www.conf === {{{#!highlight ini numbers=off [www] user = www group = www listen = 127.0.0.1:9000 listen.backlog = -1 listen.allowed_clients = 127.0.0.1 pm = dynamic pm.max_children = 5 pm.start_servers = 2 pm.min_spare_servers = 1 pm.max_spare_servers = 3 pm.process_idle_timeout = 10s; pm.max_requests = 500 security.limit_extensions = .php .php3 .php4 .php5 .php7 env[HOSTNAME] = $HOSTNAME env[PATH] = /usr/local/bin:/usr/bin:/bin env[TMP] = /var/tmp/www env[TMPDIR] = /var/tmp/www env[TEMP] = /var/tmp/www }}} == Uruchomienie php-fpm == W skryptach startowych (`/etc/rc.conf` lub `/etc/rc.conf.d/php_fpm`) należy ustawić: {{{#!highlight bash numbers=off php_fpm_enable="YES" }}} A następnie uruchomić demon: {{{#!highlight bash numbers=off service php-fpm start }}} = Konfiguracja nginx.conf = == Konfiguracja przekierowania do https == |
/C=PL/ST=mazowieckie/O=BSD Serwis Krzysztof Stryjek/OU=BSD Serwis HQ/CN=win10.wtp3.local/emailAddress=security@bsdserwis.com:xxj31ZMTZzkVA }}} === WebDAV === Konfiguracja mechanizmu WebDAV jest krótka i działa poprawnie dla __prostej lokalizacji__ (bez wyrażeń regularnych dla ''location''). ==== Włączenie modułów ==== Należy się upewnić, że w opcjach [[FreshPorts:www/nginx|nginx]] jest włączona obsługa WebDAV: {{{#!highlight make numbers=off OPTIONS_FILE_SET+=HTTP_DAV OPTIONS_FILE_SET+=HTTP_DAV_EXT }}} Moduł ''HTTP_DAV_EXT'' zapewnia wsparcie dla metod ''PROPFIND'' oraz ''OPTIONS''. ==== Konfiguracja dla wybranej lokalizacji ==== Konfiguracja pokazana na przykładzie (najbardziej opisywane rozwiązanie) publikacji kalendarzy dla programów pocztowych (MS Outlook, Thunderbird). {{{#!highlight nginx numbers=off location /kalendarz/ { alias /var/www/htdocs/virtuals/webdavcal/data/; dav_methods PUT DELETE MKCOL COPY MOVE; dav_ext_methods PROPFIND OPTIONS; dav_access user:rw group:rw all:r; create_full_put_path on; client_body_temp_path /var/www/htdocs/virtuals/webdavcal/tmp/; client_max_body_size 100m; limit_except GET { auth_basic "Strefa chroniona kalendarzy"; auth_basic_user_file /var/www/htdocs/virtuals/webdavcal/authdb/davcal.db; } fancyindex on; fancyindex_exact_size off; } }}} === Obsługa security.txt === Całość została opisana w [[SecurityTxt|oddzielnej dokumentacji]]. = Konfiguracja dla aplikacji webowych = Dla wybranych aplikacji webowych czy też paneli administracyjnych zapisana jest dedykowana im konfiguracja. == Konfiguracja dla nagios3 == Konfiguracja dla [[FreshPorts:net-mgmt/nagios3|net-mgmt/nagios3]] jest dość prosta. Sprowadza się do konfiguracji odpowiedniego ''location'' wraz z obsługą plików ''php'' oraz ''cgi'': {{{#!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 "Athenasoft Special Area"; auth_basic_user_file /var/www/authdb/ccauth.db; location ~ \.php$ { fastcgi_pass unix:/var/run/phph-fpm.socket; fastcgi_param HTTPS on; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $request_filename; include fastcgi_params; } include expires.conf; 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; } } }}} == Konfiguracja dla wpad.dat == Dla sieci lokalnych bardzo przydatne jest wystawienia konfiguracji dla serwera proxy, czyli [[WikiPedia:Web_Proxy_Auto-Discovery_Protocol|Web Proxy Auto Discovery]] (WPAD). Konfiguracja jest bardzo krótka, a jednocześnie bardzo elastyczna dla klienta końcowego: {{{#!highlight nginx numbers=off # dodanie typu pliku (mime) types { application/x-ns-proxy-autoconfig dat; } server { listen ip.ad.dre.ss:80; server_name wpad.domain.local wpad w3c.domain.local; access_log /var/log/nginx/wpad.domain.local/access.log; error_log /var/log/nginx/wpad.domain.local/error.log; root /var/www/htdocs/virtuals/wpad/data; # je/zeli kto/s poprosi o domy/slny dokument, to przekierowania na wpad.dat # location / { return 301 /wpad.dat; } # pr/oba zwr/ocenia pliku wpad.dat albo b/l/ad # location /wpad.dat { try_files /wpad.dat =404; } } }}} == DNS black holing == Całość została opisane w [[DnsBlackHoling|oddzielnym dokumencie]]. == Konfiguracja dla mailman == Całość została opisana w [[MailmanPostfix|oddzielnej dokumentacji]]. == Konfiguracja dla ownCloud == Całość została opisana w [[OwnCloud#Konfiguracja_nginx|oddzielnej dokumentacji]]. == Konfiguracja dla Joomla == Konfiguracja dla Joomla 3.x wygląda następująco: {{{#!highlight nginx numbers=off server { # [...] ustawienia listen ,certyfikatów, logowania, itd. # deny running scripts inside writable directories location ~* /(images|cache|media|logs|tmp)/.*\.(php|pl|py|jsp|asp|sh|cgi)$ { return 403; } location ~ \.xml$ { return 403; } location / { try_files $uri $uri/ /index.php?$args; if ($request_uri ~ "^/(.*)(?<=/)index\.php/?((?<=/).*)?$") { return 301 /$1$2; } if ($request_uri ~ "^/(.*)(?<=/)index\.php/?((?<=/).*)?$") { return 301 /$1$2; } if ($query_string ~ "mosConfig_[a-zA-Z_]{1,21}(=|\%3D)"){ return 403; } if ($query_string ~ "base64_encode.*\(.*\)"){ return 403; } if ($query_string ~* "(\<|%3C).*script.*(\>|%3E)"){ return 403; } if ($query_string ~ "GLOBALS(=|\[|\%[0-9A-Z]{0,2})"){ return 403; } if ($query_string ~ "_REQUEST(=|\[|\%[0-9A-Z]{0,2})"){ return 403; } } location /administrator { satisfy any; allow 127.0.0.0/8; allow __adres_ip__; deny all; auth_basic "Firma Security Team"; auth_basic_user_file /var/www/htdocs/virtuals/www.domain.tld/authdb/admin; } location ~ /component/users/ { allow 127.0.0.0/8; allow __adres_ip__; deny all; } # pass the PHP scripts to FastCGI server listening on unix socket # location ~ \.php$ { fastcgi_pass unix:/var/run/php-fpm-jjanusz.socket; fastcgi_param HTTPS on; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param PATH_TRANSLATED $document_root/$fastcgi_path_info; fastcgi_param PATH_INFO $fastcgi_path_info; include fastcgi_params; } include 000-cmsploit.conf; include 004-dot-ht.conf; include 004-err-page-404.conf; include 004-err-page-5xx.conf; include 004-pillaging-dvcs.conf; include 005-no-logging.conf; include 015-csp-report.conf; include expires.conf; } }}} == Konfiguracja dla drupal == Konfiguracja dla [[https://www.drupal.org|Drupal|target="_blank"]]-a została umieszczona w [[UniMaster|repozytorium konfiguracji]] w postaci plików: * 006-drupal-core.conf - konfiguracja bez względu na miejsce zainstalowania * 006-drupal.conf - konfiguracja dla katalogu `/usr/local/www/drupal7` == Konfiguracja dla dspam == [[PostfixDspam|dspam]] posiada panel webowy napisany w PERL. Tak więc trzeba ''przenieść'' do FastCGI m.in. dane autoryzacyjne z protokołu HTTP. Całość konfiguracji zapisana została w pliku `016-dspam.conf` w [[UniMaster|repozytorium konfiguracji]] jak pokazano poniżej: {{{#!highlight nginx numbers=off location /dspam/ { alias /usr/local/www/dspam/; index index.html; auth_basic "Dspam Control Center"; auth_basic_user_file /var/www/htdocs/virtuals/__SERVER_NAME__/authdb/dspamdb; gzip off; location ~ \.cgi$ { fastcgi_pass unix:/var/run/fcgiwrap/fcgiwrap.sock; fastcgi_index dspam.cgi; fastcgi_param SCRIPT_FILENAME $request_filename; include fastcgi_params; fastcgi_param REMOTE_USER $remote_user; fastcgi_pass_header Authorization; fastcgi_intercept_errors off; } include expires.conf; } }}} == mod rewrite == /!\ /!\ /!\ '''TBA''' /!\ /!\ /!\ = Kodowanie znaków = [[FreshPorts:www/nginx|nginx]] korzysta z kodowania ''UTF-8''. Ale problem jest z kodowaniem innym (starsze standardy), np. ''ISO-8859-2''. [[FreshPorts:www/nginx|nginx]] wyświetla specjalne ''pytajniki'' zamiast np. polskich ogonków. Rozwiązaniem problemu jest utworzenie '''charset map''', która mapuje znaki ''ISO-8859-*'' (lub inne kodowania) na kodowanie ''UTF-8''. Konficuracja takiej mapy wygląda następująco: {{{#!highlight nginx numbers=off charset_map iso-8859-2 utf-8 { A0 C2A0 ; # no-break space A1 C484 ; # latin capital letter A with ogonek [...] } }}} Mapa kodowania z ''ISO-8859-2'' do ''UTF-8'' została utworzona w [[UniMaster|repozytorium konfiguracji]]. == Zmiana kodowania == W celu skorzyania z mapy kodowania należy wykonać następującą konfigurację: === Sekcja http === {{{#!highlight nginx numbers=off http { [...] include charset-l2-utf8.conf; [...] } }}} === Sekcja server === {{{#!highlight nginx numbers=off server { [...] source_charset iso-8859-2; [...] } }}} |
| Linia 300: | Linia 694: |
| * [[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"]] |
1. <<Anchor(url1)>>[[https://calomel.org/nginx.html||target="_blank"]] 1. <<Anchor(url21)>>[[https://calomel.org/freebsd_network_tuning.html||target="_blank"]] 1. <<Anchor(url3)>>[[https://pyd.io/freebsd-nginx-php-fpm/||target="_blank"]] 1. <<Anchor(url4)>>[[http://www.defcon1.org/html/nginx.html||target="_blank"]] 1. <<Anchor(url5)>>[[https://uwsgi-docs.readthedocs.io/en/latest/||target="_blank"]] 1. <<Anchor(url6)>>[[http://winginx.com/en/htaccess|Konwerter mod_rewrite|target="_blank"]] 1. <<Anchor(url7)>>[[https://www.fileformat.info/info/unicode/|Tablica znaków UTF-8 pomocna przy konwersji ze starych kodowań|target="_blank"]] 1. <<Anchor(url8)>>[[https://support.office.com/pl-pl/article/udost%c4%99pnianie-kalendarza-outlook-innym-osobom-353ed2c1-3ec5-449d-8c73-6931a0adab88?redirectSourcePath=%252fpl-pl%252farticle%252fPublikowanie-kalendarza-na-serwerze-WebDAV-e50ef626-c879-4005-a3d4-a96c0efc851f&ui=pl-PL&rs=pl-PL&ad=PL#__toc300732657&ID0EAACAAA=Nowsze_wersje|Publikowanie kalendarzy w MS Outlook|target="_blank"]] 1. <<Anchor(url9)>>[[https://medium.com/@cetteup/cant-create-or-delete-directories-on-an-nginx-webdav-server-here-s-how-to-fix-that-76ffedcb5b51|Problem / w WebDAV|target="_blank"]] 1. <<Anchor(url10)>>[[https://stackoverflow.com/questions/12428445/outlook-refresh-interval-for-ical-subscriptions-webcal|Jak często Outlook odświeża kalendarz|target="_blank"]] 1. <<Anchor(url11)>>[[http://nginx.org/en/docs/http/ngx_http_ssl_module.html#ssl_client_certificate|moduł http_ssl nginx-a|target="_blank"]] |
| Linia 306: | Linia 706: |
| {i} A jak coś nie jest jasne, to napisz do administratora. | {i} ` `<<GetVal(SlownikNewBsd,adm-podpis)>> |
Spis Treści
- Instalacja oraz konfiguracja nginx
- Obsługa PHP
-
Konfiguracja nginx.conf
- Sekcja globalna
- Zwiększenie parametrów związanych z server_name
- Konfiguracja protkołu HTTP(S)
- Konfiguracja http2
- Konfiguracja IPv6
- Konfiguracja wspólne
- Konfiguracja dla aplikacji webowych
- Kodowanie znaków
- Źródła w sieci internet
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ń 25.11.2019 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_DAV
OPTIONS_FILE_SET+=HTTP_GZIP_STATIC
OPTIONS_FILE_SET+=HTTP_MP4
OPTIONS_FILE_SET+=HTTP_REWRITE
OPTIONS_FILE_SET+=HTTP_SLICE
OPTIONS_FILE_SET+=HTTP_SLICE_AHEAD
OPTIONS_FILE_SET+=HTTP_SSL
OPTIONS_FILE_SET+=HTTP_STATUS
OPTIONS_FILE_SET+=HTTP_XSLT
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+=CT
OPTIONS_FILE_SET+=HEADERS_MORE
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_DAV_EXT
OPTIONS_FILE_SET+=HTTP_FANCYINDEX
OPTIONS_FILE_SET+=HTTP_JSON_STATUS
OPTIONS_FILE_SET+=HTTP_MP4_H264
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;
}
Zwiększenie parametrów związanych z server_name
W przypadku konfiguracji wykorzystującej bardzo dużo wartości server_name należy ustawić parametry w sekcji http:
http {
# [...]
server_names_hash_max_size 1024;
server_names_hash_bucket_size 512;
# [...]
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/php-fpm-www.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 http2
Protokół HTTP/2 nie jest domyślnie włączony. Nie ma możliwości również jego ustawienia w sekcji http. Można go jedynie włączyć dla konfiguracji HTTPS poprzez następującą konfigurację:
server {
listen 11.22.33.44 ssl http2;
# [...]
}
Konfiguracja IPv6
Konfiguracja protokołu IPv6 jest wykonywana w dyrektywie listen dla danego serwera wirtualnego. W konfiguracji JEDNEGO i TYLKO JEDNEGO serwera wirtualnego możliwe jest zaznaczenie, że nginx ma pracować w podwójnym trybie IPv4/IPv6:
server {
listen [::1]:80 ipv6only=off;
# [...]
}
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
Konieczne jest uruchomienie php-fpmd analogicznie do fcgiwrapd.
Poniższa konfiguracja jest dość generyczna. Ale nie ma możliwości jej włączania z oddzielnego pliku konfiguracyjnego1. Raczej ma zasadzie copy-paste:
# pass the PHP scripts to FastCGI server via unix socket
#
location ~ \.php$ {
fastcgi_pass unix:/var/run/php-fpm-www.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;
}
Właczenie short_open_tag w konkretnym serwerze (wirtualce)
W celu włączenia obsługi short_open_tag w konkretnym serwerze wirtualnym należy w dodać następującą konfigurację
location ~ \.php$ {
fastcgi_pass unix:/var/run/php-fpm-www.socket;
fastcgi_param PHP_ADMIN_VALUE short_open_tag=On;
# [...]
}
Inne ustawienia dla php w lokalizacji
Analogicznie do ustawienia short_open_tag można ustawić inne zmienne. Jak podano poniżej2:
location ~ \.php$ {
fastcgi_pass unix:/var/run/php-fpm-www.socket;
fastcgi_param PHP_ADMIN_VALUE open_basedir=/var/www/htdocs/virtuals/www.gdbd.pl/nowa-strona:/var/tmp:/usr/local/share/pear:/usr/local/share/phpmailer:/usr/local/share/adodb:/usr/local/share/smarty:/usr/local/share/fpdf:/usr/local/share/jpgraph;
fastcgi_param PHP_ADMIN_VALUE sys_temp_dir=/var/www/htdocs/virtuals/www.gdbd.pl/nowa-strona/tmp;
fastcgi_param PHP_ADMIN_VALUE upload_tmp_dir=/var/www/htdocs/virtuals/www.gdbd.pl/nowa-strona/tmp;
fastcgi_param PHP_ADMIN_VALUE session.save_path=/var/www/htdocs/virtuals/www.gdbd.pl/nowa-strona/tmp;
# [...]
}
Ustawienie wartości domyślnych wybranych zmiennych
Możliwe jest "sterowanie" konfiguracją serwera poprzez ustawienie zmiennych. Ważne jest również ustawienie wartości domyślnej, tak aby dokonywać zmian jedynie w wybranych wirtualkach. Jest to możliwe poprzez polecenie map, jak podano na poniższych przykładach (dotyczy ustawień WordPress-a):
Sekcja http (nginx.conf)
http {
# [...]
# ustawienie zmiennych (warto/sci domy/slnych)
map $host $fpmuser {
default www;
}
map $host $bsd_php_https_param {
default on;
}
map $host $bsd_php_ini_display_errors {
default off;
}
# [...]
}
Sekcja server (virtuals.serwer.conf)
server {
# [...]
set $fpmuser __fpm_user__;
set $bsd_php_ini_display_errors on;
include 022-wordpress-core.conf;
# [...]
}
Konfiguracja WordPress
Plik zapisany w repozytorium konfiguracji. Poniżej przykład użycia zmiennych w konfiguracji:
# [...]
location ~ \.php$ {
#NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini
fastcgi_pass unix:/var/run/php-fpm-$fpmuser.socket;
fastcgi_param HTTPS $bsd_php_https_param;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PHP_ADMIN_VALUE display_errors=$bsd_php_ini_display_errors;
# [...]
}
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;
}
Obsługa uWSGI
W celu uruchamiania aplikacji napisanych w języku python wykorzystywany jest uWSGI. Po uruchomieniu aplikacji w samym uWSGI należy wykonać konfigurację w nginx. Najlepiej pokazuje to konfiguracja moinmoin.
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";
FancyIndex
W celu uruchomienia "ładnego" wyświetlania zawartości katalogu należy dodać moduł do konfiguracji ngnix-a (sekcja globalna):
load_module "/usr/local/libexec/nginx/ngx_http_fancyindex_module.so";
A następnie dla danej location wskazać użycie FancyIndex (na przykładzie konfiguracji dla poudriere):
location /pkg/data/ {
alias /pkg/data/logs/bulk/;
fancyindex on;
fancyindex_exact_size off;
}
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;
}
ssl verify client
Rozbudowa uwierzytelniania (HTTP AUTH) w oparciu o certyfikat klienta.
ssl_client_certificate /etc/ssl/ca.crt.pem;
ssl_verify_client on;
ssl_verify_depth 10;
if ($ssl_client_verify != SUCCESS) { return 403; }
Klient powinien posiadać certyfikat wygenerowany jako autentykacja klienta. Certificate Authority, które podpisało certyfikat klienta musi się znaleźć w pliku podanym jako parametr dla ssl_client_certificate. Zgodnie z dokumentacją [ 11 ] plik powinien zawierać kolejne certyfikaty CA, które są wystawcami certyfikatów klienckich (analogicznie do listy certyfiaktów root-owych).
Wykonanie HTTP AUTH z wykorzystaniem certyfikatów wymaga, aby w bazie z użytkownikami znalazły się wpisy zawierające subject z certyfikatu. Hasło dla takiego specjalnego użytkownika może być dowolne - nie jest wykorzystywane; należy spełnić wymagania dotyczące bazy autentykacyjnej:
/C=PL/ST=mazowieckie/O=BSD Serwis Krzysztof Stryjek/OU=BSD Serwis HQ/CN=win10.wtp3.local/emailAddress=security@bsdserwis.com:xxj31ZMTZzkVA
WebDAV
Konfiguracja mechanizmu WebDAV jest krótka i działa poprawnie dla prostej lokalizacji (bez wyrażeń regularnych dla location).
Włączenie modułów
Należy się upewnić, że w opcjach nginx jest włączona obsługa WebDAV:
OPTIONS_FILE_SET+=HTTP_DAV
OPTIONS_FILE_SET+=HTTP_DAV_EXT
Moduł HTTP_DAV_EXT zapewnia wsparcie dla metod PROPFIND oraz OPTIONS.
Konfiguracja dla wybranej lokalizacji
Konfiguracja pokazana na przykładzie (najbardziej opisywane rozwiązanie) publikacji kalendarzy dla programów pocztowych (MS Outlook, Thunderbird).
location /kalendarz/ {
alias /var/www/htdocs/virtuals/webdavcal/data/;
dav_methods PUT DELETE MKCOL COPY MOVE;
dav_ext_methods PROPFIND OPTIONS;
dav_access user:rw group:rw all:r;
create_full_put_path on;
client_body_temp_path /var/www/htdocs/virtuals/webdavcal/tmp/;
client_max_body_size 100m;
limit_except GET {
auth_basic "Strefa chroniona kalendarzy";
auth_basic_user_file /var/www/htdocs/virtuals/webdavcal/authdb/davcal.db;
}
fancyindex on;
fancyindex_exact_size off;
}
Obsługa security.txt
Całość została opisana w oddzielnej dokumentacji.
Konfiguracja dla aplikacji webowych
Dla wybranych aplikacji webowych czy też paneli administracyjnych zapisana jest dedykowana im konfiguracja.
Konfiguracja dla nagios3
Konfiguracja dla net-mgmt/nagios3 jest dość prosta. Sprowadza się do konfiguracji odpowiedniego location wraz z obsługą plików php oraz cgi:
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 "Athenasoft Special Area";
auth_basic_user_file /var/www/authdb/ccauth.db;
location ~ \.php$ {
fastcgi_pass unix:/var/run/phph-fpm.socket;
fastcgi_param HTTPS on;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $request_filename;
include fastcgi_params;
}
include expires.conf;
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;
}
}
Konfiguracja dla wpad.dat
Dla sieci lokalnych bardzo przydatne jest wystawienia konfiguracji dla serwera proxy, czyli Web Proxy Auto Discovery (WPAD). Konfiguracja jest bardzo krótka, a jednocześnie bardzo elastyczna dla klienta końcowego:
# dodanie typu pliku (mime)
types {
application/x-ns-proxy-autoconfig dat;
}
server {
listen ip.ad.dre.ss:80;
server_name wpad.domain.local wpad w3c.domain.local;
access_log /var/log/nginx/wpad.domain.local/access.log;
error_log /var/log/nginx/wpad.domain.local/error.log;
root /var/www/htdocs/virtuals/wpad/data;
# je/zeli kto/s poprosi o domy/slny dokument, to przekierowania na wpad.dat
#
location / {
return 301 /wpad.dat;
}
# pr/oba zwr/ocenia pliku wpad.dat albo b/l/ad
#
location /wpad.dat {
try_files /wpad.dat =404;
}
}
DNS black holing
Całość została opisane w oddzielnym dokumencie.
Konfiguracja dla mailman
Całość została opisana w oddzielnej dokumentacji.
Konfiguracja dla ownCloud
Całość została opisana w oddzielnej dokumentacji.
Konfiguracja dla Joomla
Konfiguracja dla Joomla 3.x wygląda następująco:
server {
# [...] ustawienia listen ,certyfikatów, logowania, itd.
# deny running scripts inside writable directories
location ~* /(images|cache|media|logs|tmp)/.*\.(php|pl|py|jsp|asp|sh|cgi)$ {
return 403;
}
location ~ \.xml$ {
return 403;
}
location / {
try_files $uri $uri/ /index.php?$args;
if ($request_uri ~ "^/(.*)(?<=/)index\.php/?((?<=/).*)?$") { return 301 /$1$2; }
if ($request_uri ~ "^/(.*)(?<=/)index\.php/?((?<=/).*)?$") { return 301 /$1$2; }
if ($query_string ~ "mosConfig_[a-zA-Z_]{1,21}(=|\%3D)"){ return 403; }
if ($query_string ~ "base64_encode.*\(.*\)"){ return 403; }
if ($query_string ~* "(\<|%3C).*script.*(\>|%3E)"){ return 403; }
if ($query_string ~ "GLOBALS(=|\[|\%[0-9A-Z]{0,2})"){ return 403; }
if ($query_string ~ "_REQUEST(=|\[|\%[0-9A-Z]{0,2})"){ return 403; }
}
location /administrator {
satisfy any;
allow 127.0.0.0/8;
allow __adres_ip__;
deny all;
auth_basic "Firma Security Team";
auth_basic_user_file /var/www/htdocs/virtuals/www.domain.tld/authdb/admin;
}
location ~ /component/users/ {
allow 127.0.0.0/8;
allow __adres_ip__;
deny all;
}
# pass the PHP scripts to FastCGI server listening on unix socket
#
location ~ \.php$ {
fastcgi_pass unix:/var/run/php-fpm-jjanusz.socket;
fastcgi_param HTTPS on;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_TRANSLATED $document_root/$fastcgi_path_info;
fastcgi_param PATH_INFO $fastcgi_path_info;
include fastcgi_params;
}
include 000-cmsploit.conf;
include 004-dot-ht.conf;
include 004-err-page-404.conf;
include 004-err-page-5xx.conf;
include 004-pillaging-dvcs.conf;
include 005-no-logging.conf;
include 015-csp-report.conf;
include expires.conf;
}
Konfiguracja dla drupal
Konfiguracja dla Drupal-a została umieszczona w repozytorium konfiguracji w postaci plików:
- 006-drupal-core.conf - konfiguracja bez względu na miejsce zainstalowania
006-drupal.conf - konfiguracja dla katalogu /usr/local/www/drupal7
Konfiguracja dla dspam
dspam posiada panel webowy napisany w PERL. Tak więc trzeba przenieść do FastCGI m.in. dane autoryzacyjne z protokołu HTTP. Całość konfiguracji zapisana została w pliku 016-dspam.conf w repozytorium konfiguracji jak pokazano poniżej:
location /dspam/ {
alias /usr/local/www/dspam/;
index index.html;
auth_basic "Dspam Control Center";
auth_basic_user_file /var/www/htdocs/virtuals/__SERVER_NAME__/authdb/dspamdb;
gzip off;
location ~ \.cgi$ {
fastcgi_pass unix:/var/run/fcgiwrap/fcgiwrap.sock;
fastcgi_index dspam.cgi;
fastcgi_param SCRIPT_FILENAME $request_filename;
include fastcgi_params;
fastcgi_param REMOTE_USER $remote_user;
fastcgi_pass_header Authorization;
fastcgi_intercept_errors off;
}
include expires.conf;
}
mod rewrite
TBA
Kodowanie znaków
nginx korzysta z kodowania UTF-8. Ale problem jest z kodowaniem innym (starsze standardy), np. ISO-8859-2. nginx wyświetla specjalne pytajniki zamiast np. polskich ogonków.
Rozwiązaniem problemu jest utworzenie charset map, która mapuje znaki ISO-8859-* (lub inne kodowania) na kodowanie UTF-8. Konficuracja takiej mapy wygląda następująco:
charset_map iso-8859-2 utf-8 {
A0 C2A0 ; # no-break space
A1 C484 ; # latin capital letter A with ogonek
[...]
}
Mapa kodowania z ISO-8859-2 do UTF-8 została utworzona w repozytorium konfiguracji.
Zmiana kodowania
W celu skorzyania z mapy kodowania należy wykonać następującą konfigurację:
Sekcja http
http {
[...]
include charset-l2-utf8.conf;
[...]
}
Sekcja server
server {
[...]
source_charset iso-8859-2;
[...]
}
Źródła w sieci internet
(c) 2004 - 2026 BSD Serwis Krzysztof Stryjek. W przypadku błędów, poprawek proszę kontaktować się z administratorem wiki.
Kluczowy jest parametr fastcgi_index, który w niektórych przypadkach może być inny, aniżeli index.php. Odpowiednia konfiguracja została umieszczona w repozytorium konfiguracji i sprawdza się. (1)
Do sprawdzenia, ponieważ dla przykładowej witryny powodowało to błędne działanie całej aplikacji webowej. (2)
