Nginx配置详解
- 电脑硬件
- 2025-09-17 16:48:01

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 .example ; # 服务器名称或域名 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 ; ssl_certificate /etc/nginx/ssl/example .crt; # SSL证书路径 ssl_certificate_key /etc/nginx/ssl/example .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 ; 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 weight=3; # 权重分配 server backend2.example ; server backend3.example ; least_conn; # 使用最少连接策略 hash $remote_addr consistent; # 使用一致性哈希算法 keepalive 32; # 保持活动连接池大小 } server { listen 80; server_name loadbalancer.example ; 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重新加载配置以应用更改生效。