<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Nginx on 041 Blog</title><link>https://www.iam041.com/tags/nginx/</link><description>Recent content in Nginx on 041 Blog</description><generator>Hugo</generator><language>zh_CN</language><lastBuildDate>Fri, 14 Aug 2026 00:00:00 +0800</lastBuildDate><atom:link href="https://www.iam041.com/tags/nginx/index.xml" rel="self" type="application/rss+xml"/><item><title>Nginx配置防盗链</title><link>https://www.iam041.com/posts/nginx-image-hotlink-protection/</link><pubDate>Fri, 14 Aug 2026 00:00:00 +0800</pubDate><guid>https://www.iam041.com/posts/nginx-image-hotlink-protection/</guid><description>&lt;p&gt;我们在日常浏览网页时，偶尔会遇到图片裂开的情况；若试着在新标签页中单独打开该图片的链接，浏览器可能会弹出一个 &lt;strong&gt;403 Forbidden（禁止访问）&lt;/strong&gt; 的错误提示。这通常意味着：当前网页并未在自己的服务器上托管这张图片，而是直接在外链中引用了其他站点的资源。被引用的源站为了保护自身的服务器资源与出口带宽，通过 Nginx 识别出了此类未经授权的外部请求，并主动返回了 403 拒绝访问。&lt;/p&gt;&#10;&lt;p&gt;这种用来防范外部网站直接引用本站静态资源的保护机制，就是我们常说的 &lt;strong&gt;Nginx 防盗链（Anti-Hotlinking）&lt;/strong&gt;。&lt;/p&gt;&#10;&lt;p&gt; &lt;/p&gt;&#10;&lt;h2 id="1-原理浅析http-referer"&gt;1. 原理浅析：HTTP Referer&lt;/h2&gt;&#10;&lt;hr&gt;&#10;&lt;p&gt;浏览器在加载网页内的图片、音视频等资源时，遵循 HTTP 协议规范，通常会在请求头中自动附带一个 Referer 字段，用于告知服务端“这个资源请求是从哪个网页发起的”。&lt;/p&gt;&#10;&lt;p&gt;例如，当用户在第三方网站 &lt;a href="https://other-site.com"&gt;https://other-site.com&lt;/a&gt; 浏览时，页面加载了本站的图片，浏览器向本站发出的请求大致如下：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-http" data-lang="http"&gt;&lt;span style="display:flex;"&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;1&lt;/span&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;GET&lt;/span&gt; /logo.png &lt;span style="color:#66d9ef"&gt;HTTP&lt;/span&gt;&lt;span style="color:#f92672"&gt;/&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;1.1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;2&lt;/span&gt;&lt;span&gt;Host&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;your-domain.com&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;3&lt;/span&gt;&lt;span&gt;Referer&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;https://other-site.com/page.html&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Nginx 正是通过内置的 ngx_http_referer_module 模块，提取请求头中的 Referer 并与我们设定的白名单进行比对，从而判断请求来源是否合规。&lt;/p&gt;&#10;&lt;p&gt;不过，Referer 可能因为浏览器隐私策略、Referrer-Policy、代理或浏览器扩展而缺失，也可以被客户端伪造。因此，Referer 防盗链适合做粗粒度限制，不应作为身份认证或强安全边界。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;注意事项&lt;/strong&gt;：不要把 Referer 白名单当成搜索引擎认证。因为搜索引擎抓取图片时不一定会携带 Referer。本例保留 none，已经允许无来源头的正常请求；如果确实遇到特定爬虫无法访问，应先结合实际请求日志排查，再按业务需要增加白名单。仅凭 Referer 域名无法可靠证明请求来自搜索引擎，也不能单独保证 SEO 效果。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt; &lt;/p&gt;&#10;&lt;h2 id="2-解决方案"&gt;2. 解决方案&lt;/h2&gt;&#10;&lt;hr&gt;&#10;&lt;p&gt;为了兼顾系统安全与业务体验，针对未经许可的外部引用，Nginx 通常有两种主流的配置策略：&lt;/p&gt;&#10;&lt;h3 id="21-直接返回-403-状态码更轻量最省带宽"&gt;2.1 直接返回 403 状态码（更轻量、最省带宽）&lt;/h3&gt;&#10;&lt;p&gt;发现请求来源不合规时立即切断响应，不给对方传输多余数据，这是大多数生产环境的首选方案。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-nginx" data-lang="nginx"&gt;&lt;span style="display:flex;"&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 1&lt;/span&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 图片与多媒体资源防盗链配置&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 2&lt;/span&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;location&lt;/span&gt; ~&lt;span style="color:#e6db74"&gt;*&lt;/span&gt; &lt;span style="color:#e6db74"&gt;\.(gif|jpg|jpeg|png|bmp|webp|avif|svg|mp4|mov)&lt;/span&gt;$ {&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 3&lt;/span&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# 仅对 URL 带版本指纹的静态资源使用 immutable&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 4&lt;/span&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# 使用单个 Cache-Control 头，避免与 expires 重复设置缓存策略&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 5&lt;/span&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;expires&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;off&lt;/span&gt;;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 6&lt;/span&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;add_header&lt;/span&gt; &lt;span style="color:#e6db74"&gt;Cache-Control&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;public,&lt;/span&gt; &lt;span style="color:#e6db74"&gt;max-age=2592000,&lt;/span&gt; &lt;span style="color:#e6db74"&gt;immutable&amp;#34;&lt;/span&gt;;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 7&lt;/span&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 8&lt;/span&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# 流量很大时可关闭；如需审计或排查盗链，请保留日志或改用条件日志&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 9&lt;/span&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;access_log&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;off&lt;/span&gt;;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;10&lt;/span&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;11&lt;/span&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# 合法 Referer 白名单配置：&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;12&lt;/span&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# - none: 允许直接在浏览器地址栏打开或从书签访问（无 Referer）&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;13&lt;/span&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# - server_names: 自动匹配本 server 声明的所有合法域名&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;14&lt;/span&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# - *.example.com: 放行 example.com 下的子域名&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;15&lt;/span&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;valid_referers&lt;/span&gt; &lt;span style="color:#e6db74"&gt;none&lt;/span&gt; &lt;span style="color:#e6db74"&gt;server_names&lt;/span&gt; &lt;span style="color:#e6db74"&gt;*.example.com&lt;/span&gt;;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;16&lt;/span&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;17&lt;/span&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# 非法来源直接返回 403 阻断&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;18&lt;/span&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;if&lt;/span&gt; &lt;span style="color:#e6db74"&gt;(&lt;/span&gt;$invalid_referer&lt;span style="color:#e6db74"&gt;)&lt;/span&gt; {&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;19&lt;/span&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;return&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;403&lt;/span&gt;;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;20&lt;/span&gt;&lt;span&gt; }&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;21&lt;/span&gt;&lt;span&gt;}&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;核心参数说明&lt;/strong&gt;：&lt;/p&gt;</description></item><item><title>Nginx 快速入门</title><link>https://www.iam041.com/posts/nginx-quick-start/</link><pubDate>Thu, 13 Aug 2026 22:00:00 +0800</pubDate><guid>https://www.iam041.com/posts/nginx-quick-start/</guid><description>&lt;p&gt; &lt;/p&gt;&#10;&lt;h2 id="1-nginx-简介"&gt;1. Nginx 简介&lt;/h2&gt;&#10;&lt;hr&gt;&#10;&lt;p&gt;在现代 Web 架构中，Nginx 往往是流量到达服务器的第一道门面。它兼具极高的吞吐能力与轻量资源消耗，常用于静态站点分发与后端服务网关接入。&lt;/p&gt;&#10;&lt;h3 id="11-什么是-nginx"&gt;1.1 什么是 Nginx&lt;/h3&gt;&#10;&lt;p&gt;Nginx 是一款开源、高性能的 HTTP 服务器与反向代理服务器，核心架构基于单 Master 多 Worker 的&lt;strong&gt;异步非阻塞事件驱动模型&lt;/strong&gt;（Linux 环境下使用 epoll）。&lt;/p&gt;&#10;&lt;p&gt;其核心能力：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;静态资源直出&lt;/strong&gt;：高效托管 HTML、CSS、JS 及各类多媒体文件，直接经由内核零拷贝响应，释放后端算力。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;反向代理与流量分发&lt;/strong&gt;：作为内部集群的前置入口，对外暴露统一端口，无感转发后端请求。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;虚拟主机路由&lt;/strong&gt;：支持基于单个端口配置多个域名（Server Name），实现单机多站点的精细隔离。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;平滑热升级&lt;/strong&gt;：内置优秀的信号处理机制，修改配置与更新二进制无需停机，实现零感知运维。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt; &lt;/p&gt;&#10;&lt;h2 id="2-nginx-安装与启动"&gt;2. Nginx 安装与启动&lt;/h2&gt;&#10;&lt;hr&gt;&#10;&lt;h3 id="21-包管理器安装"&gt;2.1 包管理器安装&lt;/h3&gt;&#10;&lt;p&gt;(1) &lt;strong&gt;系统包管理器（推荐日常使用）&lt;/strong&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;Ubuntu / Debian&lt;/strong&gt;：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;1&lt;/span&gt;&lt;span&gt;sudo apt update&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;2&lt;/span&gt;&lt;span&gt;sudo apt install -y nginx&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;CentOS / RHEL&lt;/strong&gt;：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;1&lt;/span&gt;&lt;span&gt;sudo yum install -y epel-release&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;2&lt;/span&gt;&lt;span&gt;sudo yum install -y nginx&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;macOS&lt;/strong&gt;：&lt;/p&gt;</description></item></channel></rss>