nginx 网站配置说穿了就三件事:server 块写对、root 和 location 指对、改完先 nginx -t 再 reload。 新手被绕晕的那些报错,绝大多数都能从这三点里找到源头。

nginx 在网站里到底站在哪个位置
nginx 通常站在最外层,所有进来的请求先落到它手里,由它决定下一步:直接把磁盘上的文件吐出去,转给后端的 PHP、Node、Java 进程,还是丢给另一台服务器。
这个位置决定了它的配置逻辑,它不关心你的业务代码怎么写,只关心“什么样的请求、该去哪里、用什么方式回应”,所以配置文件的写法看起来很工程化,其实一直在重复回答这三个问题。
行业共识认为,nginx 之所以在高并发场景被大量采用,核心在于事件驱动模型和极低的内存占用,这一点直接影响配置思路你可以放心地用 nginx 挡住绝大部分静态请求,只把必要的那部分流量转给后端。
nginx 配置文件的骨架长什么样
打开 /etc/nginx/nginx.conf,会看到一层套一层的结构。
四个层级的嵌套关系
- main:最外层,进程数、日志、PID 路径
- events:连接处理模型,
worker_connections定在这 - http:所有 HTTP 相关的全局设置,MIME 类型、超时、压缩
- server:一个站点(一个域名或一组端口)
- location:一个 URL 路径前缀下的具体规则
配置是继承的,上层写了,下层没写就沿用它;下层写了,就覆盖上层,搞不清这个,就会出现“明明改了没生效”的情况。
http 块里先调这几个开关
sendfile on;静态文件走内核零拷贝,比 read+write 省事keepalive_timeout 65;长连接保持时间,按业务访问频率调client_max_body_size 20m;不设的话,上传稍大的文件直接 413gzip on;配合gzip_types压文本类资源,图片视频别压
server 块必须盯住的四条指令
listen 管端口,server_name 管域名匹配,root 管文件从哪读,location 管路径怎么分流,这四条对了,站点基本就活了。
nginx网站配置文件怎么写:一个静态站的最小可用版本
先别想复杂,一个纯静态站点的配置就是二十来行。
文件放哪、权限怎么给
站点配置建议单独放一个文件,别全塞进主配置:
# Debian/Ubuntu 系 /etc/nginx/sites-available/example.com # 再软链到 /etc/nginx/sites-enabled/ # CentOS/Aliyun Linux 系 /etc/nginx/conf.d/example.com.conf
用宝塔面板的话,站点配置在 /www/server/panel/vhost/nginx/ 下,改完面板会自动重载,但手动改了别忘点保存,否则下次面板操作可能覆盖回去。
文件权限上,root 指向的目录要保证 nginx 的运行用户(通常是 nginx 或 www-data)有读权限,这一步没做,后面十有八九撞 403。
一份能直接抄的配置
server {
listen 80;
server_name example.com www.example.com;
root /var/www/example;
index index.html index.htm;
access_log /var/log/nginx/example.access.log;
error_log /var/log/nginx/example.error.log;
location / {
try_files $uri $uri/ =404;
}
location ~ .(jpg|png|css|js|woff2)$ {
expires 30d;
add_header Cache-Control "public";
}
}
try_files 那条是关键,它按顺序试:先找同名文件,再找同名目录,都没有就返回 404,少了它,目录访问的行为会很别扭。

验证、重载、看日志
nginx -t # 语法检查,先过这关 nginx -s reload # 平滑重载,不断连接 curl -I http://127.0.0.1 # 本机验证,绕开 DNS tail -f /var/log/nginx/error.log
永远不要在 nginx -t 没过的情况下 reload。 尤其是线上机器,配置错了重载会导致整个服务不可用,而 -t 只花你两秒。
nginx反向代理配置教程:把请求交给后端应用
静态站只是热身,真实站点多数要把请求转给后端,8080 上的 Java 服务,或者 3000 上的 Node。
location / {
proxy_pass http://127.0.0.1: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;
}
这四条头指令别省
少了 Host,后端拿到的域名是错的,跳转链接会指向 127.0.0.1,少了 X-Real-IP 和 X-Forwarded-For,后端日志里全是 nginx 自己的 IP,排查攻击和统计流量全废,少了 X-Forwarded-Proto,后端永远以为自己在跑 HTTP,生成的回调地址就成了 http 开头。
简米云服务器nginx配置教程里容易漏的细节
在云上配 nginx,本地能通、外网打不开,八成卡在这几处:
- 安全组没放行,控制台里 80 和 443 要单独加规则,这是独立于系统防火墙的一层。
- 系统防火墙还在拦,CentOS 系查
firewall-cmd --list-ports,Ubuntu 系查ufw status。 - SELinux 拦了反向代理,CentOS 上
getenforce显示 Enforcing,反代就会 502,需要setsebool -P httpd_can_network_connect 1。 - 内网地址写成了公网 IP,后端和 nginx 在同一台机器,
proxy_pass写0.0.1就行,绕公网反而慢还容易触发安全策略。
upstream 做多实例负载
后端不止一个进程时:
upstream app_backend {
server 127.0.0.1:8080 weight=3;
server 127.0.0.1:8081 weight=1;
keepalive 32;
}
默认轮询,加 weight 按权重分,加 ip_hash 做会话保持。keepalive 那条是给 nginx 到后端的连接复用的,配了能明显减少 TIME_WAIT。
nginx和apache配置有什么区别
这两者的差异不只是语法,思路就不一样,apache 的 .htaccess 允许目录级配置分散在各个文件夹里,nginx 则要求集中写在 server 块中。
| 对比项 | nginx | apache |
|---|---|---|
| 配置位置 | 集中式,主配置或 conf.d | 支持 .htaccess 分散 |
| 生效方式 | 改完 reload | .htaccess 即时生效 |
| 静态资源 | 事件驱动,占用低 | 进程/线程模型,占用高 |
| 伪静态写法 | rewrite 或 try_files |
RewriteRule |
| 目录权限 | 全局控制 | 可逐目录控制 |
从 apache 迁过来的站点,最常见的坑是把 .htaccess 里的重写规则照搬,nginx 不支持 .htaccess,得把规则翻译成 location + try_files 或 rewrite,尤其是 WordPress 那套固定链接规则,直接搬必失效。
HTTPS 这块要花多少钱
搜索“nginx 配置 https 证书多少钱”的人,多半是在纠结免费证书够不够用。
DV 域名型证书有免费路线:Let’s Encrypt 通过 certbot 自动签发和续期,单域名 DV 证书在云厂商处也常年有免费额度,缺点是要定期续,忘了就红锁。
付费证书从一年几十元到数千元不等,差价主要来自验证等级(DV / OV / EV)和保障额度,加密强度本身并没有本质差别,个人站和小型业务,免费证书完全够用。

配置也就三行关键指令:
listen 443 ssl http2; ssl_certificate /etc/nginx/ssl/example.com.pem; ssl_certificate_key /etc/nginx/ssl/example.com.key; ssl_protocols TLSv1.2 TLSv1.3;
证书链不完整是 HTTPS 配置的高频翻车点,浏览器能开,但部分安卓机或小程序报证书错误原因是 .pem 里只有站点证书,缺中间 CA,用 openssl s_client -connect example.com:443 -showcerts 能看出链条断在哪。
改完配置别急着重启
nginx -t 到底在检查什么
只检查语法和文件可读性,不检查目录权限、不检查后端通不通。-t 过了也不代表站点正常,它只是排除了最低级的错误。
三个高频报错分别指向哪
403 Forbidden
优先查两处:root 目录对 nginx 运行用户是否可读,以及 index 指定的文件是否存在,目录取可执行权限(x),文件取读权限(r),缺一不可。
404 Not Found
root 路径拼错了,或者 location 优先级不对。location / 和 location ~ .php$ 这种正则块谁先匹配,结果会不一样,用 nginx -T 打印完整生效配置来确认。
502 Bad Gateway
后端没起来,或者 proxy_pass 地址、端口写错,先 ss -lntp | grep 8080 确认端口在监听,再 curl http://127.0.0.1:8080 看后端自己是否正常,很快能定位是哪一段断的。
nginx 网站配置的常见疑问
nginx 配置文件改完必须重启吗
不需要。nginx -s reload 是平滑重载,旧 worker 处理完手上的请求才退出,用户无感知。restart 会断连接,只在改动了 listen 端口这类底层项、或者 reload 报错时才用。
一个 nginx 能配几个网站
数量上没有硬限制,实际取决于内存和连接数,每个 server 块的开销很小,几百个站点在一台中等配置的机器上跑是常见做法,真正的瓶颈在 worker_connections 和文件描述符上限,后者要在 nginx.conf 里用 worker_rlimit_nofile 调,同时改系统 ulimit。
配置写完怎么确认线上真的生效了
用 nginx -T 输出完整合并后的配置,搜索你的 server_name,看实际加载的是哪一份,再用 curl -I -H "Host: example.com" http://127.0.0.1 直接打到本机,跳过 DNS 和 CDN,返回头和状态码对不对一眼就清楚,这两个命令组合,能排除掉“改了另一个文件”和“缓存没清”这两类最常见的假故障。
