nginx-config-pro
Skill12 starsChanged 5 months agoMITView on GitHub
Generates and hardens production nginx configurations for reverse proxying with TLS termination, HTTP/2, response caching, rate limiting, gzip/brotli compression, and security headers. Use this skill when the user asks to "set up nginx as a reverse proxy", "add TLS/SSL to nginx", "configure nginx caching or rate limiting", "harden an nginx config", "proxy an app behind nginx", "fix nginx 502/504 errors", or write/review nginx.conf and server blocks.
We split this skill into the rules it gives an agent
8 rules. About 0 are common, 3 are distinctive, and 5 are very specific to this project.
≈0
Common · estimate
Many files like this have a rule of this kind.
≈3
Distinctive · estimate
This author's own choices. Worth a look.
5
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Distinctive: line 26
Follow these steps in order.
- Very specific: line 30
Scaffold the file: Use templates/reverse-proxy.conf.tmpl as the starting point.
- Very specific: line 35
Validate: Run scripts/nginx_check.sh <conf> to lint for the most common mistakes, then nginx -t and reload.
- Very specific: line 39
Put shared proxy settings in a snippet (e.g.
- Very specific: line 56
Use $host (not $http_host) so a missing Host header degrades gracefully to server_name.
- Very specific: line 71
When caching, always add a X-Cache-Status $upstream_cache_status header so you can confirm HIT/MISS/BYPASS.
- Distinctive: line 110
One server block per concern: Keep a dedicated port-80 redirect block separate from the TLS block.
- Distinctive: line 117
Log to structured/JSON format: when shipping to a log pipeline (see template).
≈ “Common” is an estimate: at least 1 in 5 of the 308,232 skill files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
nginx-config-pro
Overview
Authoritative guidance for writing secure, performant nginx reverse-proxy configurations. Produces server blocks that terminate TLS, speak HTTP/2, proxy to upstream applications, cache responses, throttle abusive clients, and compress payloads — without the footguns that cause 502s, header leaks, or weak ciphers.
Keywords: nginx, reverse proxy, TLS, SSL, HTTPS, HTTP/2, HTTP/3, certbot, Let's Encrypt, upstream, proxy_pass, gzip, brotli, rate limiting, limit_req, proxy_cache, security headers, HSTS, CSP, OCSP stapling, websocket, load balancing, 502 bad gateway, 504 gateway timeout.
This skill targets nginx 1.18+ (most directives work on 1.10+). HTTP/3 notes assume 1.25+.
When to use
- Standing up nginx in front of an app server (Node, Django/gunicorn, Rails/puma, PHP-FPM, a container).
- Adding or fixing TLS, redirects, or HSTS.
- Diagnosing 502/504, header duplication, or caching misses.
- Reviewing an existing
nginx.conffor security and performance.
Workflow
Follow these steps in order. Each builds on the previous.
- Gather inputs. Determine: domain name(s), upstream address (host:port or socket), app protocol (http/https/grpc/websocket), whether TLS certs exist or need Let's Encrypt, expected traffic profile (for rate limits and cache), and static asset paths.
- Choose a topology. Single upstream vs. load-balanced pool; HTTP/1.1 keepalive to upstream vs. fresh connections; whether caching is safe (idempotent GET responses with sane cache headers).
- Scaffold the file. Use
templates/reverse-proxy.conf.tmplas the starting point. Place site configs in/etc/nginx/sites-available/<name>.confand symlink intosites-enabled/(Debian/Ubuntu), or/etc/nginx/conf.d/<name>.conf(RHEL). - Configure TLS. Apply the cipher suite, protocols, and OCSP stapling from
references/tls-hardening.md. Always serve a port 80 → 443 redirect. Add HSTS only once you are certain HTTPS is permanent. - Set proxy headers correctly. Forward
Host,X-Forwarded-For,X-Forwarded-Proto, andX-Real-IP. Set sane timeouts. For websockets, add theUpgrade/Connectionmap. See the "Proxy headers" checklist below. - Add performance layers. Enable gzip (and brotli if the module is present), HTTP/2, upstream keepalive, and
proxy_cachewhere appropriate. - Add protection layers. Define
limit_req_zone/limit_conn_zoneinhttp {}and apply them inlocation/server. Add the security-header bundle. - Validate. Run
scripts/nginx_check.sh <conf>to lint for the most common mistakes, thennginx -tand reload. Verify externally perreferences/troubleshooting.md.
Proxy headers checklist (the #1 source of bugs)
Put shared proxy settings in a snippet (e.g. /etc/nginx/snippets/proxy.conf) and include it:
proxy_http_version 1.1;
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_set_header X-Forwarded-Host $host;
proxy_set_header Connection ""; # enables upstream keepalive
proxy_read_timeout 60s;
proxy_connect_timeout 5s;
proxy_send_timeout 60s;
proxy_buffering on;Rules:
- Use
$host(not$http_host) so a missing Host header degrades gracefully toserver_name. $proxy_add_x_forwarded_forappends; never hard-setX-Forwarded-For $remote_addrbehind another proxy.- Set
Connection ""only when paired with anupstream { keepalive N; }block andproxy_http_version 1.1. - Your app must trust these headers ONLY when nginx is the edge. Behind a load balancer/CDN, validate the real client IP via
set_real_ip_from+real_ip_header.
Worked decision: should I cache this?
| Condition | Cache? |
Response is GET/HEAD, no Set-Cookie, no Authorization | Yes |
Upstream sends Cache-Control: private/no-store | No (respect it) |
| Per-user/personalized HTML | No, or vary by a cache key that includes the session |
| Static assets (js/css/img with hashed names) | Yes, long expires, immutable |
| API JSON that changes every request | No |
When caching, always add a X-Cache-Status $upstream_cache_status header so you can confirm HIT/MISS/BYPASS. See references/caching-and-compression.md.
Rate limiting quick reference
Define zones in http {}, apply in server/location:
# http {} context
limit_req_zone $binary_remote_addr zone=req_per_ip:10m rate=10r/s;
limit_conn_zone $binary_remote_addr zone=conn_per_ip:10m;
# location {} context
limit_req zone=req_per_ip burst=20 nodelay;
limit_conn conn_per_ip 20;
limit_req_status 429;burstabsorbs short spikes;nodelayserves the burst immediately instead of queuing.$binary_remote_addris compact (16 bytes/IPv6); a 10m zone holds ~160k unique IPs.- For login endpoints use a tighter zone (e.g.
rate=5r/m) to slow credential stuffing. - Behind a CDN, key on the real client IP (after
real_ip), not the CDN edge IP.
Security headers bundle
Apply at server scope (see references/tls-hardening.md for full rationale and CSP guidance):
add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always;
add_header X-Content-Type-Options "nosniff" always;
add_header X-Frame-Options "SAMEORIGIN" always;
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
add_header Content-Security-Policy "default-src 'self'" always;
server_tokens off;The always flag is mandatory — without it headers are dropped on 4xx/5xx responses.
Best Practices
- One server block per concern. Keep a dedicated port-80 redirect block separate from the TLS block.
- Always
server_tokens off;to hide the nginx version. - Use snippets/includes for
proxy.conf,ssl.conf, andsecurity-headers.confso every site stays consistent. - Pin
ssl_protocols TLSv1.2 TLSv1.3;and a modern cipher list; disable TLS 1.0/1.1. - Test before reload:
nginx -t && nginx -s reload. Never reload a config that fails the test. - Set explicit timeouts. Defaults (60s read) can hang clients on a slow upstream.
- Define a default
server_name _;block that returns 444 to drop requests for unknown hosts. - Log to structured/JSON format when shipping to a log pipeline (see template).
- Reload, don't restart, for config changes — reload is zero-downtime.
Common Pitfalls
- Missing
Connection ""+ keepalive mismatch → upstream connections not reused, or502storms. Pairproxy_http_version 1.1,Connection "", andupstream { keepalive }. add_headerwithoutalways→ security headers silently disappear on errors.add_headerinheritance trap → defining ANYadd_headerin alocationdiscards ALLadd_headerfrom the parentserver. Re-include the full bundle or use a snippet in every location that needs it.proxy_passtrailing-slash semantics →proxy_pass http://up/;(with slash) strips the matched location prefix; without the slash it passes the full URI. Mixing these breaks routing.- HSTS too early /
preloadbefore submission → can lock users out of HTTP formax-age. Start with a smallmax-age, droppreloaduntil you have submitted to hstspreload.org. 502 Bad Gateway→ upstream down, wrong port, or SELinux blocking the connection (setsebool -P httpd_can_network_connect 1). Seereferences/troubleshooting.md.504 Gateway Timeout→ slow upstream; raiseproxy_read_timeoutand fix the app, don't just mask it.413 Request Entity Too Large→ raiseclient_max_body_size(default 1m) for uploads.- Caching authenticated responses → leaks one user's data to another. Add
proxy_cache_bypass/proxy_no_cachefor cookies/Authorization. - Worker/file-descriptor limits → high-traffic sites need
worker_connectionsandworker_rlimit_nofileraised together.
Bundled files
templates/reverse-proxy.conf.tmpl— complete, fill-in server config with TLS, caching, rate limiting, gzip, websockets, and security headers.references/tls-hardening.md— cipher suites, protocols, OCSP stapling, HSTS, CSP, Let's Encrypt/certbot, real-IP behind CDN.references/caching-and-compression.md— proxy_cache zones, cache keys, bypass rules, gzip/brotli tuning, static asset strategy.references/troubleshooting.md— 502/504/413/444 diagnosis, header debugging, validation commands.scripts/nginx_check.sh— stdlib (bash/grep) linter for the most common nginx config mistakes.examples/node-app-proxy.md— worked example: proxying a Node app on :3000 to https://app.example.com.
Other versions2 projects use a version of this.
Word for word · 2
- jaskirat1616/grok-skills★ 22100% same
- JayRHa/AgentSkills★ 12100% same
Edited · 0
None found.
Wrote their own version · 0
None found.
How matches are found. Word for word: the exact same text. Edited: shares passages with this file (“99% same” means 99% of its five-word phrases also appear here; 10% or more counts). Their own version: similar meaning, or, weakest, the same name. We can’t tell which project had it first. Projects are counted among the 200 most-starred candidates, and mentions are links to the repository we found, up to 50 per site, so both counts are a floor.
In this repository75 other files it gives its agents.
- 0-templateSkill
- ab-test-analyzerSkill
- adr-authorSkill
- api-designerSkill
- api-docs-writerSkill
- aws-cost-optimizerSkill
- bash-script-hardeningSkill
- blog-post-writerSkill
- book-summarizerSkill
- changelog-keeperSkill
- chart-chooserSkill
- code-reviewerSkill
- competitive-analysisSkill
- concept-explainerSkill
- cover-letter-writerSkill
- cron-schedulerSkill
- data-pipeline-architectSkill
- debug-detectiveSkill
- decision-matrixSkill
- dependency-upgraderSkill
- dockerfile-proSkill
- email-composerSkill
- error-handling-patternsSkill
- event-plannerSkill
- flashcard-generatorSkill
- gdpr-data-mapperSkill
- gift-advisorSkill
- github-actions-builderSkill
- git-workflowSkill
- habit-builderSkill
- incident-postmortemSkill
- interview-prepSkill
- job-description-writerSkill
- json-schema-authorSkill
- kubernetes-manifest-authorSkill
- language-tutorSkill
- meal-plan-builderSkill
- meeting-summarizerSkill
- mermaid-diagram-builderSkill
- observability-setupSkill
- okr-writerSkill
- pandas-data-cleaningSkill
- people-dataSkill
- performance-profilerSkill
- personal-budget-plannerSkill
- presentation-builderSkill
- project-plannerSkill
- prompt-engineerSkill
- proofreaderSkill
- public-speaking-coachSkill
- rag-pipeline-designerSkill
- readme-generatorSkill
- refactoring-guideSkill
- regex-architectSkill
- release-notes-writerSkill
- resume-writerSkill
- salary-negotiatorSkill
- secrets-managerSkill
- secure-code-reviewSkill
- secure-password-policySkill
- The first 60 shown.
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
Reviews can't be read right now.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

