Tool.Yun
Praktische Tools für Entwickler
Barcode-Generator
Barcode-Lesegerät
GTIN-Validator
QR-Code-Decoder
QR-Code-Generator
QR-Kontaktinfo-Generator
WLAN-QR-Code-Generator
tools.epc-qrcode-generator.name
Bild zu SVG (Potrace)
Bild zuschneiden
Bild-EXIF/Metadaten/GPS/JPEG-Qualitätsleser
Bildervergleich
Bildfarbinverter
Bildformatkonverter
Bildgrößenänderung
Bildhintergrund entfernen
EXIF entfernen
GIF zu MP4
HEIC-Konverter
ICO/PNG-Konverter
Kamera-Rekorder
OCRize Bild und PDF
SVG-Vorschau
Wasserzeichen
BMI-Rechner
Erkläre den Shell-Befehl
IBAN-Validator und -Parser
IES-Beleuchtungsrichtlinien
ISBN-Validator und -Parser
ISO 3166 Ländercode-Sucher
ISO 639 Searcher
Kalenderkonverter
Kreditkarten-Checker
Lauftempo-Rechner
Luhn-Validator
MwSt.-Nummern-Validator
Online-Wörterbuch
RMB-Großbuchstabenkonverter
SLA-Rechner
Softwarelizenzkompatibilität
Telefonnummer-Parser und -Formatter
Unicode-Suche
Währungsrechner
Chronometer
Countdown
Cron/Wochentagsalarm
Datum-Uhrzeit-Konverter
Datums- und Dauerrechner
Dauerrechner
ETA-Rechner
ICAL-Dateiparser
ICAL-Generator
TTL-Rechner
Tagesrechner
Welcher Tag?
Wochennummern-Konverter
Zeitalarm
Zeitzonenkonverter
iCal-Fusion
Docker Compose Formatkonverter
Docker Compose in .env-Datei
Docker Compose zu Kubernetes
Docker Compose zu Quadlets
Docker Compose-Validator
Docker Image Downloader
Docker Pangolin Labels
Docker run zu Docker compose Konverter
Docker-Inspektion zum Docker-Ausführen
Docker-Lauf zu Kubernetes
Docker-Lauf zu Quadlets
Dockerfile-Labelgenerator
Konverter von Docker Compose zu Docker Run
Kubernetes RBAC-Generator
Traefik Docker Compose Maker
ANSI-Fluchttester
API-Tests
Angebotskonverter
CLI-Befehlseditor
CSS/JS-Formatierung und -Minifizierung
Code-/Skript-Highlighter
Curl-Konverter
Dateisplitter
Datenbank-Erstellungs-Generator
Datenbanktabellengenerator
Datenfälscher
Django Secret Generator
Favicon-Generator
Generator für Datenbankverbindungszeichenfolgen
GitIgnore Generator
Gitattributes-Generator
HEX-Dateikonverter
Javascript-Unobfuscator/Entpacker
Javascript-Verschleierung
Javascript-Verschönerung
Json zu Protobuf
Json zu SQL INSERT
Json zu Typescript
K6 Lasttest-Skriptgenerator
Mailto-Generator
Open Graph Meta-Generator
Picomatch-Tester
Pomodoro-Timer
SQL verschönern und formatieren
SQL-Minimierer
SQL-Parametergenerator
Stacktrace hübscher
String Escaper
Swagger UI-Tester
Tilgungsrechner
ActiveDirectory LDAP-Eigenschaftensucher
Bounce-E-Mail-Parser
Cookies-Parser
DMARC-Berichtsanalysator
DNS-Propagationstester
DNS-Tester
Dateityp-Detektor
E-Mail-Parser
EMV TLV-Decoder
ETH-Transaktionsdecoder
GZip/Deflate-Konverter
HTTPS-Tester
Hex-Encoder/Decoder
Keycode-Info
Konverter für Fließkommazahlen
Kurz-URL-Expander
MIME-Kodierungskonverter
Maskierung sensibler Daten
Middle-Endian-Konverter
MongoDB ObjectId-Konverter
Nmap-Befehlsgenerator
Outlook Safelink-Decoder
Outlook-MSG-Parser
Parquet-Dateien Reader
Pixelfehlertester
RJ45 Cat6 Verkabelungs-Spickzettel
SMART Raw-Konverter
Serielle Portkonsole
Sharepoint-Freigabe-URL-Decoder
Snowflake-ID-Extraktor
TCPDump-Generator
Text-Zeichensatz-Detektor/Decoder
URL-Generator
URL-Parser
Widerstandsrechner
键盘测试器
BIP39-Passphrasengenerator
Diceware-Passwortgenerator
NanoIDs-Generator
Numeronym-Generator
OTP-Code-Generator
PIN-Code-Generator
Passphrase-Generator
Token-Generator
UUID-Generator
UUID-Konverter
Zufallszahlengenerator
CSV zu JSON
JS-zu-JSON-Konverter
JSON Linter
JSON für unterwegs
JSON minifizieren
JSON nach C#
JSON verschönern und formatieren
JSON zu .env
JSON zu CSV
JSON zu Daten
JSON zu Java Entity
JSON zu MessagePack
JSON zu TOML
JSON zu TS
JSON zu XML
JSON zu YAML
JSON zum Objekt
JSON-Abfrage
JSON-Editor
JSON-Flattener/Unflattener
JSON-Größenanalysator
JSON-Sortiermaster
JSON-Unterschied
JSON-Zusammenführung
JSON-zu-JS-Konverter
JSON-zu-PHP-Code
Jq/JSONPath-Tester
Json Escaper/Unescaper
Json zu PHP-Array
Json zu Python
Json zu SQL DDL
Json zu Schema
Json-String-Konverter
Message Pack zu JSON
ObjGen zu JSON
PHP-Array zu JSON
tools.json-patch.name
Base64-Dateikonverter
Base64-Hex-Array-Encoder/Decoder
Base64-String-Encoder/Decoder
CSV zu Daten
Datenspeichereinheit-Konverter
E-Mail-Normalisierung
Eigenschaftenkonverter
Energieverbrauchs- und -kostencomputer
Env-Variablen-Formatkonverter
Excel in Daten
Ganzzahl-Basiskonverter
Geografische Koordinatenkonverter
Konverter von Unicode-Zeichen in Java-Entitäten
Römische Zahlen Konverter
Text zu ASCII-Binär
Text zu Unicode
Torrent zu Magnet
ULID-Generator
Viele Einheiten-Umrechner
dBm mW Konverter
AGE-Kryptographie
Ansible Vault Crypt entschlüsseln
Argon2 Hasher
Bcrypt
Bech32-Encoder/Decoder
CRC-Rechner
CSR-Generator
Datei-Hasher
ECDSA-Schlüsselpaargenerator
Ed25519 Schlüsselpaargenerator
HMAC-Generator
JWT-Generator
JWT-Parser
Jasypt-Stringverschlüsselung
Niceware Bytes zu Passphrase
PGP-Dateiverschlüsselung
PGP-Schlüssel
PGP-Verschlüsselung
Paseto/PASERK Lokal
Paseto/PASERK Öffentlich/Privat
RSA-Schlüsselpaar-Generator
RSA-Verschlüsselung
RSA/DSA/ECDSA-Signierer und -Verifizierer
SAML-Parser
SSL-Zertifikatkonverter
Shamirs Geheimnisteilung
Text hashen
Text verschlüsseln / entschlüsseln
X509-Zertifikatgenerator
Zertifikat-/Schlüsselparser
Als Markdown einfügen
Epub zu Markdown
HTML zu Markdown
Markdown Diff
Markdown Lorem Ipsum
Markdown zu DOCX
Markdown zu Daten
Markdown zu HTML
Markdown zu Text
Markdown-Editor
Markdown-Inhaltsverzeichnisgenerator
Markdown-Tabellengenerator
Markdown-Tabellenverschönerer
Markdown-Vorschau
tools.markdown-format-converter.name
Binärrechner
Konverter für mathematische Formate
Mathematische OCR
Mathematischer Auswerter
Trinkgeldrechner
Visualisierung trigonometrischer Kurven/Gleichungskurven
Benchmark-Builder
Geo-Entfernungsrechner
Prozentrechner
Seitenverhältnis-Rechner
ARPA-Decoder
Apache LogRotate Generator
BIMI DNS-Generator
Basic-Auth-Generator
Befehlsgenerator zum Herunterfahren
Chmod-Rechner
Cloudflare DNS/RDAP-Abfragen
Crontab-Generator
Curl-Befehlsgenerator
DKIM DNS Generator
DMARC DNS Generator
DNS-Abfragen
DNSBL-Checker
FStab-Generator
Festplattenrechner
Ganzzahlen zu IPv4/IPv6
HAS Desinfektionsmittel
HTAccess-Generator
Htpasswd/htaccess-Generator
IP-Geostandort
IPv4-6/IPRange/CIDR in IPRange/CIDR/IPMask
IPv4-Adresskonverter
IPv4-Bereichserweiterer
IPv4-Subnetzliste
IPv4-Subnetzrechner
IPv4/6 CIDR-zu-IP-Bereichsrechner
IPv4/6-Bereich zu CIDR(s)-Rechner
IPv6-Adresskonverter
IPv6-Subnetzrechner
IPv6-ULA-Generator
Iptables-Generator
Klingeln
Linearisierer für Shell-Befehle
MAC-Adressen-Generator
MAC-Adressensuche
MAC-Adresskonverter
Meine IP-Adresse
Mikrofonprufung
Multi-Link-Downloader
Nginx-Formatierer
Option43 Generator
PTR-DNS-Generator
Passwortstärken-Analysator
Portnummern
Punycode-Konverter
RAID-Rechner
RAID-Zuverlässigkeitsrechner
Rechner für die Datenübertragungsrate
Rechner zum Ausschließen von IP-Subnetzen
Rsync-Generator
SIP-Autorisierung
SPF-DNS-Generator
Shell-Befehlsformatierer
TCP/UDP-Porttester
UFW-Befehlsgenerator
Visueller Subnetzrechner
WPA PSK-Generator
Websocket-Tests
Whois-Checker
Wireguard-Konfigurationsgenerator
X-VR-SpamCause Decoder
ZPOOL RAID-Rechner
ZPool-Spickzettel
Zufälliger Port-Generator
Zxcvbn-Passwortstärke
firewalld-Befehlszeilengenerator
tools.restic-command-generator.name
tools.url-redirection-checker.name
HTML zu PDF
PDF entschlüsseln und entsperren
PDF-Kompressor
PDF-Linearisierung/FastWeb
PDF-Seitenextraktor
PDF-Signaturprüfer
PDF-Textextraktor
PDF-Verkettung
PDF-Verschlüsselung
Beleuchtungsstärke
Beschleunigungswandler
Drehzahlwandler
Druckeinheiten-Umrechner
Energieeinheiten-Umrechner
Fitnesscomputer
Flächeneinheiten-Umrechner
Frequenzumrichter
Krafteinheiten-Umrechner
Lebensmittel-Energie-Umrechner
Leistungswandler
Längeneinheiten-Umrechner
Masseneinheiten-Umrechner
SI-Präfix-Konverter
Temperaturkonverter
Volumeneinheiten-Umrechner
Volumenstrom-Umrechner
Winkeleinheiten-Umrechner
Allgemeines Regex-Spickzettel
Bash-Spickzettel
Docker Compose-Spickzettel
Docker SWARM-Spickzettel
Docker-Spickzettel
Dockerfile-Spickzettel
Git-Spickzettel
Jq Spickzettel
K8s Spickzettel
Markdown-Spickzettel
Nano-Spickzettel
Nginx-Spickzettel
PowerShell-Spickzettel
Regex-Spickzettel
Sed-Spickzettel
Spickzettel für Bildschirmbefehle
Spickzettel für CSS-Selektoren
Spickzettel für semantische Git-Commits
Spickzettel zur JSONPath-Syntax
Spickzettel zur XPath-Syntax
Tmux-Befehlsübersicht
VIM-Spickzettel
Zellij-Befehlsübersicht
chmod-Befehlsübersicht
Glücksrad
Kartenauswahl
Münzwerfer
Würfelroller
Cron-Ausdrucks-Generator
TOML Linter
TOML zu JSON
TOML zu YAML
ASCII-Art-Text-Generator
Bild in ASCII-Art
Doppelte Zeilensuche
Emoji-Picker
Fall-Konverter
GPT-Token-Encoder/Decoder
GPT-Token-Schätzer
I und L Prüfer
Intelligenter Textersetzer und Zeilenumbruch
JSON zu TOON
KI-Eingabeaufforderungssplitter
Levenshtein-Rechner
Listen Vergleichen
Listenkonverter
Lorem Ipsum Generator
Meerjungfrau-Exporteur
Morsecode-Konverter
Ordnerstrukturdiagramm
Packdateien für AI
RSVP-Leser
Regex-Tester
Runenkonverter
Schriftartenvergleich
Sed-Befehlsgenerator
Social Link Sharer
String-Verschleierer
TOON zu JSON
Tabulator zu Leerzeichen
Tastaturlayout-Konverter
Text aus HTML extrahieren
Text in Unicode-Namen
Text zu NATO-Alphabet
Textstatistiken
Textunterschied
Textübersetzer
Unicode zu GSM-7
Unicode-Formatierer
Verschiedene Wörter
Zalgo Generator/Banner
Zitatgenerator
Zufällige Zeilenauswahl
Bild zu CSS
CSS XPath-Konverter
CSS-Einheitenumrechner
CSS-Gradientengenerator
CSS-Verschönerer
Farbkontrast-Checker
Farbkonverter
Farbrad
Geräteinformationen
HTML zu Daten
HTML zu XHTML
HTML-Entity-Escape
HTML-Minimierer
HTML-Reiniger
HTML-Verschönerer
HTML-WYSIWYG-Editor
HTTP-Statuscodes
Kodieren/Decodieren von URL-formatierten Zeichenfolgen
MIME-Typen
REM-Pixelkonverter
SVG-Platzhalter-Generator
Slugify String
URL-Catcher
URL-Reiniger
URL-Textsuchfragment-Ersteller
UTM-URL-Generator
User-Agent-Parser
ObjectGen zu HTML
XML zu JSON
XML-Formatter
XML-Linter
XPath-Tester
XSLT-Tester
YAML verschönern und formatieren
YAML zu JSON
YAML zu TOML
YAML-Flattener/Unflattener
YAML-Fusion

Nginx-Spickzettel

Nginx-Konfiguration und nützliche Befehle

nginx is a web server, reverse proxy and load balancer. Configuration is a tree of contexts — main → events / http → server → location — and a directive is only valid in the contexts that define it.

🛠 Service & CLI

# check the configuration before you break production
sudo nginx -t

# print the entire resolved configuration, includes and all
sudo nginx -T

# reload without dropping connections
sudo nginx -s reload
sudo systemctl reload nginx

# start, stop, restart, status
sudo systemctl start nginx
sudo systemctl stop nginx
sudo systemctl restart nginx
sudo systemctl status nginx

# version, and the modules it was built with
nginx -V

# enable a site (Debian/Ubuntu layout)
sudo ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/

# watch the requests come in
sudo tail -f /var/log/nginx/access.log
sudo tail -f /var/log/nginx/error.log

💡 nginx -t then nginx -s reload — never restart on a live server if you can avoid it. A reload keeps existing connections alive; a restart drops them.

📁 Where Things Live

PathWhat it holds
/etc/nginx/nginx.confThe main file — worker settings and the http block
/etc/nginx/conf.d/*.confIncluded by default on RHEL-style installs
/etc/nginx/sites-available/Site configs on Debian/Ubuntu
/etc/nginx/sites-enabled/Symlinks to the sites that are actually live
/var/log/nginx/access.logEvery request
/var/log/nginx/error.logErrors, and anything the workers complain about
/var/www/htmlThe conventional document root

🧱 Config Skeleton

user www-data;
worker_processes auto;

events {
  worker_connections 1024;
}

http {
  include       /etc/nginx/mime.types;
  default_type  application/octet-stream;
  sendfile      on;
  keepalive_timeout 65;

  server {
    listen 80;
    server_name example.com;

    location / {
      root /var/www/html;
      index index.html;
    }
  }
}

🎧 listen & server_name

server {
  # plain HTTP
  listen 80;

  # HTTPS, with HTTP/2
  listen 443 ssl;
  http2 on;

  # IPv6 as well, or IPv6 only
  listen [::]:80;
  listen [::]:80 ipv6only=on;

  # the fallback server for requests that match no other server_name
  listen 80 default_server;

  # one name, several names, wildcards, or a regex
  server_name example.com;
  server_name example.com www.example.com;
  server_name *.example.com;
  server_name ~^(?<sub>.+)\.example\.com$;

  # requests that arrive with no Host header
  server_name "";
}

📄 Serving Files

server {
  listen 80;
  server_name example.com;
  root /var/www/example.com;
  index index.html index.htm;

  # try the file, then the directory, then fall back — the SPA pattern
  location / {
    try_files $uri $uri/ /index.html;
  }

  # cache fingerprinted assets hard
  location ~* \.(js|css|png|jpe?g|gif|svg|woff2?)$ {
    expires 1y;
    add_header Cache-Control "public, immutable";
    access_log off;
  }

  # a directory listing, when you actually want one
  location /downloads/ {
    autoindex on;
  }

  # a single file
  location = /robots.txt {
    root /var/www/example.com;
    log_not_found off;
  }
}

⚠️ root vs alias: root appends the whole URI to the path, alias replaces the matched prefix. With location /static/ { root /var/www; } a request for /static/a.png reads /var/www/static/a.png; with alias /var/www/assets/; it reads /var/www/assets/a.png. Always end an alias path with /.

📍 Location Matching

nginx does not pick locations top to bottom — it picks by modifier, in this order:

ModifierExampleMeaningPriority
=location = /healthExact match1 — wins immediately
^~location ^~ /static/Prefix match that stops regex matching2
~location ~ \.php$Case-sensitive regex, first match in file order3
~*location ~* \.(jpe?g)$Case-insensitive regex3
(none)location /images/Prefix match — the longest one wins if no regex did4
location = /health { return 200 "ok\n"; }   # checked first, cheapest
location ^~ /assets/ { root /var/www; }     # never falls through to the regex below
location ~* \.(png|jpg)$ { expires 30d; }
location / { try_files $uri $uri/ =404; }   # the catch-all

🔀 Redirects & Rewrites

# permanent redirect to the canonical host
server {
  listen 80;
  server_name www.example.com;
  return 301 https://example.com$request_uri;
}

# force HTTPS
server {
  listen 80;
  server_name example.com;
  return 301 https://$host$request_uri;
}

# temporary redirect of a single path
location /old-page {
  return 302 /new-page;
}

# rewrite with a captured segment
location /blog/ {
  rewrite ^/blog/(.*)$ /articles/$1 permanent;
}

# serve a maintenance page for everyone but your own IP
location / {
  if ($remote_addr != 203.0.113.7) {
    return 503;
  }
}

💡 Prefer return over rewrite — it is faster and clearer. Reach for rewrite only when you need to transform the path.

🔁 Reverse Proxy

server {
  listen 80;
  server_name app.example.com;

  location / {
    proxy_pass http://127.0.0.1:3000;

    # pass the client's details through to the app
    proxy_set_header Host              $host;
    proxy_set_header X-Real-IP         $remote_addr;
    proxy_set_header X-Forwarded-For   $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;

    # timeouts: raise these for slow backends
    proxy_connect_timeout 60s;
    proxy_send_timeout    60s;
    proxy_read_timeout    60s;

    # buffering off for streaming responses (SSE, logs)
    proxy_buffering on;
  }

  # WebSockets need the upgrade headers
  location /ws/ {
    proxy_pass http://127.0.0.1:3000;
    proxy_http_version 1.1;
    proxy_set_header Upgrade    $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_read_timeout 3600s;
  }
}

⚠️ The trailing slash on proxy_pass changes everything. proxy_pass http://backend; forwards /api/users as /api/users; proxy_pass http://backend/; strips the matched location prefix first.

⚖️ Load Balancing

upstream backend {
  # least_conn;              # send to the server with the fewest connections
  # ip_hash;                 # sticky sessions by client IP
  # hash $request_uri;       # sticky by URI

  server 10.0.0.1:3000 weight=3;
  server 10.0.0.2:3000;
  server 10.0.0.3:3000 max_fails=3 fail_timeout=30s;
  server 10.0.0.4:3000 backup;

  keepalive 32;              # reuse upstream connections
}

server {
  listen 80;
  location / {
    proxy_pass http://backend;
    proxy_http_version 1.1;
    proxy_set_header Connection "";   # required for keepalive to work
  }
}
MethodBehaviour
(default)Round robin, honouring weight
least_connFewest active connections wins
ip_hashSame client IP always reaches the same server
hash <key>Distribute by any variable, e.g. $request_uri
random two least_connPick two at random, then the less busy one

🔐 HTTPS

server {
  listen 443 ssl;
  http2 on;
  server_name example.com;

  ssl_certificate     /etc/letsencrypt/live/example.com/fullchain.pem;
  ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;

  ssl_protocols TLSv1.2 TLSv1.3;
  ssl_prefer_server_ciphers off;
  ssl_session_cache shared:SSL:10m;
  ssl_session_timeout 1d;
  ssl_stapling on;
  ssl_stapling_verify on;

  # tell browsers to stay on HTTPS
  add_header Strict-Transport-Security "max-age=63072000" always;
}
# get and renew certificates automatically
sudo certbot --nginx -d example.com -d www.example.com
sudo certbot renew --dry-run

🚦 Limits & Access Control

http {
  # 10 MB of state ≈ 160k addresses; 10 requests/second per IP
  limit_req_zone $binary_remote_addr zone=req_limit:10m rate=10r/s;
  limit_conn_zone $binary_remote_addr zone=conn_limit:10m;

  server {
    # allow short bursts, queue the rest without delaying legitimate users
    location /api/ {
      limit_req zone=req_limit burst=20 nodelay;
      limit_conn conn_limit 10;
    }

    # the size of the largest upload you accept
    client_max_body_size 25m;

    # HTTP basic auth (htpasswd -c /etc/nginx/.htpasswd user)
    location /admin/ {
      auth_basic "Restricted";
      auth_basic_user_file /etc/nginx/.htpasswd;
    }

    # allow a subnet, deny the rest
    location /internal/ {
      allow 10.0.0.0/8;
      deny  all;
    }

    # do not serve dotfiles
    location ~ /\.(?!well-known) {
      deny all;
    }
  }
}

🗜 Performance

http {
  # compress text responses
  gzip on;
  gzip_vary on;
  gzip_min_length 1024;
  gzip_types text/plain text/css application/json application/javascript
             text/xml application/xml image/svg+xml;

  # kernel-level file sending
  sendfile on;
  tcp_nopush on;
  tcp_nodelay on;

  # keep connections around for reuse
  keepalive_timeout 65;
  keepalive_requests 1000;

  # cache open file handles
  open_file_cache max=10000 inactive=30s;
  open_file_cache_valid 60s;

  # a proxy cache for upstream responses
  proxy_cache_path /var/cache/nginx keys_zone=app_cache:10m max_size=1g inactive=60m;

  server {
    location / {
      proxy_cache app_cache;
      proxy_cache_valid 200 10m;
      add_header X-Cache-Status $upstream_cache_status;
    }
  }
}

🧪 Useful Variables

VariableHolds
$hostThe Host header, or the server name that matched
$uriThe normalised path, without the query string
$request_uriThe original path with the query string
$args / $arg_nameThe whole query string / one named parameter
$schemehttp or https
$remote_addrThe client’s IP address
$proxy_add_x_forwarded_forThe existing chain plus $remote_addr
$http_<name>Any request header, e.g. $http_user_agent
$request_methodGET, POST, …
$statusThe response status
$upstream_addrWhich backend actually served the request
$upstream_response_timeHow long the backend took
$request_timeHow long nginx took, start to finish

🩺 Troubleshooting

SymptomUsual cause
502 Bad GatewayThe backend is down, or refused the connection — check the app and proxy_pass
504 Gateway TimeoutThe backend is too slow — raise proxy_read_timeout, then fix the app
413 Request Entity Too LargeRaise client_max_body_size
403 Forbidden on a static fileThe worker user cannot read the path, or a directory lacks x
The wrong site is servedNo server_name matched, so the default_server answered
Changes have no effectThe config was never reloaded, or the file is not symlinked into sites-enabled
# see the config nginx is actually running, includes resolved
sudo nginx -T | less

# which worker user needs read access
ps -o user= -C nginx | sort -u

# turn up the error log while debugging
# error_log /var/log/nginx/error.log debug;

📚 Resources

  • Official documentation
  • Directive index
  • Variable index
  • Mozilla SSL configuration generator
  • Certbot — Let’s Encrypt