ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

Nginx 完全指南:反向代理、负载均衡与多项目部署实战

2026/9/14 4:14:40 拓冰建站 浏览量
Nginx 完全指南:反向代理、负载均衡与多项目部署实战 我们先从一张最常见的截图说起你搜“Nginx 能做什么”翻出来的结果一半是概念解释另一半是“反向代理”“负载均衡”“静态服务器”这些词看完好像懂了真到部署项目时又不知道从哪下手。Nginx 的本质就是一个高性能的 HTTP 服务器和反向代理服务器但它的应用场景远不止“跑一个网站”这么简单。我自己用过它做过静态资源托管、API 网关、多项目共存、负载均衡也踩过日志切割、端口被占、离线装依赖这些坑。这篇文章就把 Nginx 能做的事情完整捋一遍从部署方式到配置语法从反向代理到多项目共存再把实操中容易翻车的地方一并说清楚。如果你正好在学 Nginx或者手头有一个项目要用 Nginx 上线这篇文章适合从头看到尾。如果你已经会基本配置可以直接跳到第 4、5 部分那部分内容偏向实战细节和排查经验。1. Nginx 的核心能力与设计思路1.1 反向代理到底在“代理”什么很多人一开始搞不清正向代理和反向代理的区别。正向代理是替客户端干活比如你在浏览器里配置代理访问外部资源服务器不知道真正请求的人是谁。反向代理是替服务器干活客户端访问的是 NginxNginx 再把请求转发给后面的真实服务客户端完全感知不到后端的存在。用生活化的方式理解你去餐厅吃饭不需要知道后厨有几个厨师、菜是哪口锅炒的你只跟服务员沟通。服务员就是反向代理后厨就是后端服务器。有了这层代理能带来几个实际好处后端服务可以隐藏真实 IP 和端口外部只能看到 Nginx 的地址。可以在 Nginx 层统一做 HTTPS 证书配置后端服务不用各搞一套。可以在代理层做请求过滤、访问控制、限流不用改业务代码。可以把多个后端服务聚合到一个入口按路径或域名分发。很多项目的架构演进最开始是“一个服务一个 IP”后来变成“多个服务一个入口”这中间的核心组件就是反向代理。1.2 负载均衡不只是“多台服务器分摊流量”负载均衡听起来很高大上其实做的事情很简单把请求按照一定策略分发给多台后端服务器避免某一台机器压力过大。Nginx 默认支持几种策略轮询round-robin请求依次发给每台后端默认方式。权重weight按权重比例分配适合后端机器性能不一致的场景。IP hash按客户端 IP 计算 hash同一个 IP 的请求始终打到同一台后端适合需要保持会话的场景。least_conn优先分发给当前连接数最少的后端适合长连接较多的服务。实际项目中轮询和权重用得最多。IP hash 在早期没有 Redis 共享 Session 时很常见现在分布式架构下用得少了但还是有适用场景。这里的核心观点是负载均衡不是把流量“平均分”就完事了还要考虑后端健康状态。Nginx 默认如果某台后端挂了会把请求分给其他后端但这个过程有一定延迟。配合健康检查模块能做到更及时的故障摘除。1.3 动静分离让 Nginx 干它最擅长的事Nginx 处理静态文件的效率非常高因为它基于事件驱动模型不依赖多线程处理请求。而大多数后端框架Java、Python、Node处理静态文件的效率远不如 Nginx。动静分离就是把图片、CSS、JS、字体这类静态资源交给 Nginx 直接返回动态请求API、页面渲染才转发给后端服务。这样做的好处很明显静态资源响应速度更快Nginx 可以直接用 sendfile 系统调用零拷贝传输文件。后端服务压力更小不用浪费时间处理静态文件。配合浏览器缓存策略静态资源可以设置过期时间用户二次访问时直接从本地缓存加载。实际部署时通常会在 Nginx 里配置一个 location 规则匹配静态资源路径然后 root 指向静态文件目录。如果项目本身已经是前后端分离架构前端构建产物是纯静态文件那就更简单了直接让 Nginx 托管整个 dist 目录。2. 主流部署方式与适用场景2.1 包管理器安装最快的上手指南不同系统安装 Nginx 的方式不一样但思路一致用系统自带的包管理器装装完就能用。CentOS / RHEL 系列yum install -y nginx # 或者 dnf install -y nginxUbuntu / Debian 系列apt update apt install -y nginxWindows 系统则是直接去官网下载 zip 包解压运行没有安装过程。解压后进入目录执行start nginx进程就在后台跑起来了。关闭用nginx -s stop重载配置用nginx -s reload。包管理器安装的版本可能不是最新的但足够稳定。对大多数生产环境来说稳定优先于新功能所以这种方式反而更适合线上使用。2.2 编译安装为了模块不只为了“最新版”有些场景必须自己编译最常见的原因是内核版本、架构特殊或者需要添加官方二进制包中没有的模块。比如标题里提到的“Nginx aarch64 移植”“CentOS 离线安装 nginx”以及需要集成第三方模块的场景都绕不开编译安装。编译安装的核心步骤分四步下载源码、配置编译参数、编译、安装。# 1. 下载源码示例版本 1.24.0 wget http://nginx.org/download/nginx-1.24.0.tar.gz tar -zxvf nginx-1.24.0.tar.gz cd nginx-1.24.0 # 2. 配置编译参数 ./configure --prefix/usr/local/nginx \ --with-http_ssl_module \ --with-http_stub_status_module \ --with-http_gzip_static_module # 3. 编译 make -j$(nproc) # 4. 安装 make install编译参数里最常用的是--with-http_ssl_module开启 HTTPS 支持。如果你没有加这个模块后面配置 SSL 证书时会直接报错。这里要提醒一句编译安装时请留意系统架构。在 x86 上编译的二进制不能直接拿到 ARM 机器跑所以“aarch64 移植”本质就是在目标机器上重新编译一遍或者用交叉编译工具链处理前者更省事。2.3 Docker 部署一条命令拉起来的快乐Docker 方式是我自己最喜欢的部署方式因为不用关心宿主机环境差异。只要装了 Docker一条命令就能把 Nginx 跑起来。docker pull nginx:1.21.5 docker run -d --name nginx-web -p 80:80 nginx:1.21.5这里用docker pull nginx:1.21.5是因为项目需要固定版本避免最新版行为变化导致问题。生产环境建议也固定版本不要用latest。真实项目里不会只跑一个默认容器更多是把配置文件和静态资源挂载进去docker run -d \ --name nginx-web \ -p 80:80 \ -p 443:443 \ -v /data/nginx/conf/nginx.conf:/etc/nginx/nginx.conf:ro \ -v /data/nginx/conf.d:/etc/nginx/conf.d:ro \ -v /data/nginx/html:/usr/share/nginx/html \ -v /data/nginx/logs:/var/log/nginx \ nginx:1.21.5这样配置、日志、静态文件都在宿主机上方便修改和查看。-v后面的冒号前面是宿主机路径后面是容器内路径顺序不要写反。Docker 部署还有一个隐藏福利升级 Nginx 版本时不用动宿主机环境拉一个新镜像、替换容器就行了。但要注意Docker 容器内修改配置后需要重启或 reloaddocker exec nginx-web nginx -s reload可以热加载配置。2.4 开机自启让服务重启后自动恢复服务器重启后 Nginx 不会自己启动需要手动拉起。在 Linux 上用 systemd 管理非常方便。CentOS 7 / Ubuntu 16.04 都支持 systemd。如果 Nginx 是 yum/apt 装的通常已经内置了 systemd 服务文件直接启用即可systemctl enable nginx systemctl start nginx如果是编译安装的需要自己写一个 service 文件。我在/etc/systemd/system/nginx.service下创建如下内容[Unit] Descriptionnginx web server Afternetwork.target [Service] Typeforking ExecStart/usr/local/nginx/sbin/nginx ExecReload/usr/local/nginx/sbin/nginx -s reload ExecStop/usr/local/nginx/sbin/nginx -s quit PIDFile/usr/local/nginx/logs/nginx.pid [Install] WantedBymulti-user.target关键点是Typeforking因为 Nginx 启动时会 fork 出 master 和 worker 进程主进程退出systemd 需要靠 PIDFile 找到实际 master 进程。PIDFile 路径必须跟nginx.conf中的pid指令一致否则 systemctl status 会提示 PID 文件不匹配。Ubuntu 上还有一种传统方式是update-rc.d但那是 init.d 时代的做法现在新系统都推荐 systemd。3. 配置文件的骨架与必备操作3.1 nginx.conf 主配置结构Nginx 的配置文件核心就是nginx.conf它的结构可以拆成几个大块worker_processes 1; # 工作进程数一般等于 CPU 核数 events { worker_connections 1024; # 每个进程最大连接数 } http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; server { listen 80; server_name localhost; location / { root html; index index.html index.htm; } } }worker_processes和worker_connections是性能相关的两个核心参数。worker_processes通常设置为 CPU 核数worker_connections表示每个 worker 能同时处理的连接数。两者相乘再乘以 worker 数基本就是 Nginx 能支撑的最大并发连接数。include mime.types的作用是告诉 Nginx 不同类型文件的 Content-Type没有它JS、CSS 文件可能被浏览器当成纯文本下载。实际生产环境不会把服务配置全写在 nginx.conf 里而是通过include引入conf.d目录下的独立配置文件这样不同站点之间互不干扰改一个不影响其他。3.2 端口配置从 80 到其他端口的正确改法默认 Nginx 监听 80 端口。当 80 端口被其他程序占用或者安全策略要求换端口时就需要修改监听端口。修改位置在 server 模块server { listen 8080; server_name localhost; ... }修改完执行nginx -t检查语法然后nginx -s reload使配置生效。这里容易踩的坑有两个第一改完端口后访问不通先确认防火墙和云安全组是否放行了新端口。很多人在服务器本地 curl 是通的但外网访问不了八成是云控制台的安全组规则没有加。第二如果 Nginx 是从 Docker 容器跑的除了容器内的 Nginx 配置还要改容器端口映射。比如容器内监听 8080宿主机想用 8081 对外docker run 时的-p 8081:8080就要相应调整。Windows Server 下改端口的方式和 Linux 完全一样改配置文件、重载即可。但要注意 Windows 下没有nginx -s reload有时不生效的情况我遇到过配置文件改了但进程没重载最后直接nginx -s stop再start nginx才生效。稳妥起见Windows 下改完配置建议完全重启。3.3 server 模块一台机器部署多个 web 项目Nginx 最实用的能力之一就是在一台服务器上同时跑多个网站或项目互不影响。实现方式有两种方式一不同端口区分server { listen 8081; server_name localhost; root /data/project-a/dist; index index.html; } server { listen 8082; server_name localhost; root /data/project-b/dist; index index.html; }方式二同一个端口用不同域名区分server { listen 80; server_name project-a.example.com; root /data/project-a/dist; } server { listen 80; server_name project-b.example.com; root /data/project-b/dist; }域名方式更常见也更干净。用户访问 A 域名时进 A 项目访问 B 域名时进 B 项目就像多个人合租一套房子各自有独立房间互不打扰。部署多个项目时有一个高频问题如果其中一个项目是 Vue3 之类的前端应用它用到了 history 路由刷新页面会 404。原因很简单nginx 在对应的路径下找不到这个前端路由的物理文件返回 404。解决方案是加 try_fileslocation / { root /data/project-a/dist; index index.html; try_files $uri $uri/ /index.html; }try_files $uri $uri/ /index.html的意思是先找磁盘上有没有对应该 URI 的真实文件没有再找对应目录都没有就统一返回 index.html让前端路由接管处理。前端框架拿到 index.html 后会自己去解析 URL 并渲染对应页面。这段配置我每次部署 Vue 项目都会加也算是个必记配置项。3.4 日志路径与切割策略Nginx 的日志默认写在logs/access.log和logs/error.log。编译安装时可以通过--prefix指定根目录日志就在$prefix/logs下。yum/apt 安装的通常把日志写到/var/log/nginx/下。自定义日志路径也很简单access_log /data/logs/nginx/access.log main; error_log /data/logs/nginx/error.log warn;main是对日志格式的引用格式在 http 块里用 log_format 定义。默认的 main 格式已经包含客户端 IP、时间、请求方法、状态码、响应字节数等信息够日常排查用。日志最大的问题是会无限增长时间久了把磁盘撑爆。运维角度必须做日志切割。Linux 下最简单的方案是用 logrotate# /etc/logrotate.d/nginx /data/logs/nginx/*.log { daily rotate 30 compress delaycompress missingok notifempty create 644 nginx nginx sharedscripts postrotate [ -f /var/run/nginx.pid ] kill -USR1 cat /var/run/nginx.pid endscript }kill -USR1是让 Nginx 重新打开日志文件。如果不执行这一步Nginx 会继续往被重命名的旧文件里写日志切割就白做了。这是新手最常踩的坑。Docker 部署时的日志处理更简单容器日志默认会写入宿主机的 Docker 日志目录可以通过docker logs查看也可以通过 logrotate 对 Docker 日志目录做切割。或者干脆把 Nginx 日志直接挂载到宿主机目录用宿主机上的 logrotate 管理。4. 实战场景反向代理、负载均衡与多项目共存4.1 反向代理配置与五元组信息问题反向代理的标准配置格式server { listen 80; server_name api.example.com; location / { proxy_pass http://192.168.1.10:8080; 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_pass指定后端服务地址。关键问题在于请求经过 Nginx 代理后后端服务看到的 IP 是谁的答案是后端看到的 TCP 连接来源 IP 是 Nginx 服务器的 IP不是真实客户端 IP。因为代理是转发不是透传。TCP 层根本没有真实客户端 IP 信息TCP 头部只包含源 IP、目标 IP、源端口、目标端口和协议号五元组。所以 Nginx 需要在 HTTP 头里把客户端 IP 信息告诉后端这就是X-Real-IP和X-Forwarded-For这两个头存在的意义。后端应用读取这两个 Header 才能拿到客户端真实 IP。如果你问“ip 头部的五元组信息 nginx 转发会带吗”答案分两层传输层五元组不会带因为代理建立了新的 TCP 连接。应用层会通过自定义 Header 带上原始 IP 信息前提是你在 Nginx 里做了如上配置。还有一个细节X-Forwarded-For是一个追加型 Header。如果请求本身就是从某个代理转发过来的Nginx 会把上一级的 IP 追加在后面形成客户端IP, 上一级代理IP的格式。后端解析时如果只取第一个 IP一般就是最真实的客户端地址除非客户端伪造了这个 Header。安全要求较高的场景需要结合防火墙或更复杂的信任链来判断。4.2 负载均衡核心配置实操负载均衡的配置在 upstream 块中定义一组后端服务器upstream backend_servers { server 192.168.1.11:8080 weight3; server 192.168.1.12:8080 weight1; server 192.168.1.13:8080 backup; } server { listen 80; server_name web.example.com; location / { proxy_pass http://backend_servers; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } }这里的weight3表示第一台机器分配三倍于第二台的请求量适合机器配置不对等的场景。backup表示备用服务器平时不接流量只有其他后端全部不可用时才启用。配置负载均衡时要注意几个细节proxy_pass后面的地址如果带 URI比如http://backend_servers/api/location 匹配的路径会被替换。不带 URI 则是完整转发。这个差异容易让人困惑我一般只写 host 不写路径避免各种奇怪的路径拼接问题。后端服务如果是 HTTPNginx 就用 http 方式转发如果是 HTTPSproxy_pass要写https://协议前缀。混合协议场景需要特别注意证书验证问题。如果后端服务慢Nginx 默认会一直等。可以配proxy_connect_timeout、proxy_read_timeout来控制超时时间避免请求长时间挂起。4.3 部署前后端分离项目Vue3 Nginx 实践前后端分离是目前最常见的部署模式前端构建出静态文件后端提供 API 接口。部署时可以利用 Nginx 在同一个站点里同时处理静态资源和 API 转发。假设前端打包产物在/data/vue3-project/dist后端 API 在http://192.168.1.100:9000配置如下server { listen 80; server_name app.example.com; # 前端静态资源 root /data/vue3-project/dist; index index.html; location / { try_files $uri $uri/ /index.html; } # API 反向代理 location /api/ { proxy_pass http://192.168.1.100:9000; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } # 静态资源缓存 location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff2?)$ { expires 7d; add_header Cache-Control public, no-transform; } }这里面有几个实用的设计try_files解决 Vue Router history 模式刷新 404 问题。/api/路径的请求全部转发给后端前端代码里统一用/api作为接口前缀。静态资源单独配expires 7d浏览器会缓存 7 天。如果前端发版后希望用户尽快拿到新版本可以用带 hash 的文件名文件名变了 URL 就变了缓存自动失效。部署 Windows Server 时要注意路径写法root指向D:\project\dist这种路径时Nginx 配置文件里用正斜杠/也能识别。另外 Windows 下 Nginx 不支持像 Linux 那样优雅地处理某些信号重载配置偶尔不生效建议修改配置文件后执行nginx -s stop start nginx确保进程完全重启。4.4 可视化配置工具适合谁用Nginx 配置对新手最大的门槛是语法不熟、配置结构混乱。可视化配置工具能帮你自动生成配置降低上手难度。常见的开源工具里nginxWebUI 和 Nginx Proxy Manager 是比较多人用的。Nginx Proxy Manager基于 Docker 部署界面清爽支持申请 Let‘s Encrypt 证书适合个人项目和小团队。nginxWebUI国内开发者维护后端用 Java功能更全面支持在线修改配置、证书申请、负载均衡维护等。可视化工具适合的场景是不想记语法、项目规模不大、改配置频次低。但对一个想真正掌握 Nginx 的人来说我还是建议至少手写一遍配置文件知道每一步什么意思。工具能生成配置但不能帮你理解问题。5. 常见问题与排查技巧5.1nginx: 未找到命令的几种原因输入nginx -v提示命令找不到既不是 Nginx 没装也不是装坏了。一般原因只有两个第一Nginx 安装了但没加入 PATH。编译安装默认装到/usr/local/nginx/sbin/nginx这个路径不在 PATH 里系统找不到。解决办法# 方法一直接用全路径 /usr/local/nginx/sbin/nginx -v # 方法二建立软链接 ln -s /usr/local/nginx/sbin/nginx /usr/local/bin/nginx第二包管理器确实没装过。那就按上一节介绍的安装方法操作一遍。实际排查时可以用find / -name nginx -type f全盘找一下确认二进制是否存在。如果是自己编译的留意编译时的--prefix参数/usr/local/nginx是默认值也可以改成其他路径。5.2 离线安装时依赖怎么解决内网环境或者系统版本较老的服务器经常没法直接yum install或apt install这时候就要离线安装。思路分两步第一步在一台能联网的同系统机器上用包管理器把 Nginx 以及所有依赖的 rpm 包下载到本地。# CentOS 7 / 8 系列 yum install --downloadonly --downloaddir/data/nginx-rpms nginx不同版本的包管理器参数有所差异CentOS 8 用 dnf 的话则写成dnf install --downloadonly --downloaddir/data/nginx-rpms nginx第二步把下载目录打包拷到离线服务器上本地安装rpm -Uvh /data/nginx-rpms/*.rpm注意这里的-Uvh是升级安装可以处理依赖顺序。如果 rpm 安装时提示依赖冲突可以用--nodeps --force强制安装但只在确认依赖已经手动满足时才建议使用。如果是编译安装离线环境下最大的麻烦是缺少 gcc、make、pcre-devel、zlib-devel、openssl-devel 这些编译工具链和依赖库。解决方案有两个层次系统有 yum 源时先用yum install -y gcc make pcre-devel zlib-devel openssl-devel把编译依赖装齐。系统完全离线时只能从带依赖的 rpm 包手动逐个安装或者在能联网的机器上把编译好的 Nginx 整个目录包括配置文件、日志目录打包拷贝过去。“CentOS 8 离线安装 nginx 下载相关依赖整合包”这种需求本质就是上面说的流程依赖整合包就是把你需要所有的 rpm 包全部下载好一次性拷过去安装。5.3 端口被占用的排查思路启动 Nginx 时提示bind() to 0.0.0.0:80 failed (98: Address already in use)十有八九是端口被占用了。排查命令# Linux 上查看占用 80 端口的进程 lsof -i :80 # 或者 netstat -tunlp | grep :80 # 杀掉占用进程 kill -9 PID80 端口最常见的占用者是 Apache、Tomcat、或者其他已经跑着的 Nginx。确认占用进程后要么停掉冲突服务要么把 Nginx 监听端口改掉。Windows 下同样有端口占用问题查看命令是netstat -ano | findstr :80然后用taskkill /PID PID /F结束进程。Windows Server 上还要注意 IIS 默认占用 80 端口如果 IIS 还开着Nginx 启动必然失败。5.4 安全漏洞与版本升级最近有些媒体报道了 F5 Nginx 相关的安全漏洞比如标题热词里提到的 “sf-0005-22843 cve-2025-1695” 这类编号主要涉及 Nginx 在特定配置下的风险描述。处理思路是一样的及时关注官方安全公告按需升级到修复版本。升级 Nginx 时先备份配置文件尤其是nginx.conf和conf.d下所有内容。升级后执行nginx -t检查新版本是否能正常加载旧配置。如果配置里有废弃指令新版本会给出明确报错根据提示修改即可。个人建议生产环境的 Nginx 不要盲目追新选择官方长期维护的稳定版本更靠谱。同时定期查看官方 CHANGES 文件或安全公告发现高危漏洞时评估影响范围再决定是否升级。5.5 Windows 下部署 Nginx 的几个坑Windows 部署 Nginx 的场景比 Linux 少但确实存在而且坑不少。第一个坑是路径分隔符。Windows 路径默认用反斜杠但 Nginx 配置文件里统一用正斜杠。写成root D:/project/dist;没问题写成root D:\project\dist;反而可能出问题。第二个坑是命令行为差异。Windows 下nginx -s reload大多时候有效但偶尔配置没生效最稳妥的方法是先停再启。第三个坑是后台运行。双击 nginx.exe 会弹出一个控制台窗口关掉窗口 Nginx 就停了。想真正后台运行得用start nginx命令启动。第四个坑是 Windows 下没有grep、sed这些文本工具排查日志时要靠编辑器搜索效率低一些。可以装一个 Git Bash 或者 WSL 来模拟 Linux 环境但配置路径要注意跨文件系统的兼容性。5.6 其他特殊场景的补充/etc/init.d nginx这种启动方式出现在比较老的系统和某些发行版上。如果系统还支持 init.d可以用/etc/init.d/nginx start /etc/init.d/nginx stop但新系统上更推荐直接用 systemctl管理更规范还能设置开机自启。麒麟 V11 这类国产系统本质上是基于 Linux 的安装方式和其他 Linux 发行版类似。如果软件源里有 nginx 包直接用包管理器安装如果源里没有编译安装或者离线 rpm 安装都可以。系统的内核版本和 glibc 版本会影响 Nginx 二进制的兼容性所以源码编译往往更稳妥。docker pull nginx:1.21.5拉取指定版本镜像时如果特别慢或超时可以配置镜像加速器。加速器地址不方便公开推广说实话如果在国内网络环境下频繁拉镜像失败优先检查 Docker 的 registry-mirrors 配置用你所在网络环境下能够稳定访问的镜像源。6. 我的实操心路与建议从第一次部署 Nginx 到现在我最大的体会有两件事。第一件事Nginx 的配置只要理解了“server 是站点、location 是路径规则、upstream 是后端组”这个框架剩下的就是在骨架里填细节。它不像编程语言那样需要持续学习新语法配置本身相当稳定很多地方多年没变过。第二件事碰到问题先看日志。不管是反向代理不通、静态文件 404还是访问超时error.log里都会留下痕迹。先看日志再改配置比盲目试错高效得多。我见过太多人配置改来改去还是不生效最后发现是忘保存配置文件或者在 Docker 里改的是宿主机上的文件但没有挂载进去。学会 Nginx 有点像学会做菜的“颠勺”基本功表面上看只是一个小技巧但它决定了你能否把食材真正变成一道菜。同样Nginx 决定了一个项目能否以体面的方式对外提供服务。性能调优、安全加固、架构升级很多高级操作都建立在 Nginx 熟练掌握的基础上。最后再说一个小技巧每次改完配置先用nginx -t检查语法再执行 reload。这条习惯能帮你避开 90% 的配置错误。如果 reload 提示成功但行为没变化检查是否有多个 Nginx 进程ps -ef | grep nginx看看有时候旧的 master 进程没退出新配置被旧进程持有这种情况直接重启进程就好。