Nginx 是一款高性能的 Web 服务器和反向代理服务器,其灵活的配置语法和模块化设计使其成为现代 Web 架构的核心组件。本文将通过代码注释和示例,帮助你掌握 Nginx 的核心配置方法。
Nginx 的反向代理就好比是商场里的 “导购中转站”。当你走进商场想买某样东西,你不用自己一家一家店铺去找,只需要告诉导购员你的需求,导购员就会帮你找到对应的店铺,再指引你过去。
在网络世界里,用户就像是进入商场的顾客,而 Nginx 就是这个特别能干的导购员。用户发送的请求就像是对导购员说的需求,Nginx 收到请求后,不会直接把用户和后端服务器(就像商场里的店铺)对接,而是自己先 “分析” 这个请求,然后根据预先设定的规则,把请求转发到合适的后端服务器上处理。
对于用户来说,他全程只和 Nginx “打交道”,根本不知道后端服务器的存在,就像你只知道是导购员帮你找到了商品,却不清楚商场里到底有多少店铺、它们都在哪里。而且,这个 “导购员” 还能保护后端服务器,避免服务器直接暴露在用户面前,防止恶意请求和攻击,就像导购员可以帮店铺过滤掉一些不合理的要求 ,让店铺(后端服务器)能更安心地提供服务。
一、Nginx 配置文件结构
Nginx 的主配置文件通常位于 /etc/nginx/nginx.conf,遵循分层配置结构:
# 全局上下文:配置影响整体运行参数的指令
user nginx; # 定义运行 worker 进程的用户和组
worker_processes auto; # 自动设置工作进程数量(通常等于 CPU 核心数)
events { # 事件模块配置
worker_connections 1024; # 每个 worker 的最大连接数
}
http { # HTTP 服务器配置
include /etc/nginx/mime.types;
default_type application/octet-stream;
# 配置多个 Server 块实现虚拟主机
server {
listen 80; # 监听端口
server_name example.com; # 域名匹配
location / { # URI 路由配置
root /var/www/html;
index index.html;
}
}
}
二、核心配置模块详解
1. HTTP 模块配置
http {
# 基础配置
sendfile on; # 启用高效文件传输模式
tcp_nopush on; # 优化数据包发送
keepalive_timeout 65; # 保持连接的超时时间
# 日志配置
access_log /var/log/nginx/access.log; # 访问日志路径
error_log /var/log/nginx/error.log; # 错误日志路径
# Gzip 压缩配置
gzip on;
gzip_types text/plain text/css application/json;
}
2. Server 虚拟主机配置
server {
listen 80; # 监听 IPv4 端口
listen [::]:80; # 监听 IPv6 端口
server_name example.com www.example.com; # 域名匹配
# 强制 HTTPS 跳转(常用安全实践)
if ($scheme = http) {
return 301 https://$server_name$request_uri;
}
# 静态文件服务配置
location /static/ {
alias /var/www/static/; # 路径别名(注意结尾的 /)
expires 30d; # 客户端缓存时间
}
}
3. Location 路由匹配
location /api/ {
# 反向代理配置
proxy_pass http://backend_server; # 转发到上游服务器
proxy_set_header Host $host; # 保留原始 Host 头
# 超时控制
proxy_connect_timeout 5s;
proxy_read_timeout 60s;
}
# 正则匹配示例
location ~ .php$ {
fastcgi_pass 127.0.0.1:9000;
include fastcgi_params;
}
三、高级配置示例
1. 负载均衡配置
upstream backend { # 定义上游服务器组
least_conn; # 使用最少连接算法
server 10.0.0.1:8080 weight=3; # 权重配置
server 10.0.0.2:8080;
keepalive 32; # 保持长连接数量
}
server {
location / {
proxy_pass http://backend; # 使用上游服务器组
}
}
2. HTTPS 安全配置
server {
listen 443 ssl http2; # 启用 HTTP/2 协议
ssl_certificate /etc/ssl/certs/server.crt;
ssl_certificate_key /etc/ssl/private/server.key;
# 安全协议配置
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256;
ssl_prefer_server_ciphers on;
}
3. 访问控制
location /admin/ {
allow 192.168.1.0/24; # 允许内网访问
deny all; # 拒绝其他所有 IP
auth_basic "Restricted"; # 基础认证
auth_basic_user_file /etc/nginx/.htpasswd;
}
四、配置优化技巧
- 性能优化:
http {
# 文件描述符缓存
open_file_cache max=1000 inactive=20s;
# 客户端限制
client_max_body_size 10m; # 最大上传文件大小
client_body_timeout 30s;
}
- 缓存配置:
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m;
location / {
proxy_cache my_cache;
proxy_cache_valid 200 302 10m;
}
五、调试与注意事项
- 配置检查:
nginx -t # 测试配置文件语法
nginx -s reload # 热重载配置
- 常见陷阱:
- 路径结尾 / 的区分:alias 需要以 / 结尾
- 正则匹配优先级:= > ^~ > ~ > 无修饰符
- 避免过度使用 if 语句(影响性能)
Nginx 负载均衡详解:配置方法与使用场景
六、负载均衡核心概念
作用:
将客户端请求分发到多个后端服务器,实现:
- 流量分摊:提升系统并发处理能力
- 高可用:自动剔除故障节点
- 横向扩展:动态增加服务器资源
典型使用场景:
- Web 应用服务器集群
- 微服务 API 网关
- 文件/视频等静态资源分发
- 数据库读操作分流
七、核心配置方法
1. 基础负载均衡配置
http {
# 定义上游服务器组(backend_servers 是自定义名称)
upstream backend_servers {
# 默认使用轮询(Round Robin)策略
server 192.168.1.101:8080;
server 192.168.1.102:8080;
server 192.168.1.103:8080;
}
server {
listen 80;
location / {
# 将请求代理到上游服务器组
proxy_pass http://backend_servers;
proxy_set_header Host $host;
}
}
}
2. 负载均衡策略详解
(1) 加权轮询(Weighted Round Robin)
upstream backend {
server 192.168.1.101 weight=3; # 该服务器处理 3 倍流量
server 192.168.1.102 weight=2;
server 192.168.1.103 weight=1;
}
适用场景:
- 服务器硬件配置不均衡
- 需要优先使用某些节点
(2) IP 哈希(IP Hash)
upstream backend {
ip_hash; # 相同客户端 IP 总访问同一后端
server 192.168.1.101;
server 192.168.1.102;
}
适用场景:
- 需要会话保持(Session Persistence)
- 缓存优化场景
(3) 最少连接(Least Connections)
upstream backend {
least_conn;
server 192.168.1.101;
server 192.168.1.102;
}
适用场景:
- 后端服务器处理时间差异较大
- 长连接应用(如 WebSocket)
八、高级配置技巧
1. 健康检查机制
upstream backend {
server 192.168.1.101 max_fails=3 fail_timeout=30s;
server 192.168.1.102 max_fails=3 fail_timeout=30s;
}
- max_fails:允许的最大失败次数
- fail_timeout:故障服务器暂停服务时间
2. 被动健康检查 + 恢复
Nginx 默认通过被动检查(根据请求失败情况)自动标记故障节点,恢复后自动重新加入集群。
3. 主动健康检查(需 Nginx Plus 或开源替代方案)
通过定期发送探测请求检查服务器状态(开源方案可使用 nginx_upstream_check_module)。
九、完整配置示例
HTTP 负载均衡
upstream web_app {
least_conn;
server 10.0.0.1:8080 weight=2;
server 10.0.0.2:8080;
server 10.0.0.3:8080 max_fails=3 fail_timeout=10s;
keepalive 32; # 保持与后端的长连接
}
server {
listen 80;
server_name app.example.com;
location / {
proxy_pass http://web_app;
proxy_http_version 1.1;
proxy_set_header Connection "";
# 超时控制
proxy_connect_timeout 2s;
proxy_read_timeout 5s;
}
}
HTTPS 负载均衡
upstream api_servers {
ip_hash;
server 10.0.1.10:8443;
server 10.0.1.11:8443;
}
server {
listen 443 ssl;
server_name api.example.com;
ssl_certificate /etc/nginx/ssl/server.crt;
ssl_certificate_key /etc/nginx/ssl/server.key;
location / {
proxy_pass https://api_servers; # 注意协议匹配
proxy_ssl_verify on; # 验证后端证书
}
}
十、使用场景与最佳实践
典型场景示例
场景 | 配置建议 |
电商大促 | 加权轮询 + 自动扩容云服务器 |
实时聊天 | 最少连接 + WebSocket 支持 |
全球业务 | 基于地理位置的负载均衡(需配合 GeoIP 模块) |
金丝雀发布 | 通过权重逐步导流到新版本 |
最佳实践
- 会话保持:
- 使用 ip_hash 或 sticky 模块(需 Nginx Plus)
- 配合 Redis 等外部 Session 存储
- 日志增强:
log_format upstream_log '$remote_addr - $upstream_addr [$time_local] '
'"$request" $status $body_bytes_sent';
access_log /var/log/nginx/lb_access.log upstream_log;
- 安全加固:
location / {
proxy_pass http://backend;
# 隐藏后端服务器信息
proxy_hide_header X-Powered-By;
proxy_set_header X-Real-IP $remote_addr;
}
十一、故障排查命令
# 查看实时连接状态
ss -tulnp | grep nginx
# 监控后端健康状态(需配置状态页)
curl http://localhost/nginx_status
# 调试负载均衡决策
tail -f /var/log/nginx/access.log | grep upstream