很多站长第一次打开 nginx 的配置文件,看到满屏注释就发怵,改一行又怕整站打不开。其实 nginx 的配置有固定套路:主配置管全局,站点配置管单个域名,日常改动九成都落在后者。这篇 nginx配置详解 围绕最常见的三个需求——反向代理、缓存、伪静态——把关键写法讲清楚,每段配置都能直接抄进你的 server 块。
一、先分清该改主配置还是站点配置
新手最容易犯的错,是直接改 /etc/nginx/nginx.conf,把全局设置弄乱。正确的分工是:主配置只保留全局项(worker 进程数、日志格式、include 语句),跟某个域名相关的 server 块一律放到独立站点文件里。Ubuntu、Debian 系一般在 /etc/nginx/sites-enabled/ 下,CentOS、Rocky 系一般在 /etc/nginx/conf.d/ 下,文件名用域名命名,例如 example.com.conf。这样改坏了只影响一个站,回滚就是把文件删掉再重载,简单直接。
二、反向代理:把公网请求转给后端应用
反向代理是 nginx 最常用的能力:站点对外监听 80 或 443,真正的业务跑在本地 127.0.0.1 的某个端口,比如 Node 应用常跑在 3000,Java 应用常跑在 8080。请求先到 nginx,再由它转发给后端。下面这段是最小可用的反向代理配置,写在 server 块里。要改的是 proxy_pass 后面的地址和端口;后端需要按域名区分站点时,必须把 Host 头透传过去。跑完用 curl -I https://example.com/ 看返回状态码,是 200 且响应头里带着 nginx 的标记,就说明请求确实经过了 nginx。
location / {
proxy_pass http://127.0.0.1:3000;
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_connect_timeout 5s;
proxy_read_timeout 30s;
}
超时那两个参数别忽略。后端卡住时,如果 connect_timeout 和 read_timeout 设得太长,nginx 会一直占着连接干等,用户看到的就是整个页面转圈。一般连接超时给 5 秒、读取超时给 30 秒,超了就及时断开,把连接资源留给后面的请求。
三、缓存:静态资源与代理缓存分开配
缓存分两类,别混为一谈。一类是静态资源缓存,让浏览器把图片、CSS、JS 在本地存一段时间,减少重复下载;另一类是代理缓存,nginx 把后端返回的整页结果存到磁盘,下次同样的请求直接由 nginx 响应,不再打扰后端。前者加 expires 和 Cache-Control 响应头就行,后者要先用 proxy_cache_path 定义缓存目录和内存区。要改的是缓存目录路径和 max_size 上限,超过上限 nginx 会按最近最少使用的规则自动清理,不用担心把磁盘撑爆。
# 静态资源:让浏览器本地缓存 30 天
location ~* \.(jpg|jpeg|png|gif|css|js|ico|woff2)$ {
expires 30d;
add_header Cache-Control "public";
}
# 代理缓存:在 http 块里定义缓存区
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=page_cache:10m max_size=1g inactive=60m;
# 在 server 的 location 里启用
# proxy_cache page_cache;
# proxy_cache_valid 200 10m;
# add_header X-Cache $upstream_cache_status;
代理缓存有一条铁律:带登录态的页面不能缓存,否则 A 用户可能看到 B 用户的内容。判断办法是在响应头里看有没有 Set-Cookie 或 Cache-Control: no-store,有就用 proxy_no_cache 和 proxy_cache_bypass 跳过这类请求。缓存上线后连续请求两次同一个地址,第二次看响应头里的 X-Cache 是不是 HIT,是就说明命中生效了。
四、伪静态:动态地址改写成静态形式,改完先校验
伪静态的作用,是让 example.com/article.php?id=12 这种带问号的地址,变成 example.com/article/12.html 这样对用户和搜索引擎都更友好的形式。要记住伪静态只是地址层面的改写,数据仍然是动态查的。WordPress 这类程序大多自带规则,后台选一下即可;自研程序需要自己写 rewrite。下面这段把 /article/12.html 在内部转成 article.php?id=12。要改的是匹配规则和真实的脚本路径,两者必须一一对应,写偏了就是清一色的 404。跑完用浏览器访问改写后的地址,内容能正常出来、地址栏保持不变,规则才算生效。
location / {
rewrite ^/article/([0-9]+)\.html$ /article.php?id=$1 last;
# 也可以让程序入口统一接管:
# try_files $uri $uri/ /index.php?$query_string;
}
规则写完先别着急 reload,跑一遍 nginx -t 做语法检查,输出 syntax is ok 和 test is successful 再执行 nginx -s reload 平滑生效,正在处理的请求不会被打断。如果检查报错,报错信息会直接指出哪个文件第几行有问题,照着改就行。改动前记得把配置备份一份,改错了还原比重头猜快得多。
相关阅读:
A5创业网 版权所有