Nginx参数配置
2024/8/8大约 10 分钟
完整的Nginx配置结构层次
📁 Nginx完整配置文件结构
# ==============================
# Main Context (全局配置)
# ==============================
# 最外层,没有显式块包裹
user nginx nginx; # 运行用户
worker_processes auto; # 工作进程数
pid /var/run/nginx.pid; # PID文件路径
error_log /var/log/nginx/error.log warn; # 错误日志
daemon on; # 守护进程模式
worker_rlimit_nofile 65535; # 文件描述符限制
load_module modules/ngx_http_geoip_module.so; # 动态模块加载
# ==============================
# Events Context (事件模块)
# ==============================
events {
worker_connections 1024; # 每个worker连接数
use epoll; # 事件驱动模型
accept_mutex on; # 连接互斥锁
multi_accept on; # 多连接接受
}
# ==============================
# HTTP Context (HTTP模块)
# ==============================
http {
# ---------- 基础配置 ----------
include /etc/nginx/mime.types; # MIME类型
default_type application/octet-stream; # 默认类型
# ---------- 日志格式 ----------
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 /var/log/nginx/access.log main; # 访问日志
# ---------- 核心模块 ----------
# 1. Upstream模块 (负载均衡)
upstream backend_cluster {
server 192.168.1.10:8080 weight=3;
server 192.168.1.11:8080;
server 192.168.1.12:8080 backup;
# 负载均衡方法
least_conn; # 最少连接
# 健康检查
max_fails=3 fail_timeout=30s;
}
# 2. 缓存配置
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m;
# 3. 限流配置
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;
# ---------- Server Context ----------
server {
listen 80; # 监听端口
server_name example.com www.example.com; # 服务器名
# ---------- Location Context ----------
location / {
proxy_pass http://backend_cluster; # 代理到upstream
# 请求头配置
proxy_set_header Host $host; # 传递客户端请求的主机名(容错性强,无 Host 头时回退到 server_name)
proxy_set_header X-Real-IP $remote_addr; # 传递客户端真实 IP(直接与 Nginx 连接的 IP)
proxy_set_header X-Real-Port $remote_port; # 传递客户端真实访问端口(补充端口信息,便于后端统计)
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 传递代理链路 IP 列表(格式:客户端IP, 一级代理IP, 二级...)
proxy_set_header X-Forwarded-Proto $scheme; # 传递真实协议(http/https,解决代理后后端无法识别协议的问题)
proxy_set_header X-Forwarded-Path $request_uri; # 传递客户端请求的完整路径(含参数)
# ---------- 嵌套if Context ----------
if ($request_method = POST) {
limit_req zone=one burst=5;
}
}
location /static/ {
root /var/www/html; # 静态文件
expires 30d; # 缓存时间
# ---------- 嵌套location ----------
location ~* \.(css|js)$ {
gzip_static on;
}
}
location /api/ {
# ---------- 嵌套limit_except ----------
limit_except GET POST {
deny all;
}
}
}
# ---------- 多个Server ----------
server {
listen 443 ssl http2;
server_name secure.example.com;
ssl_certificate /path/to/cert.pem;
ssl_certificate_key /path/to/key.pem;
}
}
# ==============================
# Mail Context (邮件代理模块)
# ==============================
mail {
auth_http localhost:9000/auth; # 认证服务器
# ---------- Mail Server ----------
server {
listen 25; # SMTP
protocol smtp;
# ---------- 认证配置 ----------
auth_http_header X-Auth-Key "secret";
}
server {
listen 110; # POP3
protocol pop3;
proxy on;
}
server {
listen 143; # IMAP
protocol imap;
proxy on;
}
}
# ==============================
# Stream Context (四层代理模块)
# ==============================
stream {
# ---------- Stream Upstream ----------
upstream database_cluster {
server 192.168.2.10:3306;
server 192.168.2.11:3306;
# 四层负载均衡
hash $remote_addr consistent; # 一致性哈希
}
upstream redis_cluster {
server 192.168.2.20:6379;
server 192168.2.21:6379;
}
# ---------- Stream Server ----------
server {
listen 13306; # MySQL代理
proxy_pass database_cluster;
proxy_timeout 3s;
# ---------- SSL终止 ----------
ssl_preread on;
}
server {
listen 16379; # Redis代理
proxy_pass redis_cluster;
}
# ---------- UDP代理 ----------
server {
listen 53 udp; # DNS代理
proxy_pass 8.8.8.8:53;
}
}
# ==============================
# 动态模块配置
# ==============================
# 1. RTMP模块 (视频流)
rtmp {
server {
listen 1935; # RTMP端口
chunk_size 4096;
application live {
live on;
record off;
# ---------- 推流配置 ----------
push rtmp://live.example.com;
}
}
}
# 2. Perl模块
perl 'sub {
my $r = shift;
$r->send_http_header("text/html");
return "Hello from Perl!";
}';
# 3. Lua模块
lua_shared_dict my_cache 10m;🔄 配置上下文层次关系
Main Context (主上下文)
├── events { ... } # 事件处理
├── http { ... } # HTTP服务
│ ├── upstream { ... } # 上游服务器组
│ ├── server { ... } # 虚拟主机
│ │ ├── location { ... } # 请求路径
│ │ │ ├── if { ... } # 条件判断
│ │ │ └── limit_except { ... } # 请求方法限制
│ │ └── location { ... } # 嵌套location
├── stream { ... } # 四层代理
│ ├── upstream { ... } # 流上游
│ └── server { ... } # 流服务器
├── mail { ... } # 邮件代理
│ └── server { ... } # 邮件服务器
└── 动态模块 (rtmp, perl, lua等)🎯 各上下文的详细说明
1. Main Context (主上下文)
# 核心配置
worker_processes auto; # CPU核心数
worker_rlimit_nofile 65535; # 文件描述符限制
error_log /path/to/error.log level; # 错误日志级别: debug,info,notice,warn,error,crit
# 进程管理
daemon on|off; # 守护进程模式
master_process on|off; # 主进程模式
pcre_jit on; # PCRE JIT编译
# 动态模块
load_module modules/ngx_http_geoip_module.so;
load_module modules/ngx_stream_module.so;2. Events Context
events {
# 连接处理模型
use epoll|kqueue|select|poll; # 事件驱动模型
# 连接配置
worker_connections 1024; # 每个worker最大连接数
multi_accept on; # 一次接受多个连接
# 连接互斥
accept_mutex on; # 负载均衡锁
accept_mutex_delay 500ms; # 锁延迟
# 优化
epoll_events 512; # epoll事件数
}3. HTTP Context
http {
# 基础
include mime.types;
default_type application/octet-stream;
# 核心指令
sendfile on; # 零拷贝
tcp_nopush on; # 优化TCP
tcp_nodelay on; # 禁用Nagle算法
keepalive_timeout 65; # 长连接超时
# 压缩
gzip on;
gzip_types text/plain application/json;
# 缓存
proxy_cache_path /path/to/cache levels=1:2 keys_zone=zone:10m;
# 限制
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;
limit_conn_zone $binary_remote_addr zone=addr:10m;
}4. Stream Context
stream {
# 四层代理核心
proxy_connect_timeout 1s;
proxy_timeout 3s;
# SSL透传
ssl_preread on;
# 负载均衡算法
hash $remote_addr consistent;
# 日志
log_format basic '$remote_addr [$time_local] $status';
access_log /var/log/stream.log basic;
}5. Mail Context
mail {
# 认证
auth_http http://auth.server:80/auth;
auth_http_header X-Auth-Token "secret";
# 协议
protocol imap|pop3|smtp;
# 代理
proxy on;
proxy_pass_error_message on;
}🧩 嵌套和包含关系
包含指令 (include)
# 主配置文件
http {
include /etc/nginx/conf.d/*.conf; # 通用配置
include /etc/nginx/sites-enabled/*; # 站点配置
# 分模块加载
include upstreams/*.conf; # 上游配置
include servers/*.conf; # 服务器配置
include ssl/*.conf; # SSL配置
}多配置文件结构
/etc/nginx/
├── nginx.conf # 主配置
├── mime.types # MIME类型
├── conf.d/
│ ├── gzip.conf # 压缩配置
│ ├── security.conf # 安全配置
│ └── proxy.conf # 代理配置
├── upstreams/
│ ├── backend.conf # 后端服务
│ ├── api.conf # API服务
│ └── database.conf # 数据库
├── servers/
│ ├── example.com.conf # 虚拟主机
│ ├── api.example.com.conf
│ └── admin.example.com.conf
├── ssl/
│ ├── certs/
│ └── params.conf
└── sites-{available,enabled}/ # 站点链接🔧 条件配置示例
条件块嵌套
http {
map $http_user_agent $is_bot {
default 0;
~*bot 1;
~*spider 1;
}
server {
location / {
if ($is_bot) {
# 机器人访问特殊处理
return 403 "No bots allowed";
}
# 正常访问处理
proxy_pass http://backend;
# 更多条件
if ($request_method = POST) {
client_max_body_size 10m;
}
}
# 嵌套location
location ~ \.php$ {
fastcgi_pass php_backend;
location ~ \.php/admin {
# PHP管理页面特殊处理
auth_basic "Admin Area";
auth_basic_user_file /etc/nginx/.htpasswd;
}
}
}
}⚠️ 配置注意事项
1. 作用域规则
# ✅ 正确:从外到内继承
http {
gzip on; # 全局生效
server {
gzip off; # 覆盖全局,仅本server生效
location / {
# 继承server的gzip off
}
}
}
# ❌ 错误:内层不能定义外层
server {
# upstream必须定义在http块内
upstream backend { ... } # 错误位置
location / {
proxy_pass http://backend;
}
}2. 优先级顺序
# 优先级从高到低:
1. location正则匹配 (location ~)
2. location前缀精确匹配 (location =)
3. location前缀最长匹配 (location /path/)
4. location前缀匹配 (location /)
5. server块
6. http块
7. 主配置文件3. 动态模块的特殊性
# RTMP模块有自己的上下文
rtmp {
server {
application live {
# 推拉流配置
}
}
}
# Lua模块混合使用
http {
location /lua {
# Lua代码块
content_by_lua_block {
ngx.say("Hello from Lua!")
}
}
}📊 配置结构速查表
| 上下文 | 位置 | 用途 | 可包含指令 |
|---|---|---|---|
| main | 最外层 | 全局配置 | user, worker_processes, error_log |
| events | main内 | 连接处理 | worker_connections, use |
| http | main内 | HTTP服务 | server, upstream, location |
| stream | main内 | TCP/UDP代理 | server, upstream |
| main内 | 邮件代理 | server, auth_http | |
| server | http/stream/mail内 | 虚拟主机 | listen, server_name, location |
| location | server内 | URI匹配 | proxy_pass, root, rewrite |
| upstream | http/stream内 | 负载均衡 | server, ip_hash, least_conn |
| if | location/server内 | 条件判断 | set, return, rewrite |
| limit_except | location内 | 方法限制 | allow, deny, auth_basic |
这个结构覆盖了Nginx配置的所有可能情况,从主配置到各个模块的嵌套关系,确保了配置的完整性和正确性。
stream 和 upstream 的区别
这是两个完全不同的Nginx概念,让我详细解释:
📊 核心区别概览
| 特性 | upstream | stream |
|---|---|---|
| 本质 | 指令/配置块 | 顶级模块/上下文 |
| 作用 | 定义后端服务器组 | 处理TCP/UDP四层代理 |
| 层级 | http/stream模块的子块 | 与http模块同级 |
| 用途 | 负载均衡后端服务器 | 四层网络代理 |
| 位置 | 在http或stream模块内部 | 在main上下文,与http并列 |
🎯 1. upstream - 上游服务器组
定义:
- 一个配置块,定义一组后端服务器
- 用于负载均衡和故障转移
- 可以在http或stream模块中使用
位置结构:
# upstream是配置块,不是模块
http { # http模块
upstream backend { # upstream块
server 192.168.1.10:80;
server 192.168.1.11:80;
}
}
stream { # stream模块
upstream db_servers { # upstream块
server 192.168.1.20:3306;
server 192.168.1.21:3306;
}
}示例用法:
# HTTP代理中的upstream
http {
upstream web_backend {
server 10.0.0.1:8080 weight=3;
server 10.0.0.2:8080;
server 10.0.0.3:8080 backup;
# 负载均衡方法
least_conn;
# 健康检查
max_fails=3 fail_timeout=30s;
}
server {
location / {
proxy_pass http://web_backend; # 使用upstream
}
}
}🌊 2. stream - 流代理模块
定义:
- 一个顶级模块(与http模块同级)
- 处理TCP/UDP四层代理
- 不解析应用层协议
位置结构:
# stream是顶级模块
events { ... } # events模块
http { # http模块(七层代理)
server { ... }
}
stream { # stream模块(四层代理),与http同级
server { ... }
}示例用法:
# TCP/UDP代理示例
events {
worker_connections 1024;
}
stream { # stream模块开始
# 定义数据库负载均衡
upstream mysql_cluster {
server 192.168.1.10:3306;
server 192.168.1.11:3306;
}
# SSH代理
upstream ssh_servers {
server 192.168.1.20:22;
server 192.168.1.21:22;
}
# TCP代理服务器
server {
listen 3306; # 代理MySQL
proxy_pass mysql_cluster;
proxy_timeout 3s;
}
server {
listen 2222; # 代理SSH
proxy_pass ssh_servers;
}
# UDP代理服务器
server {
listen 53 udp; # 代理DNS
proxy_pass 8.8.8.8:53;
}
}🔀 3. 两者关系:协同工作
# 完整的nginx.conf示例
user nginx;
worker_processes auto;
events {
worker_connections 1024;
}
# 1. HTTP模块(七层应用代理)
http {
# HTTP代理的upstream
upstream web_servers {
server 10.0.0.1:80;
server 10.0.0.2:80;
}
upstream api_servers {
server 10.0.0.3:8080;
server 10.0.0.4:8080;
}
server {
listen 80;
server_name example.com;
location / {
proxy_pass http://web_servers; # 使用http upstream
}
location /api/ {
proxy_pass http://api_servers; # 使用http upstream
}
}
}
# 2. STREAM模块(四层网络代理)
stream {
# 数据库代理的upstream
upstream mysql_backend {
server 192.168.1.10:3306;
server 192.168.1.11:3306;
}
# Redis代理的upstream
redis_cluster {
server 192.168.1.20:6379;
server 192.168.1.21:6379;
}
# TCP代理服务器
server {
listen 13306; # 外部访问端口
proxy_pass mysql_backend; # 使用stream upstream
}
server {
listen 16379;
proxy_pass redis_cluster; # 使用stream upstream
}
}🆚 4. 详细对比表
| 对比维度 | upstream | stream |
|---|---|---|
| 是什么 | 配置指令/块 | 核心模块/上下文 |
| 功能 | 定义服务器组 | 四层网络代理 |
| 协议 | 不直接处理协议 | 处理TCP/UDP |
| 解析 | 不解析内容 | 不解析应用层 |
| 性能 | 无直接性能影响 | 高性能,不解析内容 |
| 配置位置 | http块内 或 stream块内 | 与http块并列 |
| 语法 | upstream name { ... } | stream { ... } |
| 使用场景 | 负载均衡、故障转移 | 数据库代理、SSH、DNS等 |
💡 5. 实际应用场景
场景1:数据库负载均衡
stream { # 使用stream模块
upstream mysql_masters {
server db1.example.com:3306;
server db2.example.com:3306;
}
upstream mysql_slaves {
server db3.example.com:3306;
server db4.example.com:3306;
}
server {
listen 3307; # 主库代理端口
proxy_pass mysql_masters;
}
server {
listen 3308; # 从库代理端口
proxy_pass mysql_slaves;
}
}场景2:HTTP应用负载均衡
http { # 使用http模块
upstream app_servers {
least_conn;
server app1.example.com:8080;
server app2.example.com:8080;
server app3.example.com:8080;
}
server {
listen 80;
location / {
proxy_pass http://app_servers; # http代理
# 请求头配置
proxy_set_header Host $host; # 传递客户端请求的主机名(容错性强,无 Host 头时回退到 server_name)
proxy_set_header X-Real-IP $remote_addr; # 传递客户端真实 IP(直接与 Nginx 连接的 IP)
proxy_set_header X-Real-Port $remote_port; # 传递客户端真实访问端口(补充端口信息,便于后端统计)
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 传递代理链路 IP 列表(格式:客户端IP, 一级代理IP, 二级...)
proxy_set_header X-Forwarded-Proto $scheme; # 传递真实协议(http/https,解决代理后后端无法识别协议的问题)
proxy_set_header X-Forwarded-Path $request_uri; # 传递客户端请求的完整路径(含参数)
}
}
}⚠️ 6. 常见错误
错误1:在错误位置使用upstream
# ❌ 错误:upstream在http模块外
upstream backend { ... }
http {
server { ... }
}错误2:混淆stream和http代理
stream {
server {
listen 80;
# ❌ 错误:stream模块中不能使用location
location / {
proxy_pass ...;
}
}
}🔧 7. 如何选择
| 需求 | 使用模块 | 原因 |
|---|---|---|
| Web应用代理 | http | 需要解析HTTP协议 |
| API网关 | http | 需要路由、重写、认证等 |
| 数据库代理 | stream | 高性能,不解析SQL |
| SSH隧道 | stream | TCP级转发 |
| DNS代理 | stream | UDP协议支持 |
| 游戏服务器 | stream | 低延迟,不解析内容 |
📈 8. 性能考量
# 性能优化示例
worker_processes auto;
# 事件驱动
events {
use epoll;
worker_connections 65535;
}
# 四层代理(stream)通常性能更高
stream {
# TCP优化
tcp_nodelay on;
proxy_buffer_size 16k;
upstream db_cluster {
server 10.0.0.1:3306;
}
}
# 七层代理(http)功能更丰富
http {
# HTTP优化
gzip on;
upstream web_cluster {
server 10.0.0.2:80;
}
}总结:
upstream是定义后端服务器组的配置块stream是处理TCP/UDP四层代理的独立模块- 它们经常一起使用:在
stream模块中使用upstream定义TCP后端 - 选择依据:是否需要解析应用层协议(HTTP用http模块,纯TCP/UDP用stream模块)
参考