All checks were successful
Reindex Knowledge Base / reindex (push) Successful in 3s
Adds title, description, type, domain, and tags frontmatter to every doc for improved KB semantic search. The description field is prepended to every search chunk, and domain/type/tags enable filtered queries. Type values: context, guide, runbook, reference, troubleshooting Domain values match directory structure (networking, docker, etc.) Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
132 lines
3.5 KiB
Markdown
132 lines
3.5 KiB
Markdown
---
|
|
title: "Nginx Configuration Examples"
|
|
description: "Reference nginx configs for reverse proxy with SSL, load balancing with health checks, and rate limiting with connection throttling."
|
|
type: reference
|
|
domain: networking
|
|
tags: [nginx, ssl, reverse-proxy, load-balancing, rate-limiting]
|
|
---
|
|
|
|
# Nginx Configuration Examples
|
|
|
|
## Reverse Proxy with SSL
|
|
|
|
```nginx
|
|
# /etc/nginx/sites-available/myapp
|
|
server {
|
|
listen 80;
|
|
server_name myapp.example.com;
|
|
return 301 https://$server_name$request_uri;
|
|
}
|
|
|
|
server {
|
|
listen 443 ssl http2;
|
|
server_name myapp.example.com;
|
|
|
|
# SSL Configuration
|
|
ssl_certificate /etc/letsencrypt/live/myapp.example.com/fullchain.pem;
|
|
ssl_certificate_key /etc/letsencrypt/live/myapp.example.com/privkey.pem;
|
|
ssl_protocols TLSv1.2 TLSv1.3;
|
|
ssl_ciphers HIGH:!aNULL:!MD5;
|
|
ssl_prefer_server_ciphers on;
|
|
|
|
# Security Headers
|
|
add_header X-Frame-Options DENY;
|
|
add_header X-Content-Type-Options nosniff;
|
|
add_header X-XSS-Protection "1; mode=block";
|
|
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
|
|
|
|
# Logging
|
|
access_log /var/log/nginx/myapp.access.log;
|
|
error_log /var/log/nginx/myapp.error.log;
|
|
|
|
# Proxy to backend
|
|
location / {
|
|
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_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;
|
|
proxy_cache_bypass $http_upgrade;
|
|
|
|
# Timeouts
|
|
proxy_connect_timeout 60s;
|
|
proxy_send_timeout 60s;
|
|
proxy_read_timeout 60s;
|
|
}
|
|
|
|
# Static files
|
|
location /static/ {
|
|
alias /var/www/myapp/static/;
|
|
expires 30d;
|
|
add_header Cache-Control "public, immutable";
|
|
}
|
|
|
|
# Health check endpoint
|
|
location /health {
|
|
access_log off;
|
|
return 200 "healthy\n";
|
|
add_header Content-Type text/plain;
|
|
}
|
|
}
|
|
```
|
|
|
|
## Load Balancing Configuration
|
|
|
|
```nginx
|
|
# /etc/nginx/conf.d/upstream.conf
|
|
upstream backend {
|
|
least_conn;
|
|
server 10.0.1.10:3000 weight=3 max_fails=3 fail_timeout=30s;
|
|
server 10.0.1.11:3000 weight=3 max_fails=3 fail_timeout=30s;
|
|
server 10.0.1.12:3000 weight=1 backup;
|
|
}
|
|
|
|
server {
|
|
listen 80;
|
|
server_name api.example.com;
|
|
|
|
location / {
|
|
proxy_pass http://backend;
|
|
proxy_next_upstream error timeout invalid_header http_500 http_502 http_503;
|
|
proxy_next_upstream_tries 3;
|
|
proxy_next_upstream_timeout 30s;
|
|
|
|
# Standard proxy headers
|
|
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;
|
|
}
|
|
}
|
|
```
|
|
|
|
## Rate Limiting
|
|
|
|
```nginx
|
|
# /etc/nginx/nginx.conf (in http block)
|
|
http {
|
|
# Rate limiting zones
|
|
limit_req_zone $binary_remote_addr zone=api:10m rate=10r/s;
|
|
limit_req_zone $binary_remote_addr zone=login:10m rate=1r/s;
|
|
|
|
# Connection limiting
|
|
limit_conn_zone $binary_remote_addr zone=conn_limit_per_ip:10m;
|
|
}
|
|
|
|
# In server block
|
|
server {
|
|
location /api/ {
|
|
limit_req zone=api burst=20 nodelay;
|
|
limit_conn conn_limit_per_ip 10;
|
|
proxy_pass http://backend;
|
|
}
|
|
|
|
location /auth/login {
|
|
limit_req zone=login burst=5;
|
|
proxy_pass http://backend;
|
|
}
|
|
}
|
|
``` |