nginx Config Studio

Build a reverse proxy, SPA, PHP-FPM or HTTP-to-HTTPS redirect config from a form, or paste your nginx.conf to list syntax errors and easy-to-miss points. Everything runs in your browser and nginx is never executed.

On-device・No uploadMobile friendlyWorks offlineBeta

Your files and input are processed only inside your browser on this device and are never uploaded to our servers.

Site
Use case

e.g. example.com. Enter an internationalized domain in xn-- form (punycode).

How to serve
HTTPS and redirects

If empty, the standard location under /etc/letsencrypt/live/<domain>/ is used.

Compression and cache
Security headers
Access control and limits

If set, allow lines are written followed by deny all. Empty means no restriction.

Generated config
# nginx config (generated by LIBRA Works nginx Config Studio)
# Example location: /etc/nginx/conf.d/example.com.conf (a path loaded inside http {}). Before applying run `sudo nginx -t`, then `sudo systemctl reload nginx`.
# Certificate paths are examples. With certbot they are under /etc/letsencrypt/live/<domain>/.

server {
    listen 80;
    listen [::]:80;
    server_name example.com www.example.com;

    # For Let's Encrypt (HTTP-01). Use with certbot --webroot -w /var/www/certbot.
    location ^~ /.well-known/acme-challenge/ {
        root /var/www/certbot;
        default_type text/plain;
    }

    location / {
        return 301 https://example.com$request_uri;
    }
}

server {
    listen 443 ssl;
    listen [::]:443 ssl;
    http2 on;
    server_name www.example.com;
    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
    ssl_session_timeout 1d;
    ssl_session_cache shared:MozSSL:10m;
    ssl_session_tickets off;
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-CHACHA20-POLY1305;
    ssl_prefer_server_ciphers off;
    # DHE cipher suites are included, so create and point to a dhparam file: openssl dhparam -out /etc/nginx/dhparam.pem 2048
    ssl_dhparam /etc/nginx/dhparam.pem;
    return 301 https://example.com$request_uri;
}

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

    # TLS: equivalent to Mozilla Server Side TLS "intermediate" (TLS 1.2/1.3, based on guideline 5.7 as implemented on 2026-10-15; check the Mozilla generator for the latest).
    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
    ssl_session_timeout 1d;
    ssl_session_cache shared:MozSSL:10m;
    ssl_session_tickets off;
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-CHACHA20-POLY1305;
    ssl_prefer_server_ciphers off;
    # DHE cipher suites are included, so create and point to a dhparam file: openssl dhparam -out /etc/nginx/dhparam.pem 2048
    ssl_dhparam /etc/nginx/dhparam.pem;
    # http2 on; needs nginx 1.25.1 or later. On older versions write listen 443 ssl http2; instead.

    server_tokens off;
    client_max_body_size 10m;
    gzip on;
    gzip_comp_level 5;
    gzip_min_length 1024;
    gzip_vary on;
    gzip_proxied any;
    gzip_types text/plain text/css text/xml text/javascript application/javascript application/json application/xml application/rss+xml image/svg+xml font/ttf font/otf application/wasm;

    add_header Strict-Transport-Security "max-age=31536000" always;
    add_header X-Content-Type-Options "nosniff" always;
    add_header Referrer-Policy "strict-origin-when-cross-origin" always;
    # The CSP is a template only. Enabling it as is can break pages, so try Report-Only first and adjust.
    # add_header Content-Security-Policy "default-src 'self'; img-src 'self' data:; frame-ancestors 'self'" always;

    root /var/www/example.com/html;
    index index.html;

    # Do not serve hidden files (except .well-known)
    location ~ /\.(?!well-known) {
        deny all;
    }

    location / {
        try_files $uri $uri/ =404;
    }

    location ~* \.(?:css|js|mjs|map|jpe?g|png|gif|ico|svg|webp|avif|woff2?|ttf|otf|eot|mp4|webm)$ {
        expires 30d;
        access_log off;
        try_files $uri =404;
    }
}

The output is a template. Always run nginx -t in your own environment before applying it. This page does not run nginx or connect to any server.

How to use

  1. Form input
    Existing nginx.conf

    Fill in the form or paste a config

  2. proxy_pass, location, etc.Does not replace nginx -t

    Check syntax and points to review

  3. nginx.conf

    Output a tidied config

Build an nginx config from a form, and check a pasted config for points to review
  1. In “Generate”, choose a use case (static site, reverse proxy, SPA, PHP-FPM) and enter the domain name.

  2. Pick HTTPS, www handling, compression, caching, security headers and access limits; the config appears below. Invalid inputs show a reason per field.

  3. Press “Copy” or “Save”, run `sudo nginx -t` on your server, then apply it.

  4. To review an existing config, paste it into “Check config” (or press “Try the sample”) and read “Syntax” and “Points to check”.

  5. To tidy it, choose an indent in “Format” and take the result.

What it does

Forms per use case

Choose static site, reverse proxy (upstream, WebSocket, timeouts, X-Forwarded-*), SPA (try_files) or PHP-FPM. It covers HTTP→HTTPS redirect, www unification, the ACME challenge path, gzip / brotli, static file caching, allow/deny, a Basic auth template, limit_req and client_max_body_size.

TLS equivalent to Mozilla intermediate

TLS 1.2/1.3 and the cipher list follow Mozilla Server Side TLS "intermediate" (guideline 5.7). This is the implementation as of 2026-10-15; check the Mozilla generator for the latest.

Inputs are validated before output

Domains, paths, upstreams, sizes and IPs only accept fixed shapes, so a typed `;` or newline cannot turn into another directive.

Points to check, not verdicts

Lists, with line numbers, proxy_pass trailing slashes, alias vs root, if usage, location priority, add_header inheritance, duplicate server_name, listen 443 without ssl, HSTS preload, autoindex, server_tokens, and old TLS or weak ciphers.

Syntax from a tokenizer

Finds mismatched braces, missing semicolons, unclosed quotes and unknown directives, and outlines the server / location structure. Input is limited to 300,000 characters, 20,000 directives and 64 nesting levels.

Nothing is sent

The pasted config is processed only in your browser and not sent to a server. nginx is not run.

Use cases

  • Write a reverse proxy in front of a Node.js, Python or Go app, including WebSocket and timeouts
  • Write the HTTP-to-HTTPS 301 and www unification without breaking Let's Encrypt renewal
  • Find a missing brace or semicolon in an nginx.conf you were handed
  • Check whether proxy_pass trailing slashes, alias vs root or location priority shift paths
  • See whether an add_header in a child block drops the parent’s security headers
  • Unify the indentation of a config written in different styles by a team

Capability matrix

FeatureSupportNotes
Generate a config from a form (static, proxy, SPA, PHP-FPM, HTTPS redirect, headers, limits)Supported—
Syntax check of a pasted config (braces, semicolons, quotes, unknown directives)PartialOnly tokens and brace matching. Where a directive may appear, argument counts and value validity are not checked
Pointing out common mistakes (proxy_pass, alias, location, add_header, HSTS, TLS …)PartialBased on typical patterns. It can raise false alarms and miss things; it is not a verdict
Indentation formattingSupported—
Checking with a real nginx -tNot supportednginx is not run. Always run nginx -t on your own server before applying
Resolving include or reading other filesNot supportedinclude targets are not read; only the paths are listed
Connecting to servers, obtaining certificates or checking real responsesNot supportedNo network access
Inspecting the body of Lua and similar code blocksNot supportedKept as is and not inspected

Limits & notes

  • Pasted input is limited to 300,000 characters, 20,000 directives and 64 nesting levels.
  • The output is a template. Adjust certificate paths, dhparam, the PHP-FPM socket and the user/password file to your environment.
  • brotli needs the ngx_brotli module in nginx. http2 on; needs nginx 1.25.1 or later.
  • The PHP deny matches directory names you list (default uploads upload files media images) and covers only .php under them. Other extensions such as .phtml, and directories with other names, are not covered.
  • Basic auth and limit_req are set at server level and apply to every location. The HTTP-to-HTTPS redirect server is not protected, so credentials are never sent over plain HTTP.
  • The TLS settings are equivalent to Mozilla intermediate. They are not tuned for old browsers or operating systems.
  • The CSP is only a commented template and is not enabled.
  • “Points to check” are a guide from tokenizing; it can flag correct configs and miss real problems.

Privacy & safety

Generating, analyzing and formatting happen entirely in your browser. The config you enter, domain names and the generated config are never sent to or stored on a server, and nginx is not run.

FAQ

How do I write an nginx reverse proxy config?
In “Generate” choose “Reverse proxy” and enter the upstream (e.g. 127.0.0.1:3000). Besides proxy_pass it writes Host, X-Forwarded-For, X-Forwarded-Proto and X-Forwarded-Host, and if you ask, the WebSocket Upgrade headers and timeouts.
How do I redirect HTTP to HTTPS in nginx?
In the port 80 server write `return 301 https://your-domain$request_uri;`. This tool can also keep /.well-known/acme-challenge/ (used by Let's Encrypt renewal) out of the redirect. When you unify www, the other host is redirected to the same place with a 301.
What does a trailing slash on proxy_pass change?
If proxy_pass has a URI (even just /), the part matching the location is replaced by that URI when forwarding. Without a URI the path is passed as is. If the trailing / differs between location and proxy_pass, the path can come out with a shifted slash; “Check config” points this out.
Why do parent headers disappear when I add add_header?
In nginx, once a place such as a location has any add_header, add_header from the level above is not inherited (nginx 1.29.3 and later can change this with add_header_inherit). Repeat the headers in the child or put them in a shared include. “Check config” lists this pattern.
Can it replace nginx -t?
No. It only looks at braces, semicolons, quotes and a guide to common mistakes; it does not follow include, check where directives may appear, or validate values. Run nginx -t on your own server before applying.
Is my nginx.conf sent to a server?
No. It is processed only in your browser and is neither sent nor stored.

robots.txt Tester

Paste a robots.txt to see instantly whether a URL is allowed or blocked for Googlebot or AI crawlers, and which line decided it. Misspellings and directives Google ignores are flagged too.

No upload

MIME & Content-Type Studio

Search extensions and MIME types both ways, get problems in a Content-Type header pointed out, and compare a dropped file’s extension, browser file.type and real content. Server config drafts are generated too.

No upload

Certificate, CSR & PEM Studio

Reads PEM, DER (.cer/.crt), CSR and PKCS#7 (.p7b) and lists the subject, expiry (days left), SANs, public key, signature algorithm and SHA-256 fingerprint. It also checks chain order and signatures and converts PEM and DER. Everything runs in your browser and private keys are never read.

No uploadBeta

Secret Scanner

Paste text or drop config and code files to list likely secrets with file, line and rule before you publish or share them. Values are masked by default and you can save a copy with them replaced by ***. A helper only — it cannot guarantee that nothing is missed.

No upload

curl Converter

Paste “Copy as cURL” from Chrome or Firefox to see the method, URL, headers, cookies and body in tables, then convert to 12 kinds of code. The request is never sent and everything runs in your browser. Authorization and cookies can be hidden before you share.

No uploadBeta

Docker Compose Studio

Convert docker run commands to compose.yaml, or compose.yaml back to docker run. A compose file is checked for syntax, the Compose Specification and common mistakes, and security points worth confirming are listed. Nothing is started or pulled, and your input never leaves your device.

No uploadBeta

Last updated: