nginx 常用配置 的核心在于把 server、location、upstream 这几块吃透,让代理、转发、缓存、安全各司其职。 很多初学者对着默认配置文件发懵,Nginx 的语法并不复杂,关键在于理解请求从进入到返回的完整链路,我在平时的运维中,最常用到的也就那么十几个指令,但组合好它们,就能解决绝大多数场景问题,下面这套配置思路,是我摸爬滚打总结出来的,照着这份 nginx 常用配置指南操作,你的服务器会更稳、更快。
nginx 常用配置 的核心骨架:从空白到能跑
拿到一台新服务器,首先得知道 Nginx 的配置文件长在哪,主配置通常是 /etc/nginx/nginx.conf,而真正需要动手改的,多半是 conf.d 目录下的自定义 .conf 文件,或者 sites-available 下的虚拟主机文件,行业共识认为,按域或按应用拆分配置文件,比一股脑堆在主配置里更利于维护。
全局块和 events 块:骨架里的地基
主配置文件开头是全局块,里面定义的是 user、worker_processes 这类进程级参数。worker_processes auto 能让每个 CPU 核心跑一个 worker,多数情况下这是最省心的选择,接着是 events 块,里面通常只有一行 worker_connections 1024,它决定了每个 worker 能同时打开的连接数,这里不需要调得过于激进,否则文件句柄会不够用。
http 块与 server 块:一个请求的归途
http 块是整个配置的心脏,它包裹着所有 server 块,一个 server 块就代表一个虚拟站点,里面最关键的两个指令是 listen 和 server_name,下面是一个最小可用的站点配置:
server {
listen 80;
server_name www.example.com;
root /var/www/html;
index index.html index.htm;
location / {
try_files $uri $uri/ =404;
}
}
location 块负责匹配 URL 路径。location / 表示处理所有未匹配到的请求,try_files 指令会先找磁盘上的真实文件,找不到就返回 404,这个基础模型搭建好后,接下来就该考虑如何把请求转发给后端的动态服务了。
反向代理和负载均衡:多台机器的指挥官
反向代理是 Nginx 最常用的场景之一,如果你需要在不同的 server 块里处理多个域名,必须确保每个域名的 server_name 不冲突,建议为每个站点建立一个独立的配置文件,并在

http 块里用 include /etc/nginx/conf.d/.conf; 加载,这样管理多个项目时会非常清晰。
nginx反向代理 配置 中文实战:从单机到集群
当后端服务跑在 8080 端口,你需要对外隐藏这个端口时,proxy_pass 就登场了,这里面有个经典大坑:proxy_pass http://upstream_name; 后面带不带斜杠,代理转发后的路径会完全不同,带路径会把 location 匹配部分替换掉,不带则保留原始 URI,实际操作中,我一般这样写:
location /api/ {
proxy_pass http://backend_server;
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 必须加,第一行让后端知道原始域名,后两行让后端能记录到真实用户 IP,否则所有日志里都是内网地址。
负载均衡调度算法选哪个
当单台后端扛不住压力,就要用 upstream 块定义一组服务器,Nginx 默认的 round-robin 算法简单轮询,适合后端配置相同的场景,如果后端服务器性能有差异,给性能强的服务器加 weight 参数,涉及用户登录 session 时,用 ip_hash 算法能让同一个用户 IP 固定访问同一台机器,下面是几种常用调度算法的对比:
| 算法 | 指令写法 | 适用场景 | 注意点 |
|---|---|---|---|
| 轮询 | upstream backend { server 10.0.0.1; server 10.0.0.2; } |
后端配置一致、无状态服务 | 默认算法,无需显式声明 |
| 权重 | server 10.0.0.1 weight=2; |
异构服务器,按能力分配流量 | 权重越高,被选中概率越大 |
| IP哈希 | ip_hash; |
需要保持会话的应用 | 后端宕机时,该 IP 下的请求会重试其他节点 |
| 最少连接 | least_conn; |
请求处理时长差异较大的场景 | 动态分配,避免忙的忙死 |
前端nginx配置指南:静态资源与 SPA 加速
前端项目部署到服务器上,如果用 Nginx 直接返回静态文件,响应速度会非常可观,特别是图片、CSS、JS 这些资源,完全没必要让 Node 或 Java 容器去处理。
静态文件直接返回,别让后端 Java 参与

在 location 块中,通过 root 指令指定静态文件目录,将构建后的前端文件放到 /data/www/dist,配置如下:
location /static/ {
alias /data/www/static/;
}
alias 和 root 的区别是必修课:root 会把 location 的路径拼接到真实路径后面,alias 则直接用指定的路径替换 location 路径,新手容易在这里栽跟头,建议直接动手测试目录结构。
清理缓存:别让用户看到旧页面
这里要引入一个关键长尾词:nginx 静态资源缓存 策略,如果项目使用 Vue 或 React 这类 SPA 框架构建,路由是前端在管理的,这时刷新二级页面会报 404,解决办法是用 try_files 回退到首页:
location / {
root /data/www/dist;
index index.html;
try_files $uri $uri/ /index.html;
}
这样,当用户访问 /about 时,后端找不到文件,Nginx 会直接返回 /index.html,由前端路由接管,至于缓存配置,给会变化的 HTML 文件设置禁用缓存,给带哈希指纹的静态文件设置长缓存:
location ~ \.(js|css|png|jpg|gif|svg)$ {
expires 30d;
add_header Cache-Control "public, no-transform";
}
expires 30d 告诉浏览器这 30 天内无需重新请求,极大缓解服务器压力,但要注意,修改了静态文件内容后,文件名必须不同,否则浏览器会沿用旧缓存。
nginx 安全加固与性能调优:老手才关注的事儿
配置好基础功能后,安全加固是上线前的重要一环,除了限制访问 IP,最常见的是给后台加密码,用 openssl passwd 生成密码字符串后,通过 auth_basic 指令校验。
location /admin/ {
auth_basic "Restricted Area";
auth_basic_user_file /etc/nginx/.htpasswd;
}
这样没有密码的人无论如何都进不了后台,针对暴力破解,limit_req 模块能限制请求速率,先定义限制区域,再在 location 里引用:
limit_req_zone $binary_remote_addr zone=login_limit:10m rate=5r/s;
location /login/ {
limit_req zone=login_limit burst=3 nodelay;
proxy_pass http://backend_server;
}
rate=5r/s 表示每秒最多 5 个请求,burst=3 允许瞬间多放行几个,这能有效防止脚本刷接口,至于日志,默认配置只记录访问日志,可以在

server 块里加一条:
location = /status {
access_log off;
return 200 "healthy\n";
}
专门的健康检查路径,既方便监控又避免日志被轮询刷爆,行业共识认为,敏感接口的访问日志应留存至少 30 天,便于安全审计。
开启 gzip 压缩和连接优化
传输层优化对体验提升立竿见影,在 http 块里开启 gzip,JS 和 CSS 的体积经常能减少大量字节,加载速度自然更快,合理的 keepalive 配置能减少浏览器与服务器建立连接的次数,这对 HTTPS 站点的提升尤其明显,将两者结合配置,能让网站在高并发下依然从容应对,因为加载速度直接影响核心 Web Vitals 指标,进而关联到搜索排名表现,不少站长反馈,单纯开启 gzip 后,首屏时间快了一倍多。
nginx 配置常见疑问解答
修改完配置,nginx -s reload 后没生效是什么原因?
先用 nginx -t 检查语法,确认无误后再 reload,如果依然没生效,多半是浏览器缓存了旧的响应头,还有可能是你改了 conf.d 下新文件,但主配置里的 include 没有加载它,请检查配置文件权限是否为 nginx 用户可读。
nginx 和 Apache 本质上到底哪个更好用?
两者没有绝对优劣,Nginx 处理并发静态页面的能力更强、内存占用更少,代理功能也更顺手;Apache 的模块系统更成熟,对 .htaccess 的兼容性无可替代,如果项目是纯 PHP 且依赖大量路径重写,Apache 更省心;如果是高流量动态应用或前后端分离项目,Nginx 是更合适的选择。
配置里 location / 和 location ~ .php$ 是什么意思?
location / 是前缀匹配,命中所有未匹配的请求。location ~ 表示后面跟的是正则表达式,区分大小写,正则匹配的优先级高于普通前缀匹配,如果你配置了 location ~ \.(js|css)$,所有以 .js 或 .css 结尾的请求都会优先进入这个块。
配置到这里,你的 Nginx 已经具备处理正常线上流量的能力,把反向代理、静态分离和基础防护配置好,再结合 nginx -t 与 systemctl status nginx 做日常体检,随着经验的积累,你会在这些基础指令之上,演化出更适合自己业务的调参方案。
