Nginx 配置详解:从基础到进阶
Nginx(发音为“engine-x”)是一款高性能的HTTP服务器、反向代理服务器和负载均衡器,其配置文件是实现所有功能的核心。Nginx的配置采用模块化结构,语法简洁但功能强大,掌握配置规则是灵活运用Nginx的关键。本文将从配置文件结构、核心模块配置、常见场景示例三个维度,全面解析Nginx配置。
一、Nginx 配置文件基础
1. 配置文件路径
默认情况下,Nginx的主配置文件路径由编译安装时的--prefix
参数指定(如之前你配置的/usr/local/nginx/conf/nginx.conf
),不同安装方式路径可能不同:
- 编译安装(自定义):
/usr/local/nginx/conf/nginx.conf
(你的环境路径) - YUM/DNF安装(CentOS/RHEL):
/etc/nginx/nginx.conf
- APT安装(Ubuntu/Debian):
/etc/nginx/nginx.conf
主配置文件可通过include
指令引入其他子配置(如虚拟主机配置、模块配置),常见的子配置路径:
- 虚拟主机:
/usr/local/nginx/conf/conf.d/*.conf
(或/etc/nginx/conf.d/
) - 模块特定配置:
/usr/local/nginx/conf/modules/*.conf
2. 配置文件结构
Nginx配置文件采用层级结构,所有指令都包含在不同的“块”(Block)中,核心结构分为3层:
# 1. 全局块:配置影响Nginx全局的参数
user nginx; # 运行Nginx的用户和组
worker_processes auto; # 工作进程数(建议设为CPU核心数或auto)
error_log logs/error.log; # 错误日志路径和级别(debug/info/notice/warn/error/crit)
pid logs/nginx.pid; # 进程PID文件路径# 2. 事件块:配置Nginx与用户的网络连接
events {worker_connections 1024; # 每个工作进程的最大并发连接数use epoll; # 网络I/O模型(Linux推荐epoll,Windows用io_uring)multi_accept on; # 允许工作进程一次性接受多个连接
}# 3. HTTP块:配置HTTP服务器的核心参数(包含所有与HTTP相关的配置)
http {include mime.types; # 引入MIME类型映射文件(定义文件扩展名与类型的对应)default_type application/octet-stream; # 默认MIME类型(未知文件时使用)# 日志格式定义(可自定义,通过log_format指令命名)log_format main '$remote_addr - $remote_user [$time_local] "$request" ''$status $body_bytes_sent "$http_referer" ''"$http_user_agent" "$http_x_forwarded_for"';access_log logs/access.log main; # 访问日志路径,使用main格式# 核心性能优化参数sendfile on; # 启用零拷贝(直接从内核缓冲区发送文件,减少IO开销)tcp_nopush on; # 配合sendfile使用,减少TCP数据包数量tcp_nodelay on; # 禁用Nagle算法,减少延迟(适合实时场景)keepalive_timeout 65; # 长连接超时时间(客户端与服务器保持连接的时间)# 引入虚拟主机配置(推荐将不同站点的配置拆分到子文件)include /usr/local/nginx/conf/conf.d/*.conf;# 4. 虚拟主机块(Server块):一个Server对应一个站点/域名server {listen 80; # 监听端口(默认80,HTTPS用443)server_name www.example.com example.com; # 绑定的域名(多个域名用空格分隔)root /usr/local/nginx/html/example; # 站点根目录(文件存放路径)index index.html index.htm; # 默认首页文件(优先级从左到右)# 5. 路由块(Location块):匹配请求路径,配置特定路径的规则location / {# 路径匹配时的处理(如转发、缓存、权限控制等)try_files $uri $uri/ /index.html; # 尝试访问文件→目录→跳转index.html(适合SPA应用)}# 匹配静态资源路径(如图片、CSS、JS)location ~* \.(jpg|jpeg|png|gif|css|js)$ {expires 30d; # 静态资源缓存30天(减少重复请求)add_header Cache-Control "public, max-age=2592000"; # 缓存控制头}}
}
3. 配置语法规则
- 指令格式:
指令名 参数;
(指令名与参数用空格分隔,末尾必须加;
,否则报错) - 块指令:指令名后带
{}
,内部可嵌套其他指令(如events {}
、http {}
、server {}
) - 注释:
# 注释内容
(单行注释,无多行注释) - 变量:以
$
开头,如$remote_addr
(客户端IP)、$request
(请求行)、$status
(响应状态码) - 匹配优先级(Location块):
匹配符号 含义 优先级 示例 =
精确匹配路径 最高 location = /login {}
^~
前缀匹配(不正则) 次高 location ^~ /admin {}
~
/~*
正则匹配(区分大小写,*不区分) 中 location ~* \.html {}
无符号 普通前缀匹配 最低 location /api {}
二、核心模块配置详解
Nginx的功能通过“模块”实现,核心模块的配置直接影响服务性能和功能,以下是常用模块的关键配置。
1. 全局与事件模块(性能基础)
全局块核心指令
指令 | 作用 | 推荐配置 |
---|---|---|
user |
指定运行Nginx的用户和组(避免用root,降低安全风险) | user nginx nginx; |
worker_processes |
工作进程数(与CPU核心数一致,或设为auto 自动匹配) |
worker_processes auto; |
worker_cpu_affinity |
绑定工作进程到指定CPU核心(减少进程切换开销) | worker_cpu_affinity 0001 0010 0100 1000; (4核心) |
error_log |
错误日志路径和级别(生产环境建议用warn 或error ,避免日志过大) |
error_log logs/error.log warn; |
事件块核心指令
指令 | 作用 | 推荐配置 |
---|---|---|
worker_connections |
每个工作进程的最大并发连接数(需结合系统ulimit 限制) |
worker_connections 10240; (高并发场景可设更高) |
use |
指定网络I/O模型(Linux推荐epoll ,FreeBSD用kqueue ) |
use epoll; |
multi_accept |
允许工作进程一次性接受所有待处理连接(提升并发效率) | multi_accept on; |
2. HTTP模块(Web服务核心)
1)MIME类型配置
mime.types
文件定义了文件扩展名与HTTP响应头Content-Type
的对应关系(如.html
对应text/html
),确保浏览器正确解析文件:
include mime.types; # 必须引入,否则无法正确识别静态文件类型
default_type application/octet-stream; # 未知文件类型默认用二进制流(避免解析错误)
2)日志配置
通过log_format
自定义日志格式,access_log
指定日志输出路径,常用变量说明:
$remote_addr
:客户端IP地址$remote_user
:客户端认证用户名(无则为-
)$time_local
:服务器本地时间(格式:dd/Mon/YYYY:HH:MM:SS +0800
)$request
:请求行(如GET /index.html HTTP/1.1
)$status
:HTTP响应状态码(如200、404、502)$http_referer
:Referer头(请求来源页面)$http_user_agent
:User-Agent头(客户端浏览器/设备信息)$http_x_forwarded_for
:代理后的真实客户端IP(反向代理场景需配置)
示例:定义JSON格式日志(便于日志分析工具解析)
log_format json_log '{"remote_addr":"$remote_addr","time_local":"$time_local","request":"$request","status":$status,"body_bytes_sent":$body_bytes_sent,"http_referer":"$http_referer","http_user_agent":"$http_user_agent"}';
access_log logs/access_json.log json_log;
3)性能优化配置
指令 | 作用 | 推荐配置 |
---|---|---|
sendfile |
启用零拷贝(内核直接将文件数据发送到网卡,跳过用户态→内核态拷贝) | sendfile on; |
tcp_nopush |
合并TCP数据包(减少网络传输次数,适合大文件传输) | tcp_nopush on; |
tcp_nodelay |
禁用Nagle算法(减少小数据包延迟,适合实时通信如WebSocket) | tcp_nodelay on; |
keepalive_timeout |
长连接超时时间(客户端与服务器保持连接,避免重复握手) | keepalive_timeout 65; |
client_max_body_size |
限制客户端请求体最大尺寸(防止大文件上传攻击,默认1m) | client_max_body_size 10m; (根据业务调整) |
3. 虚拟主机(Server块)配置
一个server
块对应一个独立的站点,可通过listen
和server_name
区分不同站点,支持基于“端口”和“域名”的虚拟主机。
示例1:基于域名的虚拟主机(同一端口,不同域名)
# 站点1:www.example.com
server {listen 80;server_name www.example.com; # 绑定域名root /usr/local/nginx/html/example1; # 站点1根目录index index.html;# 访问日志(单独记录该站点日志)access_log logs/example1_access.log main;
}# 站点2:www.test.com
server {listen 80;server_name www.test.com; # 绑定另一个域名root /usr/local/nginx/html/example2; # 站点2根目录index index.html;access_log logs/example2_access.log main;
}
示例2:基于端口的虚拟主机(同一域名,不同端口)
# 端口80:HTTP服务
server {listen 80;server_name www.example.com;root /usr/local/nginx/html/http;index index.html;
}# 端口8080:另一个服务(如管理后台)
server {listen 8080;server_name www.example.com;root /usr/local/nginx/html/admin;index login.html;# 限制访问IP(仅允许192.168.1.0/24网段访问管理后台)allow 192.168.1.0/24;deny all;
}
4. 路由(Location块)配置
location
块用于匹配请求路径,实现路径级别的精准控制,常见场景包括静态资源处理、反向代理、权限控制等。
示例1:静态资源缓存(图片、CSS、JS)
# 匹配所有后缀为jpg/jpeg/png/gif/css/js的请求(不区分大小写)
location ~* \.(jpg|jpeg|png|gif|css|js)$ {root /usr/local/nginx/html/static; # 静态资源根目录expires 7d; # 浏览器缓存7天add_header Cache-Control "public, max-age=604800"; # 缓存控制(7天=604800秒)add_header Access-Control-Allow-Origin *; # 允许跨域访问(静态资源常用)
}
示例2:反向代理(将请求转发到后端服务)
反向代理是Nginx的核心功能之一,可将客户端请求转发到后端Tomcat、Node.js、Python等服务,实现“前端Nginx+后端服务”的架构。
server {listen 80;server_name api.example.com; # 接口域名# 匹配所有请求,转发到后端Node.js服务(127.0.0.1:3000)location / {proxy_pass http://127.0.0.1:3000; # 后端服务地址(必须加http://)proxy_set_header Host $host; # 传递Host头(后端需根据Host判断站点)proxy_set_header X-Real-IP $remote_addr; # 传递真实客户端IPproxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 传递代理链IPproxy_set_header X-Forwarded-Proto $scheme; # 传递协议(http/https)}
}
示例3:URL重写(Rewrite)
通过rewrite
指令修改请求URL,实现跳转、路径替换等功能,语法:rewrite 匹配规则 目标路径 标记;
。
常见标记:
last
:执行完当前rewrite后,重新匹配locationbreak
:执行完当前rewrite后,停止后续rewriteredirect
:临时重定向(302状态码)permanent
:永久重定向(301状态码)
示例:HTTP跳转HTTPS(强制HTTPS访问)
server {listen 80;server_name www.example.com;# 所有HTTP请求重定向到HTTPS(301永久重定向)rewrite ^(.*)$ https://$server_name$1 permanent;
}
5. HTTPS配置(SSL/TLS)
HTTPS需配置SSL证书(可从Let's Encrypt免费申请),监听443端口,核心指令包括ssl_certificate
(证书路径)、ssl_certificate_key
(私钥路径)。
示例:HTTPS站点配置
server {listen 443 ssl; # 监听443端口,启用SSLserver_name www.example.com;# SSL证书配置(替换为你的证书路径)ssl_certificate /usr/local/nginx/conf/ssl/www.example.com.crt; # 公钥证书ssl_certificate_key /usr/local/nginx/conf/ssl/www.example.com.key; # 私钥# SSL优化配置(提升安全性和性能)ssl_protocols TLSv1.2 TLSv1.3; # 仅启用安全的TLS协议(禁用SSLv3、TLSv1.0/1.1)ssl_ciphers ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384; # 安全的加密套件ssl_prefer_server_ciphers on; # 优先使用服务器端的加密套件ssl_session_cache shared:SSL:10m; # SSL会话缓存(减少重复握手)ssl_session_timeout 10m; # SSL会话超时时间# 站点根目录和首页root /usr/local/nginx/html/https;index index.html;
}
三、常见场景配置示例
1. 负载均衡(反向代理多后端服务)
通过upstream
指令定义后端服务集群,Nginx自动将请求分发到不同后端,实现负载均衡和高可用。
# 1. 定义后端服务集群(upstream块需放在http块内)
upstream backend_servers {server 192.168.1.100:8080 weight=5; # 权重5(接收50%请求)server 192.168.1.101:8080 weight=3; # 权重3(接收30%请求)server 192.168.1.102:8080 backup; # 备用节点(主节点故障时启用)# server 192.168.1.103:8080 down; # 下线节点(不接收请求)
}# 2. 虚拟主机配置(转发请求到upstream)
server {listen 80;server_name www.example.com;location / {proxy_pass http://backend_servers; # 转发到后端集群proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;# 健康检查(可选,需启用ngx_http_upstream_module)proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;}
}
负载均衡策略(默认是轮询
,可通过upstream
指令指定):
轮询
:默认,按顺序分发请求(权重可调整)ip_hash
:按客户端IP哈希分配(同一IP始终访问同一后端,适合会话保持)least_conn
:优先分发到连接数最少的后端(适合后端性能不均场景)
2. 静态网站部署(SPA应用如Vue/React)
SPA(单页应用)只有一个index.html
,所有路由由前端控制,需配置try_files
确保刷新页面不404。
server {listen 80;server_name spa.example.com;root /usr/local/nginx/html/spa; # SPA打包后的dist目录index index.html;location / {# 尝试访问请求的文件→请求的目录→跳转index.html(前端路由接管)try_files $uri $uri/ /index.html;}# 静态资源缓存location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {expires 30d;add_header Cache-Control "public, max-age=2592000";}
}
3. 防盗链配置(防止静态资源被其他网站盗用)
通过valid_referers
指令限制请求的Referer(来源页面),仅允许指定域名引用资源。
location ~* \.(jpg|jpeg|png|gif|mp4)$ {root /usr/local/nginx/html/static;# 允许的Referer(none:直接访问,blocked:Referer为空,*.example.com:example.com的子域名)valid_referers none blocked *.example.com example.com;# 如果Referer不在允许列表,返回403禁止访问(或返回自定义图片)if ($invalid_referer) {return 403;# rewrite ^/ /static/403.png last; # 可选:返回防盗链图片}
}
四、配置验证与重载
修改Nginx配置后,必须验证配置语法并重载服务,避免配置错误导致服务中断。
1. 验证配置语法
# 进入Nginx sbin目录(你的路径是/usr/local/nginx/sbin)
cd /usr/local/nginx/sbin# 验证配置文件语法(无报错则表示语法正确)
./nginx -t
成功输出示例:
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
2. 重载配置(不中断服务)
# 重载配置(服务不会重启,新请求将使用新配置)
./nginx -s reload
3. 其他常用命令
./nginx # 启动Nginx
./nginx -s stop # 强制停止Nginx(立即终止进程)
./nginx -s quit # 优雅停止Nginx(处理完当前请求后终止)
./nginx -v # 查看Nginx版本(如nginx version: nginx/1.28.0)
./nginx -V # 查看Nginx版本及编译参数(如--prefix、--with-http_ssl_module)
五、常见配置问题排查
-
403 Forbidden:
- 站点根目录权限不足(Nginx用户无读权限,需执行
chown -R nginx:nginx /usr/local/nginx/html
) index
指令指定的首页文件不存在- 防盗链配置中的
$invalid_referer
触发
- 站点根目录权限不足(Nginx用户无读权限,需执行
-
404 Not Found:
root
指令路径错误(文件实际路径与配置不符)- SPA应用未配置
try_files $uri $uri/ /index.html
(刷新页面时404)
-
502 Bad Gateway:
- 反向代理的后端服务未启动(如
proxy_pass
指向的127.0.0.1:3000
未运行) - 后端服务端口被防火墙拦截(需开放端口,如
firewall-cmd --add-port=3000/tcp --permanent
)
- 反向代理的后端服务未启动(如
-
HTTPS证书错误:
- 证书或私钥路径错误
- 证书与域名不匹配(如用www.example.com的证书绑定test.example.com)
- 未启用SSL模块(编译时需加
--with-http_ssl_module
,可通过./nginx -V
查看)
通过以上内容,可掌握Nginx配置的核心逻辑和常见场景用法。实际应用中,需根据业务需求(如高并发、HTTPS、负载均衡)灵活调整配置,同时结合日志分析和性能监控(如nginx-status
模块)优化服务。