Nginx配置详解
1. 全局块
示例
user nginx; # 运行Nginx的工作进程的用户和组
worker_processes auto; # 工作进程数,通常设置为CPU核心数
error_log /var/log/nginx/error.log warn; # 错误日志位置与级别
pid /var/run/nginx.pid; # 存储主进程ID的文件路径
# 设置工作进程的最大打开文件数限制
worker_rlimit_nofile 2048;
# 包含其他配置文件(如果有)
include /etc/nginx/conf.d/*.conf;
# 工作进程的CPU亲和性设置
worker_cpu_affinity auto;
# 日志轮转
env NGINX_LOG_ROTATE=1;
user
:指定运行Nginx工作进程的用户和组。通常使用非特权用户以提高安全性。worker_processes
:定义工作进程数量。auto
会根据CPU核心数自动调整。对于多核CPU,建议设置为CPU核心数或略高于此值。error_log
:错误日志的位置和记录等级(如warn, error, crit等)。可以设置不同的日志级别以控制日志输出量。pid
:存放Nginx主进程ID的文件路径。用于管理Nginx进程。worker_rlimit_nofile
:设置每个工作进程可以打开的最大文件数。这对于高并发场景非常重要。include
:包含其他配置文件,便于管理和扩展。例如,将虚拟主机配置放在单独的文件中。worker_cpu_affinity
:绑定工作进程到特定的CPU核心,减少上下文切换开销。env
:设置环境变量,例如用于日志轮转。
2. Events 块
示例
events {
worker_connections 1024; # 每个工作进程可以同时处理的最大连接数
use epoll; # 在Linux系统上使用epoll模型提高效率
multi_accept on; # 当接收到新连接时,立即接受所有等待中的连接
accept_mutex on; # 启动accept锁机制,防止惊群效应
accept_mutex_delay 50ms; # 设置accept锁的延迟时间
}
worker_connections
:每个工作进程可以同时处理的最大连接数。结合worker_processes
来计算最大并发连接数。use
:指定使用的事件驱动模型(在Linux上推荐使用epoll
,在FreeBSD上使用kqueue
)。multi_accept
:允许工作进程在接受到新的连接通知后立即接受所有等待中的连接,提高处理效率。accept_mutex
:启用或禁用accept锁机制,防止多个工作进程同时尝试接受连接导致的性能问题。accept_mutex_delay
:设置accept锁的延迟时间,以平衡性能和公平性。
3. HTTP 块
这是Nginx的核心部分,几乎所有的Web服务器配置都在这里完成。
MIME类型
include /etc/nginx/mime.types; # 包含MIME类型的定义文件
default_type application/octet-stream; # 当找不到匹配的MIME类型时,默认使用此类型
日志格式与访问日志
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; # 访问日志的位置和使用的日志格式
log_format
:定义日志格式,支持多种变量。可以自定义日志格式以满足特定需求。access_log
:指定访问日志的位置和使用的日志格式。可以通过日志分析工具进行流量分析。
性能优化相关配置
sendfile on; # 开启高效传输模式
tcp_nopush on; # 减少网络包的数量
tcp_nodelay on; # 提高响应速度
keepalive_timeout 65; # 长连接超时时间
gzip on; # 开启Gzip压缩以减少传输数据量
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
gzip_min_length 1000; # 只对超过1KB的数据进行压缩
gzip_proxied any; # 对代理请求也启用压缩
gzip_buffers 16 8k; # 设置Gzip缓冲区大小
gzip_http_version 1.1; # 启用HTTP/1.1协议下的Gzip压缩
gzip_comp_level 6; # 设置Gzip压缩级别
sendfile
:启用或禁用sendfile()方法,用于高效传输静态文件。tcp_nopush
:减少网络包的数量,配合sendfile
使用。tcp_nodelay
:提高响应速度,适用于小数据包的即时发送。keepalive_timeout
:长连接超时时间,保持客户端连接一段时间。gzip
:开启Gzip压缩以减少传输数据量。gzip_types
:指定哪些MIME类型的内容需要压缩。gzip_min_length
:只对超过一定大小的数据进行压缩。gzip_proxied
:对代理请求也启用压缩。gzip_buffers
:设置Gzip缓冲区大小。gzip_http_version
:启用HTTP/1.1协议下的Gzip压缩。gzip_comp_level
:设置Gzip压缩级别(1-9),数值越大压缩率越高但消耗更多CPU资源。
Server 块
每个server
块代表一个虚拟主机或网站。
基本配置
server {
listen 80; # 监听端口
server_name example.com www.example.com; # 服务器名称或域名
root /usr/share/nginx/html; # 网站根目录
index index.html index.htm; # 默认首页文件
location / {
try_files $uri $uri/ =404; # 尝试查找请求的文件或目录,如果不存在返回404
}
error_page 404 /404.html; # 自定义404错误页面
location = /404.html {
root /usr/share/nginx/errors; # 自定义错误页面存放位置
}
}
SSL/TLS 配置示例
server {
listen 443 ssl; # 监听SSL端口
server_name example.com;
ssl_certificate /etc/nginx/ssl/example.com.crt; # SSL证书路径
ssl_certificate_key /etc/nginx/ssl/example.com.key; # SSL证书密钥路径
ssl_protocols TLSv1.2 TLSv1.3; # 启用的SSL协议版本
ssl_ciphers HIGH:!aNULL:!MD5; # 使用的加密套件
ssl_prefer_server_ciphers on; # 强制服务器选择加密套件
ssl_session_cache shared:SSL:10m; # 设置共享缓存
ssl_session_timeout 10m; # 设置会话超时时间
ssl_stapling on; # 启用OCSP stapling
ssl_stapling_verify on; # 启用OCSP stapling验证
resolver 8.8.8.8 8.8.4.4 valid=300s; # 设置DNS解析器
resolver_timeout 5s; # 设置DNS解析超时时间
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
}
ssl_certificate
和ssl_certificate_key
:指定SSL证书和密钥路径。ssl_protocols
:启用的SSL协议版本,建议仅启用TLSv1.2及以上版本。ssl_ciphers
:指定使用的加密套件。ssl_prefer_server_ciphers
:强制服务器选择加密套件。ssl_session_cache
:设置共享缓存以提高SSL会话复用效率。ssl_session_timeout
:设置会话超时时间。ssl_stapling
和ssl_stapling_verify
:启用OCSP stapling以提高证书验证效率。resolver
和resolver_timeout
:设置DNS解析器和超时时间。
反向代理配置
server {
listen 80;
server_name proxy.example.com;
location / {
proxy_pass http://backend_server; # 转发请求到后台服务器
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;
proxy_connect_timeout 60s; # 设置连接超时时间
proxy_read_timeout 60s; # 设置读取超时时间
proxy_send_timeout 60s; # 设置发送超时时间
proxy_buffer_size 128k; # 设置代理缓冲区大小
proxy_buffers 4 256k; # 设置代理缓冲区数量和大小
proxy_busy_buffers_size 256k; # 设置忙时缓冲区大小
proxy_temp_file_write_size 512k; # 设置临时文件写入大小
proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504; # 设置故障转移策略
}
}
proxy_pass
:转发请求到后台服务器。proxy_set_header
:设置转发头信息,以便后台服务器获取客户端的真实信息。proxy_connect_timeout
、proxy_read_timeout
、proxy_send_timeout
:设置连接、读取和发送超时时间。proxy_buffer_size
、proxy_buffers
、proxy_busy_buffers_size
、proxy_temp_file_write_size
:设置代理缓冲区相关参数。proxy_next_upstream
:设置故障转移策略,当出现指定错误时尝试下一个上游服务器。
负载均衡配置
upstream backend_servers {
server backend1.example.com weight=3; # 权重分配
server backend2.example.com;
server backend3.example.com;
least_conn; # 使用最少连接策略
hash $remote_addr consistent; # 使用一致性哈希算法
keepalive 32; # 保持活动连接池大小
}
server {
listen 80;
server_name loadbalancer.example.com;
location / {
proxy_pass http://backend_servers;
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;
}
}
upstream
:定义一组上游服务器。weight
:设置服务器权重,权重高的服务器接收更多请求。least_conn
:使用最少连接策略,优先选择当前连接数最少的服务器。hash
:使用一致性哈希算法,确保相同客户端请求总是被分发到同一台服务器。keepalive
:保持活动连接池大小,减少TCP连接建立的开销。
4. 高级用法
缓存配置
proxy_cache_path /data/nginx/cache levels=1:2 keys_zone=my_cache:10m max_size=10g inactive=60m use_temp_path=off;
server {
location / {
proxy_cache my_cache;
proxy_pass http://backend_server;
proxy_cache_valid 200 302 10m; # 缓存状态码200和302响应10分钟
proxy_cache_valid 404 1m; # 缓存状态码404响应1分钟
add_header X-Cache-Status $upstream_cache_status; # 添加缓存状态头部
proxy_cache_methods GET HEAD; # 仅缓存GET和HEAD请求
proxy_cache_min_uses 3; # 请求至少三次才缓存
proxy_cache_lock on; # 启用缓存锁,避免缓存穿透
proxy_cache_use_stale error timeout updating http_500 http_502 http_503 http_504; # 使用过期缓存应对错误
}
}
proxy_cache_path
:定义缓存路径、层级结构、键空间、最大大小和不活跃时间。proxy_cache
:启用缓存并指定缓存区域。proxy_cache_valid
:设置不同状态码的缓存时间。add_header
:添加自定义响应头,方便调试和监控。proxy_cache_methods
:仅缓存特定HTTP方法的请求。proxy_cache_min_uses
:请求至少几次才缓存。proxy_cache_lock
:启用缓存锁,避免缓存穿透。proxy_cache_use_stale
:在某些情况下使用过期缓存,提高可用性。
访问控制
location /admin/ {
allow 192.168.1.0/24; # 允许特定IP段访问
deny all; # 拒绝其他所有IP访问
auth_basic "Restricted Area"; # 启用基本认证
auth_basic_user_file /etc/nginx/.htpasswd; # 指定密码文件
satisfy any; # 满足任一条件即可访问
}
allow
和deny
:基于IP地址的访问控制。auth_basic
和auth_basic_user_file
:启用基本认证并指定密码文件。satisfy any
:满足任一条件即可访问,即允许通过IP白名单或用户名密码认证。
限流配置
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;
server {
location /search/ {
limit_req zone=one burst=5 nodelay; # 设置每秒请求数限制,并允许突发5个请求
limit_req_status 503; # 设置限流状态码
limit_conn_zone $binary_remote_addr zone=addr:10m; # 定义连接限制区域
limit_conn addr 10; # 每个IP最多10个并发连接
}
}
limit_req_zone
:定义限流区域和速率。limit_req
:应用限流规则,指定区域、突发容量和是否延迟处理。limit_req_status
:设置限流状态码。limit_conn_zone
:定义连接限制区域。limit_conn
:应用连接限制规则,指定区域和最大连接数。
注意事项
在修改完配置后,通过nginx -t
命令检查配置文件的有效性,并使用nginx -s reload
重新加载配置以应用更改生效。