Nginx

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;
}
Calendar November 13, 2022