Nginx配置完整手册:从入门到高可用运维实战

2025-11-26 20:50:34 6点赞 61收藏 1评论
图片图片

一、引言

Nginx,作为一款高性能的HTTP和反向代理服务器,已成为现代互联网架构的基石。它凭借其高并发、低内存占用以及无与伦比的稳定性,在全球范围内被广泛使用。其核心作用主要体现在三个方面:

反向代理:作为客户端和后端服务器之间的中介,隐藏真实服务器,实现请求的转发和安全控制。

负载均衡:将海量客户端请求分发到多个后端服务器,避免单点故障,提升系统吞吐量和可用性。

静态资源服务:高效处理静态文件(如HTML、CSS、JS、图片),因其高效的文件I/O模型而性能卓越。

所有这些功能都通过一个核心文件来定义——nginx.conf。此配置文件采用分层的、基于块的指令系统,理解其结构是掌握Nginx的关键。

二、配置文件基础架构

一个标准的nginx.conf文件遵循清晰的层级结构,从外到内依次是:

图片图片

main (全局块)├── events (Events块)└── http (HTTP块) ├── ... (HTTP全局配置) └── server (Server块) ├── ... (Server全局配置) └── location (Location块)

1. 全局块(Global Block)

这是配置文件的顶层上下文,设置的指令影响Nginx的整体运行。

user nginx nginx; # 定义运行Nginx进程的用户和组worker_processes auto; # 工作进程数,通常设置为CPU核心数或`auto`error_log /var/log/nginx/error.log warn; # 错误日志路径及级别pid /var/run/nginx.pid; # 存储主进程ID的文件worker_rlimit_nofile 65535; # 一个进程能打开的最大文件描述符数

2. Events块(Events Block)

此块用于配置网络连接相关的参数,直接影响Nginx的并发处理能力。

events { worker_connections 1024; # 每个工作进程的最大并发连接数 use epoll; # 在Linux上使用高效的事件模型epoll multi_accept on; # 允许一个工作进程同时接受多个新连接}

最大客户端连接数估算公式

worker_processes * worker_connections

3. HTTP块(HTTP Block)

这是Nginx HTTP功能配置的核心,所有与HTTP服务相关的指令都在此块中或嵌套其中。

http { 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; # 访问日志路径和格式 # 性能相关 sendfile on; # 启用高效文件传输 tcp_nopush on; # 在sendfile模式下,确保数据包被完整填充再发送 keepalive_timeout 65; # 客户端长连接超时时间 gzip on; # 开启Gzip压缩,减少传输数据量 gzip_types text/plain text/css application/json; # 指定压缩类型 # 后续的server块将在此定义 include /etc/nginx/conf.d/*.conf; # 引入其他server配置,便于模块化管理}4. Server块(Server Block)此块用于定义一个虚拟主机,可以基于不同的域名或IP来提供不同的服务。server { listen 80; # 监听端口 server_name example.com www.example.com; # 绑定的域名,支持通配符和正则 root /usr/share/nginx/html; # 该虚拟主机的根目录 index index.html index.htm; # 默认索引文件 # 在此可以定义多个location块}

5. Location块(Location Block)

这是最灵活的配置单元,用于根据请求的URI进行精细化的路由和控制。其匹配规则和优先级是重点。

location [ = | ~ | ~* | ^~ ] /uri/ { # 配置指令}

  • =:精确匹配。location = /login 只匹配 /login 请求。

  • ^~:前缀匹配,如果匹配成功,则不再进行正则匹配。

  • ~:区分大小写的正则匹配。

  • ~*:不区分大小写的正则匹配。

  • 无符号:普通前缀匹配。

优先级规则=〉 ^~ 〉 按配置文件中的顺序(正则)〉 普通前缀匹配

示例

location /images/ { # 匹配以 /images/ 开头的任何请求 alias /data/static/images/;}location ~* .(gif|jpg|jpeg)$ { # 不区分大小写地匹配常见图片格式 expires 30d; # 设置浏览器缓存 add_header Cache-Control "public";}location = /admin { # 只精确匹配 /admin deny all; # 禁止访问 return 403;}

三、实战场景与配置示例

1. 反向代理配置

将请求转发到后端应用服务器(如Tomcat, Node.js, Django等)。

server { listen 80; server_name app.example.com; location / { proxy_pass http://backend_server; # 指向upstream或具体地址 proxy_set_header Host $host; # 传递原始请求的Host头 proxy_set_header X-Real-IP $remote_addr; # 传递客户端真实IP proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 追加代理IP链 proxy_set_header X-Forwarded-Proto $scheme; # 传递原始协议(http/https) # 超时控制 proxy_connect_timeout 30s; proxy_read_timeout 60s; proxy_send_timeout 60s; }}

2. 负载均衡策略

使用upstream块定义后端服务器组,并选择不同的负载均衡算法。

http { upstream backend_server { # 1. 轮询(默认) # server 192.168.1.101:8080; # server 192.168.1.102:8080; # 2. 加权轮询 server 192.168.1.101:8080 weight=3; # 处理3倍请求 server 192.168.1.102:8080 weight=1; # 3. IP哈希(保证同一客户端访问固定后端,解决会话保持) # ip_hash; # 4. 最少连接数 # least_conn; # 健康检查(需要nginx-plus或集成第三方模块,如ngx_http_upstream_check_module) # server 192.168.1.103:8080 backup; # 备份服务器,当其他都不可用时启用 } server { listen 80; server_name app.example.com; location / { proxy_pass http://backend_server; } }}

3. SSL/TLS部署

启用HTTPS,保障数据传输安全。

server { listen 443 ssl http2; # 启用HTTP/2以提升性能 server_name example.com; ssl_certificate /etc/nginx/ssl/example.com.crt; # 证书文件路径 ssl_certificate_key /etc/nginx/ssl/example.com.key; # 私钥文件路径 # 安全强化配置 ssl_protocols TLSv1.2 TLSv1.3; # 禁用不安全的TLS版本 ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE; ssl_prefer_server_ciphers on; ssl_session_cache shared:SSL:10m; ssl_session_timeout 10m; # 强制HTTPS重定向(可选,在另一个server块中) # server { # listen 80; # server_name example.com; # return 301 https://$server_name$request_uri; # } location / { root /usr/share/nginx/html; index index.html; }}

4. 访问控制与限流

保护服务免受滥用和攻击。

# IP黑白名单location /admin/ { allow 192.168.1.0/24; # 允许内网IP段 allow 203.0.113.1; # 允许特定IP deny all; # 拒绝其他所有IP return 403;}# 请求速率限制(限流)http { limit_req_zone $binary_remote_addr zone=api:10m rate=10r/s; # 定义限流zone server { location /api/ { limit_req zone=api burst=20 nodelay; # 应用限流 proxy_pass http://api_backend; # 超过频率限制返回429 limit_req_status 429; } }}# 连接数限制http { limit_conn_zone $binary_remote_addr zone=addr:10m; server { location /download/ { limit_conn addr 1; # 同一IP同时只能有1个下载连接 } }}

四、性能优化技巧

1. 关键参数调优

# 全局块worker_processes auto; # 与CPU核心数绑定worker_rlimit_nofile 65535; # 提高文件描述符限制events { worker_connections 65535; # 提高单进程连接数 use epoll; # Linux高效事件模型 multi_accept on;}http { sendfile on; tcp_nopush on; tcp_nodelay on; # 禁用Nagle算法,提高实时性 keepalive_timeout 30; # 适当调整长连接超时 keepalive_requests 1000; # 一个长连接可处理的请求数 # 关闭不必要或敏感的版本信息 server_tokens off;}

2. 日志管理

日志分割:使用logrotate工具或自定义脚本,避免日志文件过大。

格式自定义:根据需求记录关键字段,避免记录无用信息消耗I/O。

log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" "$request_time"' '"$http_user_agent" "$http_x_forwarded_for"';# 注意添加了$request_time,用于分析请求处理耗时

3. 缓存策略

代理缓存:缓存后端应用的响应。

http { proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m max_size=10g inactive=60m use_temp_path=off; server { location / { proxy_cache my_cache; proxy_cache_key "$scheme$request_method$host$request_uri"; proxy_cache_valid 200 302 10m; # 200和302状态码缓存10分钟 proxy_cache_valid 404 1m; proxy_cache_use_stale error timeout updating http_500 http_502 http_503 http_504; add_header X-Cache-Status $upstream_cache_status; # 在响应头中显示缓存命中状态 proxy_pass http://backend; } }}

浏览器缓存:通过设置expiresCache-Control头,让浏览器缓存静态资源。

location ~* .(jpg|jpeg|png|gif|ico|css|js)$ { expires 1y; # 缓存1年 add_header Cache-Control "public, immutable";}

五、常见问题排查

1. 配置文件语法检查

在重启Nginx前,建议进行语法检查。

nginx -t

# 输出:nginx: configuration file /etc/nginx/nginx.conf test is successful图片图片

2. 热重载

修改配置后,无需停止服务即可应用新配置。

# 重新加载配置(推荐)需要到nginx根目录 /usr/sbin/nginx -s reloadnginx -s reload# 或者使用systemdsystemctl reload nginx

执行命令后Nginx主进程发送HUP信号,主进程会检查新配置的语法,然后启动新的工作进程,并优雅地关闭旧的工作进程。

3. 常见的错误处理

403 Forbidden

图片图片

检查root目录路径是否正确。

检查文件权限和user指令指定的用户是否有读取权限。

检查index文件是否存在。

502 Bad Gateway

图片图片

后端服务是否启动并正常运行。

proxy_pass指向的地址和端口是否正确。

防火墙规则是否阻止了Nginx到后端的连接。

后端应用处理超时(检查proxy_read_timeout)。


504 Gateway Timeout

图片图片

后端服务处理时间过长,增加proxy_read_timeout值。

后端服务器资源(CPU、内存、数据库连接)耗尽。

六、高级功能与扩展


1. 动态配置管理

OpenResty:基于Nginx,集成了LuaJIT,允许使用Lua脚本在Nginx的各个处理阶段(如访问、内容、日志)实现复杂业务逻辑,实现动态路由、认证、限流等。

Consul-Template:与Consul服务发现集成,可以根据服务注册中心的变动,自动生成Nginx的Upstream配置并触发重载。

2. 安全加固实践

防止信息泄露server_tokens off; 隐藏Nginx版本号。

安全头设置

add_header X-Frame-Options "SAMEORIGIN" always; # 防点击劫持add_header X-Content-Type-Options "nosniff" always; # 防MIME类型嗅探add_header X-XSS-Protection "1; mode=block" always; # 启用XSS过滤器add_header Referrer-Policy "no-referrer-when-downgrade" always; # 控制Referer头

CSRF防护:可通过验证Referer头或使用OpenResty实现Token验证。

3. 监控与可视化

stub_status模块:内置模块,提供基本的状态信息。

location /nginx_status { stub_status on; access_log off; allow 127.0.0.1; # 只允许本地访问 deny all;}

访问http://your-server/nginx_status会得到类似如下输出:

Active connections: 291server accepts handled requests16630948 16630948 31070465Reading: 6 Writing: 179 Waiting: 106

Prometheus监控:使用nginx-prometheus-exporternginx-vts-exporter(需要编译VTS模块)将Nginx指标转换为Prometheus格式,再通过Grafana进行可视化展示。

七、总结与建议

配置文件管理的建议

模块化:不要将所有配置都写在主配置文件中。使用include指令将不同功能的配置(如SSL、gzip、upstream)和不同站点的配置(server块)拆分到/etc/nginx/conf.d//etc/nginx/sites-available/下的独立文件中。

版本控制:将整个/etc/nginx/目录纳入Git等版本控制系统,任何修改都有据可查,便于回滚和团队协作。

注释清晰:为复杂的配置段添加注释,说明其目的和原理。

遵循最小权限原则:文件权限、用户设置都应遵循安全最佳实践。

学习资源

图片图片

官方文档:https://nginx.org/en/docs/ - 最权威、最全面的参考。

图片图片

Nginx Wiki:大量的示例和教程

https://wiki.archlinuxcn.org/wiki/Nginx。

工具链

nginx -t:每次修改后建议检查一下语法。

ss / netstat**:检查端口监听和连接状态。

curl / httpie**:用于测试接口和HTTP头。

附录

生产环境标准配置模板

# === 全局块 ===# 用户组user nobody;# 工作进程数worker_processes 1;# 日志路径和日志级别error_log logs/error.log;error_log logs/error.log notice;error_log logs/error.log info;# 进程文件路径pid logs/nginx.pid;# === events块 ===events { # 最大连接数 worker_connections 1024; # 设置网络连接序列化 accept_mutex on; # 一个进程是否同时接收多个网络连接 multi_accept on; # 事件驱动模型 use epoll;}# === http块 ===http { # === http全局块 === # 文件扩展名与文件类型映射表 include mime.types; # 默认文件类型 default_type application/octet-stream; # 是否开启服务日志 access_log off; # 自定义服务日志格式 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; # 是否开启高效文件传输模式 sendfile on; # 每个进程每次最大传输值 sendfile_max_chunk 100k; # 长连接超时事件 keepalive_timeout 65; # 响应客户端的超时事件 send_timeout 75; # 客户端请求头的区缓冲区大小 client_header_buffer_size 32k; # 客户端请求头的最大缓冲区数量和大小 large_client_header_buffers 8 32k; # 允许客户端请求的最大字节数 client_max_body_size 10m; # 客户端请求体的缓冲区大小 client_body_buffer_size 128k; # ---配置http_gzip模块--- # 开启gzip压缩输出,可减少网络传输 gzip on; # 设置允许压缩的页面最小字节数 gzip_min_length 1k; # 设置系统获取多少个单位的缓存用于存储gzip的压缩结果数据流 gzip_buffers 4 16k; # 设置http协议的版本 gzip_http_version 1.0; # 设置zip压缩比 gzip_comp_level 6; # 匹配mime类型进行压缩 gzip_types text/plain text/css application/json; # 设置开启或者关闭后端服务器返回的结果是否压缩 gzip_proxied any; # 该配置和http头有关系,会在响应头加个vary:Accept-Encoding gzip_vray on; # ---配置http_proxy反向代理--- # Nginx跟代理服务器连接超时时间 proxy_connect_timeout 75; # Nginx与代理服务器两个成功的响应操作之间超时时间 proxy_read_timeout 75; # Nginx传输文件至代理服务器的超时时间 proxy_send_timeout 100; # 设置从代理服务器读取并保存用户头信息的缓冲区大小 proxy_buffer_size 4k; # 设置代理缓冲区大小 proxy_buffers 4 32k; # 设置高负荷下的缓冲大小 proxy_busy_buffers_size 64k; # 设置最大临时文件大小,默认1024M proxy_max_temp_file_size 64k; # 限制每次写临时文件的大小 proxy_temp_file_write_size 64k; # 指定临时文件所在的目录 proxy_temp_path proxy_temp; # 定义tomcat地址 upstream tomcat { server 192.168.138.100:8888; } # === HTTP-server块 === server { # 监听端口 listen 80; # 监听服务器地址 server_name localhost; # 每个连接请求上限次数 keepalive_requests 120; # 字符集 charset utf-8; # 服务日志所在目录以及日志格式 access_log logs/host.access.log main; # 错误页 error_page 404 /404.html; error_page 500 502 503 504 /50x.html; # === HTTP-server-location块 === location / { # 服务器的默认网站根目录位置 root /usr/share/nginx/html; # 默认访问的文件名 index index.html; # 拒绝的IP deny 192.168.56.21; deny all; # 允许的IP allow 192.168.56.10; allow all; } # 设置响应头 location / { # 设置允许跨域类型 add_header Access-Control-Allow-Origin * always; # 是否允许信任证书 add_header Access-Control-Allow-Credentials 'true' always; # 允许的请求头类型 add_header Access-Control-Allow-Headers * always; # 设置允许的请求方式 add_header Access-Control-Allow-Methods 'PUT,GET,POST,DELETE,OPTIONS' always; # 处理OPTIONS请求 if ($request_method = 'OPTIONS') { return 204; } } # 设置反向代理服务器 location / { # 反向代理服务器地址 proxy_pass http://192.168.56.23; # 是否重定向代理服务器地址 proxy_redirect off; # 设置向代理服务器发送请求时的请求头数据 # cookie proxy_pass_header Set-Cookie; # 主机名 proxy_set_header Host $host; # 真实IP proxy_set_header X-Real-Ip $remote_addr; # 表示Http请求端真实IP proxy_set_header X-Forwarded-For $remote_addr; } } # 配置ssl server { # 开启 ssl ssl on; # ssl证书路径 ssl_certificate cert.pem; # ssl证书密钥 ssl_certificate_key cert.key; # ssl缓存 ssl_session_cache shared:SSL:1m; # ssl会话超时时间 ssl_session_timeout 5m; # ssl会话票据 ssl_session_tickets off; # ssl协议版本 ssl_protocols TLSv1.2; # ssl密码套件 ssl_ciphers 'HIGH:!aNULL:!MD5'; # 开启ssl服务密码套件 ssl_prefer_server_ciphers on; }}

常用配置参数速查表

Nginx配置完整手册:从入门到高可用运维实战

通过本篇指南,相信大家应该已经对Nginx配置文件有了比较深刻的了解。从希望这篇文章能够帮助大家!

作者提示含AI生成内容。作者声明本文无利益相关,欢迎值友理性交流,和谐讨论~

展开 收起
1评论

  • 精彩
  • 最新
  • 给我干哪了

    校验提示文案

    提交
提示信息

取消
确认
评论举报

相关文章推荐

更多精彩文章
更多精彩文章
最新文章 热门文章
61
扫一下,分享更方便,购买更轻松