<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Gixy</title>
    <description>The latest articles on DEV Community by Gixy (@gixy).</description>
    <link>https://dev.to/gixy</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3690301%2F8c402d98-640c-4769-bd3f-55aef34f970a.png</url>
      <title>DEV Community: Gixy</title>
      <link>https://dev.to/gixy</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/gixy"/>
    <language>en</language>
    <item>
      <title>Gixy-Next: NGINX Configuration Misconfiguration Scanner</title>
      <dc:creator>Gixy</dc:creator>
      <pubDate>Fri, 02 Jan 2026 17:54:33 +0000</pubDate>
      <link>https://dev.to/gixy/gixy-next-nginx-configuration-misconfiguration-scanner-143b</link>
      <guid>https://dev.to/gixy/gixy-next-nginx-configuration-misconfiguration-scanner-143b</guid>
      <description>&lt;p&gt;Most of us have run &lt;code&gt;nginx -t&lt;/code&gt; and called it a day. But syntax-valid configs can still be &lt;em&gt;dangerous&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;This post is a hands-on intro to &lt;strong&gt;&lt;a href="https://github.com/megamansec/gixy-next" rel="noopener noreferrer"&gt;Gixy-Next&lt;/a&gt;&lt;/strong&gt;, an open source static analyzer for &lt;code&gt;nginx.conf&lt;/code&gt; that looks for security misconfigurations, hardening gaps, and common footguns &lt;em&gt;before&lt;/em&gt; they reach production.&lt;/p&gt;

&lt;p&gt;If you operate NGINX at scale (or just want fewer 2am surprises), this tool is a nice "shift-left" safety net.&lt;/p&gt;




&lt;h2&gt;
  
  
  What is Gixy-Next?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Gixy-Next&lt;/strong&gt; is a maintained fork in the "Gixy family" of NGINX configuration analyzers. It scans your configuration &lt;em&gt;statically&lt;/em&gt; (no need to run NGINX) and reports findings with severity levels and actionable context.&lt;/p&gt;

&lt;p&gt;It started as a fork of Yandex's original &lt;strong&gt;Gixy&lt;/strong&gt; (first released in 2017), which is now unmaintained and not great with modern Python/NGINX realities. Gixy-Next exists to keep the project healthy: modern Python support, bug fixes, improved detection logic, and a focus on maintainable, reviewable changes.&lt;/p&gt;




&lt;h2&gt;
  
  
  Quick start
&lt;/h2&gt;

&lt;p&gt;Install:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip3 &lt;span class="nb"&gt;install &lt;/span&gt;gixy-next
&lt;span class="c"&gt;# or, if you use uv:&lt;/span&gt;
uv pip &lt;span class="nb"&gt;install &lt;/span&gt;gixy-next
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Run it (defaults to &lt;code&gt;/etc/nginx/nginx.conf&lt;/code&gt;):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;gixy
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or point it at a file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;gixy /opt/nginx.conf
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Tip: scan the &lt;em&gt;fully rendered&lt;/em&gt; config (includes resolved) out-of-band
&lt;/h3&gt;

&lt;p&gt;NGINX configs often sprawl across many &lt;code&gt;include&lt;/code&gt; files. A reliable approach is to dump the entire rendered configuration and scan that artifact on a different system than that running NGINX:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# dump the fully rendered NGINX configuration on one system&lt;/span&gt;
nginx &lt;span class="nt"&gt;-T&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; ./nginx-dump.conf

&lt;span class="c"&gt;# run gixy on another system, just with that single file (which will be treated as various files as if they existed on a disk)&lt;/span&gt;
gixy ./nginx-dump.conf

&lt;span class="c"&gt;# or via stdin:&lt;/span&gt;
&lt;span class="nb"&gt;cat&lt;/span&gt; ./nginx-dump.conf | gixy -
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  What it catches (examples)
&lt;/h2&gt;

&lt;p&gt;Gixy-Next ships with a ton of plugins that detect a wide range of issues. A few examples you might care about:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;HTTP response splitting hazards&lt;/li&gt;
&lt;li&gt;SSRF-style proxy misconfigurations&lt;/li&gt;
&lt;li&gt;Host header spoofing risks&lt;/li&gt;
&lt;li&gt;Alias path traversal gotchas&lt;/li&gt;
&lt;li&gt;Weak referer/origin validation&lt;/li&gt;
&lt;li&gt;Unanchored regex patterns and ReDoS risk&lt;/li&gt;
&lt;li&gt;Risky DNS resolver configurations&lt;/li&gt;
&lt;li&gt;Version disclosure via &lt;code&gt;server_tokens&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Misleading "looks fine" patterns like &lt;code&gt;if&lt;/code&gt; usage in &lt;code&gt;location&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You can browse the full plugin list in the &lt;a href="https://gixy.io/" rel="noopener noreferrer"&gt;Gixy-Next documentation&lt;/a&gt;, but the main point is: it finds the kinds of problems that are easy to mess up or just completely miss&lt;/p&gt;




&lt;h2&gt;
  
  
  Tune the signal: run only what you want
&lt;/h2&gt;

&lt;p&gt;Run a focused subset of checks:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;gixy &lt;span class="nt"&gt;--tests&lt;/span&gt; http_splitting,ssrf,version_disclosure
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Skip noisy checks:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;gixy &lt;span class="nt"&gt;--skips&lt;/span&gt; low_keepalive_requests,worker_rlimit_nofile_vs_connections
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Filter by severity (compounding &lt;code&gt;-l&lt;/code&gt;):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# -l  = LOW and higher&lt;/span&gt;
&lt;span class="c"&gt;# -ll = MEDIUM and higher&lt;/span&gt;
&lt;span class="c"&gt;# -lll = HIGH only&lt;/span&gt;
gixy &lt;span class="nt"&gt;-ll&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Output formats: human-friendly and machine-friendly
&lt;/h2&gt;

&lt;p&gt;By default the output is ANSI-colored for terminals. If you want plain text:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;gixy &lt;span class="nt"&gt;-f&lt;/span&gt; text
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you want JSON (perfect for CI pipelines and dashboards):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;gixy &lt;span class="nt"&gt;-f&lt;/span&gt; json ./nginx-dump.conf
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The JSON includes fields like &lt;code&gt;plugin&lt;/code&gt;, &lt;code&gt;severity&lt;/code&gt;, &lt;code&gt;file&lt;/code&gt;, &lt;code&gt;line&lt;/code&gt;, &lt;code&gt;reason&lt;/code&gt;, and a &lt;code&gt;reference&lt;/code&gt; link for the specific check.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why I like this approach
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;It complements code review: reviewers focus on intent, the scanner catches patterns.&lt;/li&gt;
&lt;li&gt;It turns "tribal knowledge" hardening rules into repeatable checks.&lt;/li&gt;
&lt;li&gt;It fits modern workflows: run locally, run in CI, track over time.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Contributing / feedback
&lt;/h2&gt;

&lt;p&gt;If you run into a config pattern that should be detected but is missed, open an issue with a minimal reproducible snippet. New plugins and improvements are welcome.&lt;/p&gt;

</description>
      <category>nginx</category>
      <category>webdev</category>
      <category>devops</category>
    </item>
  </channel>
</rss>
