微信优化

weixinyouhua

nginx详细配置怎么做?nginx详细配置有哪些步骤?

2026-09-25 05:08:09

nginx配置的核心答案一句话说透:搞懂nginx.conf的层级结构、location匹配优先级和proxy_pass转发逻辑,你就能应对绝大多数业务场景。

打开一台新服务器的nginx.conf,新手往往对着几百行配置发懵,其实nginx配置由若干配置块组成,每个块负责一类职责,层级关系理顺后,配置就是搭积木。

nginx配置文件在哪里?目录结构决定操作起点

不少运维新手搜”nginx配置文件在哪里”,得到的答案五花八门,原因在于安装方式不同,路径差异明显,常见分布如下:

  • Debian/Ubuntu通过apt安装:主配置文件在/etc/nginx/nginx.conf
  • CentOS/RHEL通过yum安装:同样在/etc/nginx/nginx.conf
  • 源码编译安装:默认在/usr/local/nginx/conf/nginx.conf
  • Docker镜像部署:多数镜像路径为/etc/nginx/nginx.conf

主配置文件只是入口,真正管站点的是它通过include指令引入的子配置,Debian系默认拉入/etc/nginx/sites-enabled/下的文件,CentOS系通常拉入/etc/nginx/conf.d/.conf,这种拆分让每个站点独立成文件,排查范围小,改动互不影响。

日志位置同样固定,访问日志在/var/log/nginx/access.log,错误日志在/var/log/nginx/error.log,排错第一步永远先看error.log,这条经验能省下大量抓瞎时间。

nginx配置详解:全局块、events块与http块的职责边界

nginx.conf三级结构是骨架:全局块定进程,events块定连接模型,http块管请求处理,三者职责不交叉。

全局块:管进程运行

全局块放在配置文件最顶部,直接作用于nginx进程:

  • user nginx;:worker进程运行身份,权限过大有安全风险,生产环境禁用root运行
  • worker_processes auto;:设为auto让nginx按CPU核心数自动派生worker进程
  • error_log /var/log/nginx/error.log warn;:错误日志级别,线上一般用warn或error
  • pid /var/run/nginx.pid;:主进程PID存放位置

events块:管连接模型

events块紧跟在全局块后,核心参数就两个:

  • worker_connections 1024;:单个worker进程能同时保持的最大连接数,1024是保守默认值
  • use epoll;:Linux高并发场景下显式指定epoll事件模型,比默认的select性能好

http块与server块的嵌套关系

http块是所有web请求的入口,内部先做通用设置再嵌套server:

  • include mime.types;:让nginx根据文件后缀识别Content-Type,漏掉它静态资源加载会乱
  • sendfile on;:零拷贝发送文件,减少内核态和用户态之间的拷贝
  • keepalive_timeout 65;:客户端长连接超时时间

server块相当于一台虚拟主机,由listen指定端口、server_name绑定域名,访问请求到达nginx后,先说http块公共配置,再按端口和域名落入对应server块,最后在server块内部匹配location。

nginx详细配置怎么做?nginx详细配置有哪些步骤?

nginx location匹配规则优先级到底怎么排

location是nginx配置里最容易被写错的环节。”nginx location匹配规则优先级”在搜索引擎里常年有热度,说明踩坑的人确实多,优先级排序如下:

匹配方式 语法示例 优先级
精确匹配 location = /login 最高
前缀匹配 location ^~ /static/ 高
正则匹配 location ~ .(gif|jpg)$ 中
普通前缀匹配 location /api/ 低
兜底匹配 location / 最低

匹配流程按顺序走:先看有没有精确匹配,命中直接结束;再看有无^~前缀命中,命中后不再查正则;随后才轮到正则匹配,区分大小写、不区分,按书写顺序从上往下找;正则全部落空后,走最长普通前缀匹配,最后才是location /兜底。

一个实际场景的location组合

前后端分离项目常见的一组location配置:

location = /favicon.ico {
    log_not_found off;
    access_log off;
}
location ^~ /static/ {
    alias /data/www/static/;
    expires 30d;
}
location ~ .(js|css|png)$ {
    expires 7d;
    add_header Cache-Control "public";
}
location /api/ {
    proxy_pass http://backend_server;
}
location / {
    root /data/www/dist;
    index index.html;
}

这个组合的妙处在于:图标精确匹配直接短路,静态资源走前缀命中不碰正则,动态请求按正则规则单独设缓存,接口转发到后端,其余全部落到前端页面。

正则匹配的坑

正则里的点号匹配任意字符,写location ~ .php$时反斜杠不能省,否则把xphp这类路径也放进来了,花括号在正则里是量词语法,匹配字面量时建议给整个正则加引号,除非必要,优先用前缀匹配替代正则,可读性和性能都更好。

nginx反向代理与负载均衡配置方法

反向代理是nginx使用频率最高的能力,核心指令就一个:proxy_pass。

proxy_pass基础配置

location /api/ {
    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_pass的写法有个细节坑:带不带尾部斜杠,转发路径完全不同。

  • proxy_pass http://后端/;:会去掉location匹配的前缀,访问/api/user实际转给后端/user
  • proxy_pass http://后端;:保留完整路径,访问/api/user转给后端/api/user

地址带表示重写路径,不带表示透传,这两行差一个字符,排查转发404时先看这里。

nginx详细配置怎么做?nginx详细配置有哪些步骤?

upstream负载均衡策略怎么选

多个后端节点用upstream块统一声明,再让proxy_pass指向upstream名字:

upstream backend {
    server 192.168.1.10:8080 weight=3;
    server 192.168.1.11:8080;
    server 192.168.1.12:8080 backup;
}

三种常用策略对比:

策略 配置关键词 适用场景
轮询 默认策略 后端机器配置均衡
加权轮询 weight 异构机器按性能分配流量
会话保持 ip_hash 用户session存在单台机器内存中

backup标记的节点平时不接流量,主节点全部宕机才启动,用来做高可用兜底很实用。

前后端分离项目完整示例

upstream api_server {
    ip_hash;
    server 192.168.1.10:8080;
    server 192.168.1.11:8080;
}
server {
    listen 80;
    server_name demo.example.com;
    location /api/ {
        proxy_pass http://api_server;
    }
    location / {
        root /data/www/dist;
        index index.html;
        try_files $uri $uri/ /index.html;
    }
}

前端路由用history模式时,刷新页面会请求不存在的真实路径,try_files $uri $uri/ /index.html这行把请求回退到入口页,是SPA部署的标配写法。

nginx性能优化配置清单

性能优化不像网上说的那样玄乎,多数场景把下面几项调到位,效果立竿见影。

进程数与连接数

worker_processes auto让nginx按CPU核数派生进程,业内专家指出,进程数超过CPU核心数反而因上下文切换损耗性能,auto是最稳妥的选择。worker_connections配合调大,比如10240,单机并发承载能力就上去了,两者相乘得到理论最大并发连接数,实际值还要考虑内存和带宽。

gzip压缩

gzip on;
gzip_comp_level 5;
gzip_min_length 1k;
gzip_types text/plain text/css application/json application/javascript image/svg+xml;
gzip_vary on;

静态资源开启gzip后传输体积能缩小一大截,压缩级别5是性价比平衡点,调太高CPU开销大收益却有限。

静态资源缓存

location ^~ /static/ {
    alias /data/www/static/;
    expires 30d;
    add_header Cache-Control "public";
}

expires 30d让浏览器把静态资源缓存30天,二次访问直接走本地,完全不消耗服务器带宽,版本化文件名配合永久缓存是前端性能优化的常用组合。

nginx配置https证书的实操步骤

申请证书后,配置步骤分两段:先改443的server块,再做80跳转。

server块添加SSL参数

server {
    listen 443 ssl;
    server_name demo.example.com;
    ssl_certificate     /etc/nginx/ssl/demo.example.com.pem;
    ssl_certificate_key /etc/nginx/ssl/demo.example.com.key;
    ssl_protocols       TLSv1.2 TLSv1.3;
    ssl_session_timeout 5m;
    ssl_session_cache   shared:SSL:50m;
    # 站点原有location配置原样保留
}

nginx详细配置怎么做?nginx详细配置有哪些步骤?

证书文件路径可以自定义,关键是nginx进程对证书文件有读取权限,否则启动直接报错,SSL配置完成后记得把站点内所有http资源链接改成https,否则浏览器地址栏的锁标识带警告。

http强制跳转https

server {
    listen 80;
    server_name demo.example.com;
    return 301 https://$host$request_uri;
}

80端口只做301跳转,让所有http流量自动切到443。$host和$request_uri是nginx内置变量,保留原始域名和路径,域名下多路径资源迁移不用逐条改。

nginx配置完先做这三项检查

配置改完别急着重启,按顺序做三件事:

  1. 执行nginx -t验证语法,输出syntax is ok说明配置没写错
  2. 执行nginx -s reload平滑重载,reload不中断现有连接,新配置立即生效
  3. 确认防火墙放行端口,改了listen端口后先检查firewalld或iptables规则

常见的403是目录权限或索引文件缺失,404基本是root路径配错,502则是后端服务没起来或网络不通,这三类问题占据nginx排错的相当一部分场景,定位时先对号入座看error.log,再根据关键字搜具体解决方案。

nginx配置能力靠的是多写多踩坑,把上面几块核心逻辑吃透,日常开发和运维场景基本够用,剩下的边角知识,遇到具体需求时查官方文档比背配置更高效。

nginx配置常见问题解答

Q1:nginx配置反向代理后出现502 Bad Gateway怎么排查?

502表示nginx连不上后端,先确认后端服务进程是否存活,用curl http://127.0.0.1:端口本地测试通不通,再查看error.log中是否有connect() failed (111: Connection refused),有则说明后端端口监听异常或防火墙拦截,若后端正常但请求响应慢,检查proxy_read_timeout和proxy_connect_timeout是否设置过短,按这个顺序排查,大多数502都能定位。

Q2:改完nginx配置怎样让改动生效?

先执行nginx -t验证语法,确认无误后执行nginx -s reload,reload是平滑重载,会重新读取配置并启动新的worker进程,同时优雅关闭旧worker进程,已建立的连接不受影响,不需要执行重启或重新编译。

Q3:nginx配置的location正则什么时候需要转义?

在和正则匹配中,点号匹配任意字符,想匹配字面量点号必须写成.;斜杠不需要转义;花括号在正则里表示量词,遇到建议转义或整体加引号,行业共识认为,正则复杂度越高维护成本越大,能用前缀匹配解决的场景不要引入正则。

相关文章

2024年,SaaS软件行业碰到获客难、增长慢等问题吗?

我们努力让每一次邂逅总能超越期待