Nginx Konfiguration #
nginx [engine x] ist ein HTTP- und Reverse-Proxyserver, ein Mail-Proxyserver und ein allgemeiner TCP/UDP-Proxyserver. Es gibt einen Master Prozess, der die Worker Prozesse koordiniert. Die Worker Prozesse sind betriebssystemabhängig und event-basierend implementiert.
Die Konfiguration fängt für einen HTTP Proxy mit “http” an. Alternativ ist ist auch “Stream” für TCP/UDP möglich. Die “Virtual Hosts” von Apache sind “server” Blöcke bei Nginx. Innerhalb der “server” Blöcke gibt es bei HTTP die “location” Blöcke.
http Block #
Hier kann das Log format definiert werden. Angewendet wird es dann mit “access_log” bzw. “error_log”. Auf der Nginx Documentation ist ersichtlich, dass es z. B. im http, server oder location Block angewendet werden kann.
location Block #
Der “location” Block setzt eine Konfiguration in Abhängigkeit zur request URI. Nginx normalisiert die URI für uns (z.B. keine /subfolder/../index.html). Eine Erklärung, wann welcher Block Priorität hat, findet sich hier und hier
Falls man den Server nicht als Proxy verwendet sind der “root” und “try_files” Parameter interessant. Wenn der “location” Block leer oder nicht vorhanden ist, versucht Nginx die Datei im aktuellen Context (gesetzt durch “root”) zurückzugeben (siehe Beispiel statische Website).
SSL #
SSL geht am einfachsten über certbot oder ähnlicher Software. In der Nginx config müsste dann wie in der Dokumentation die “ssl_certificate” und “ssl_certificate_key” angepasst werden. Das kann der certbot aber selber machen.
Beispiel statische Website #
server {
listen 80;
server_name example.ch;
root /var/www/example.ch;
index index.html;
}
Beispiel HTTP Konfiguration #
http {
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
log_format myextended '"$remote_addr" - "$remote_user" - "[$time_local]" - '
'"$request" - "$request_body" - "$status" - "$body_bytes_sent" - '
'"$http_referer" - "$http_user_agent" - "$gzip_ratio" - '
'"$request_id" - "$connection" - "$host"';
access_log /var/log/nginx/access.log main;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 4096;
include /etc/nginx/mime.types;
default_type application/octet-stream;
# Load modular configuration files from the /etc/nginx/conf.d directory.
# See http://nginx.org/en/docs/ngx_core_module.html#include
# for more information.
include /etc/nginx/conf.d/*.conf;
server {
listen 80 default_server;
return 301 https://$host$request_uri;
}
server {
server_name _;
access_log /var/log/nginx/access_default.log myextended;
listen 443 ssl default_server;
add_header Referer $host$request_uri;
ssl_certificate /etc/letsencrypt/live/example.ch/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.ch/privkey.pem;
return 444;
}
server {
server_name example.ch;
access_log /var/log/nginx/access_example.log myextended;
listen 443 ssl;
location ~* (wordpress|wp-admin|wp-includes|xmlrpc)
{
return 444;
}
location /
{
proxy_pass http://10.0.0.3:80;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Referer $http_referer;
proxy_set_header Referrer-Policy "unsafe-url";
}
client_max_body_size 1G;
add_header X-Content-Type-Options "nosniff" always;
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-XSS-Protection "1; mode=block; report=security.example.ch" always;
add_header X-Robots-Tag "noarchive notranslate";
add_header X-Download-Options noopen;
add_header X-Permitted-Cross-Domain-Policies none;
add_header Content-Security-Policy "upgrade-insecure-requests";
add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload";
fastcgi_hide_header X-Powered-By;
ssl_certificate /etc/letsencrypt/live/example.ch/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.ch/privkey.pem;
}