Nginx配置的核心答案很简单:主配置文件位于/usr/local/nginx/conf/nginx.conf或/etc/nginx/nginx.conf,通过修改这个文件并执行nginx -s reload即可让大多数配置生效。无论是搭建静态站点、配置反向代理还是调整负载均衡策略,掌握这个文件的结构和语法,你就能解决工作中八成以上的Nginx使用需求。
nginx配置教程:从零开始理解核心文件结构
很多新手第一次打开nginx.conf会被密密麻麻的配置项吓到,其实它的骨架特别清晰,Nginx采用主配置块 + 事件块 + HTTP块的树状结构,每个块用大括号包裹,配置项以分号结尾,你可以把它想象成一个俄罗斯套娃,最外层是全局配置,越往里越具体。
主配置块:全局参数的调校台
这个区域通常位于文件顶部,控制Nginx进程本身的行为,你需要记住三个高频参数:
worker_processes:工作进程数,行业共识认为设置为服务器CPU核心数即可,不用贪多worker_connections:每个进程的最大连接数,默认1024,高并发站点建议调整到65535pid:进程ID存储路径,一般用默认值不需要改动error_log:错误日志位置,排查问题时第一件事就是查看这个文件
改主配置块后必须执行nginx -t测试语法,通过后再nginx -s reload热加载,千万别直接重启服务,那会断开所有当前连接。
events块:连接处理的微调旋钮
这个块专门处理连接机制,最常用的是worker_connections和use epoll(Linux高并发场景下的高效事件驱动模型),如果你的站点同时在线人数不高,这里保持默认即可,多数情况下,你更关心的是下面要讲的HTTP块。
nginx反向代理配置怎么做:一套标准操作流程
反向代理是Nginx最受欢迎的功能之一,简单说就是让Nginx接收客户端请求,转发给后端服务器处理,再把结果返回给客户端,这就像公司前台,访客不直接找员工,而是通过前台转达。
单台后端服务器的代理配置
假设你的Java应用跑在0.0.1:8080,前端想通过80端口访问,配置是这么写的:
server {
listen 80;
server_name example.com;
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;
}
}
完成这三步就通了:
- 先确认后端服务正常启动,
curl http://127.0.0.1:8080 - 修改Nginx配置,加入上述
server块 - 执行
nginx -t验证语法,然后nginx -s reload
这里有个细节容易踩坑:proxy_set_header Host $host这行决定了后端服务器收到的主机名,如果你在代理后面挂了虚拟主机或做了域名跳转,这行能省掉很多麻烦。
WebSocket代理配置要点
如果你的站点有聊天功能或实时推送,WebSocket代理需要额外加两个Header:
proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade";
业内专家指出,漏掉这两行会让WebSocket握手失败,客户端会莫名其妙地断连,绝大多数实时通信场景,加这两行就能稳定工作。
nginx负载均衡配置的完整步骤:三分钟上手上游服务器
当你有多台后端服务器时,Nginx的

upstream模块能把请求分发到不同机器,集群环境下这套配置几乎是标配,配置好后你的站点就具备了横向扩展的能力。
基础轮询配置
upstream backend_servers {
server 192.168.1.10:8080;
server 192.168.1.11:8080;
server 192.168.1.12:8080;
}
server {
listen 80;
server_name example.com;
location / {
proxy_pass http://backend_servers;
proxy_set_header Host $host;
}
}
upstream块定义了服务器组,proxy_pass指向组名即可,默认采用轮询策略,每个请求依次分发给不同服务器,多数情况下这个策略够用了,静态资源站点甚至可以不加任何额外参数直接跑。
权重与健康检查配置
后端服务器性能不一样时,用权重分配请求更合理:
upstream backend_servers {
server 192.168.1.10:8080 weight=3;
server 192.168.1.11:8080 weight=1;
server 192.168.1.12:8080 backup;
}
weight=3表示这台机器承担3倍于weight=1的流量backup标记的服务器平时不参与服务,只在其他服务器都挂掉时顶上
Nginx自带被动健康检查:连续失败max_fails次(默认1次),就把该服务器标记为不可用,冷却fail_timeout秒(默认10秒)后再尝试,这两个参数按业务情况调整,接口响应慢的服务可以适当调大fail_timeout。
会话保持的两种实现方式
后端服务器处理登录状态时,需要让同一个用户的请求固定在某一台服务器上:
- ip_hash:根据客户端IP计算哈希值,同一IP固定访问同一台服务器,配置只需在
upstream块里加一行ip_hash; - cookie粘连:通过
sticky模块实现,需要单独编译或用OpenResty,适合后端服务做了本地缓存的场景
IP哈希简单有效,但如果用户通过手机4G网络访问,IP段经常变化,这时就得考虑cookie方案了。
nginx静态文件服务配置:缓存策略与gzip压缩
前端项目打包后的HTML、CSS、JS文件交给Nginx托管,性能比通过Node或Java应用服务器直接返回好得多,这个场景下,浏览器缓存和gzip压缩是两大核心优化点。
静态资源缓存配置
location ~ .(js|css|png|jpg|jpeg|gif|ico|svg)$ {
expires 7d;
add_header Cache-Control "public, max-age=604800";
access_log off;
}
expires 7d:告诉浏览器这些文件7天内不用重新请求access_log off:静态文件请求量巨大,记日志纯属浪费磁盘IO
HTML文件不建议设置长缓存,因为内容经常变动,设置expires 1h或干脆不设比较稳妥。
gzip压缩参数调优
gzip on; gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript; gzip_min_length 1k; gzip_comp_level 2; gzip_vary on;
gzip_comp_level建议2-4,级别太高CPU开销大且压缩率提升不明显- 图片文件本身已压缩过,不需要再走gzip
配置完成后用curl -H "Accept-Encoding: gzip" -I http://yourdomain.com/test.css检查响应头有没有Content-Encoding: gzip,有就说明生效了。
nginx与apache配置有什么不同
用过Apache的人刚接触Nginx会觉得别扭,两者的风格差异其实集中在三点:
| 对比项 | Nginx | Apache |
|---|---|---|
| 配置入口 | 集中在nginx.conf | 每站点独立的.htaccess |
| 目录级配置 | 无全局.htaccess机制 | 支持分布式配置 |
| 路径重写 | 用location块+rewrite正则 |
用<Directory>+RewriteRule |
| 静态文件处理 | 极高效率,适合高并发 | 相对较弱 |
Nginx不支持.htaccess,这是很多人迁移时最不习惯的,你要做的所有配置都得写进server块或location块里,好处是配置统一管理,不会像Apache那样到处散布配置文件。
nginx配置不生效怎么办:三招排查原理
改完配置发现没变化,这是每个运维都经历过的场景,先别怀疑服务器,按下面顺序排查基本能解决。
检查语法与加载状态
nginx -t
运行后如果有报错会提示具体行号和原因,显示syntax is ok代表语法没问题,接着确认加载动作是否执行:
nginx -s reload
有的朋友改了conf文件但忘记执行这行命令,重启Nginx进程也能生效,但会造成连接中断,不推荐。
验证配置是否真正生效
nginx -T
这个命令会输出完整的生效配置,你搜一下刚改的参数是否在输出里,如果在,说明配置已加载,问题出在浏览器缓存或CDN缓存上,强制刷新或清CDN缓存即可。
常见坑位逐个排除
- 编辑了错误的配置文件:用
nginx -T确认实际加载路径,有的发行版配置文件分散在conf.d/子目录 server_name匹配不上:浏览器请求的域名必须和配置里的server_name完全一致,泛解析用.example.comlocation优先级搞混:精确匹配location = /> 前缀匹配location ^~ /> 正则匹配location ~> 普通前缀匹配,规则容易绕晕但记住前两种优先就够了
nginx ssl证书配置流程:从HTTP到HTTPS的切换
没跑HTTPS的站点在浏览器里会被标为不安全,而且HTTP/2强制要求TLS,所以SSL配置是必做项,你只需获得一张证书(免费渠道有Let’s Encrypt),然后加一个443端口的server块。
最小可用的SSL配置
server {
listen 443 ssl;
server_name example.com;
ssl_certificate /etc/nginx/ssl/example.com.crt;
ssl_certificate_key /etc/nginx/ssl/example.com.key;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers 'ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256';
ssl_prefer_server_ciphers on;
}
最核心的就是ssl_certificate和ssl_certificate_key两行,指定证书文件和私钥路径,协议和加密套件用上述默认值即可满足2026年主流浏览器的要求,TLSv1.0和TLSv1.1早已被淘汰,千万别开。
全站强制跳转配置
HTTP的80端口需要专门做一个301跳转:
server {
listen 80;
server_name example.com;
return 301 https://$host$request_uri;
}
$request_uri会保留原始路径和查询参数,用户访问http://example.com/page?id=1时自动跳到https://example.com/page?id=1,不丢参数。
证书自动续期的配置思路
Let’s Encrypt证书只有90天有效期,手动续期不现实,用certbot renew命令配合定时任务即可,具体步骤:先装Certbot对应插件,执行一次

certbot --nginx完成初始签发,然后编辑crontab添加每月执行一次的自动续期任务,据行业普遍统计,相当一部分运维事故是证书过期导致的服务不可用,自动化续期能把这个风险直接消掉。
nginx性能优化配置:让站点快人一步
优化不是玄学,核心就两件事:减少磁盘IO和降低网络传输量,以下几个参数直接影响Nginx的资源消耗。
连接超时设置的黄金值
keepalive_timeout 65; client_header_timeout 10; client_body_timeout 10; send_timeout 10;
keepalive_timeout控制在合理范围,太长会占用连接数- 三个
timeout值设成10秒足够,后端服务卡死时不至于让Nginx一直等
静态文件零拷贝加速
sendfile on; tcp_nopush on; tcp_nodelay on;
sendfile让Nginx直接通过内核发送文件内容,不走用户态到内核态的拷贝流程,静态文件响应速度提升立竿见影。tcp_nopush配合静态文件场景使用,tcp_nodelay对交互式请求更友好。
日志按天切割方法
日志暴涨会拖垮磁盘IO,用定时任务切割是行业标准做法:
# 每天凌晨执行 mv /usr/local/nginx/logs/access.log /usr/local/nginx/logs/access_$(date +%F).log nginx -s reopen
nginx -s reopen会重新打开日志文件,不中断服务即可完成切割。
nginx配置常见问题解答
修改nginx.conf后为什么总是提示unknown directive?
通常是漏了分号,Nginx的每个指令都必须以分号结尾,括号和分号都是英文半角字符,复制粘贴网上的配置时,引号或分号被转成中文符号是最常见的触发原因,运行nginx -t时它会指出具体出错的行,顺着检查就行。
一个IP上想部署多个域名站点需要什么配置?
只需要两个server块即可,每个监听同一个80端口,用server_name区分不同域名,请求进来后Nginx通过Host头匹配对应的server_name,匹配不到就落到默认server块(通常按文件加载顺序选第一个),要在配置文件里让每个站点的独立配置互不干扰,可以用include指令把各个站点的配置拆分到/etc/nginx/conf.d/独立文件里,结构比全写在一个文件里清晰得多。
Nginx作为前置代理时后端获取不到客户端真实IP怎么办?
后端服务拿到的IP是Nginx所在机器的地址,你需要把客户端IP透传过去,在location块里加上三行代理头配置:
proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
X-Real-IP直接记录客户端IP,X-Forwarded-For追加每一级代理的IP列表,后端Java或Node应用读取这两个Header即可获得真实IP,这里的关键是确保最外层代理的Nginx没有覆盖这两个Header,否则拿到的是上层CDN的IP,据统计,多层代理链路中半数以上真实IP丢失问题都源于Header覆盖顺序不当。
Nginx配置的学习路径很直接:先掌握server和location的搭配,再研究upstream做负载均衡,接着用SSL加固安全,最后用缓存和压缩提速,把nginx -t养成肌肉记忆,改完配置必测语法,生产环境就不会出现低级事故,这套流程本身就是你从入门到熟练的最佳捷径,剩下的就是在实际站点中反复打磨每个参数的取值了。

