深入解析Nginx:从基础配置到高性能负载均衡实战

张开发
2026/5/5 6:20:13 15 分钟阅读
深入解析Nginx:从基础配置到高性能负载均衡实战
1. Nginx基础入门从安装到第一个Hello WorldNginx发音为engine x是一款高性能的HTTP和反向代理服务器由俄罗斯工程师Igor Sysoev开发。我第一次接触Nginx是在2013年当时被它处理高并发的优雅方式所震撼。相比传统的Apache服务器Nginx采用事件驱动的异步架构能够轻松应对C10K问题即单机同时处理1万个连接的问题。1.1 快速安装Nginx在Linux系统上安装Nginx非常简单这里我推荐两种最常用的方法方法一使用包管理器安装适合快速部署# Ubuntu/Debian系统 sudo apt update sudo apt install nginx -y # CentOS/RHEL系统 sudo yum install epel-release -y sudo yum install nginx -y方法二源码编译安装适合需要自定义模块wget http://nginx.org/download/nginx-1.25.3.tar.gz tar zxvf nginx-1.25.3.tar.gz cd nginx-1.25.3 ./configure --prefix/usr/local/nginx --with-http_ssl_module make sudo make install我建议新手先用包管理器安装等熟悉后再尝试编译安装。编译安装虽然复杂些但可以按需添加模块比如--with-http_stub_status_module用于监控--with-http_gzip_static_module用于静态压缩。1.2 配置文件结构解析安装完成后关键是要理解Nginx的配置文件结构。主配置文件通常位于/etc/nginx/nginx.conf包管理器安装/usr/local/nginx/conf/nginx.conf源码安装配置文件主要分为几个块# 全局块影响Nginx整体运行的配置 user nginx; worker_processes auto; error_log /var/log/nginx/error.log; # events块影响网络连接 events { worker_connections 1024; use epoll; } # http块最重要的配置区域 http { include mime.types; default_type application/octet-stream; # server块虚拟主机配置 server { listen 80; server_name localhost; # location块URI路由配置 location / { root html; index index.html; } } }记得每次修改配置后用nginx -t测试语法然后systemctl reload nginx重载配置。这个习惯帮我避免了很多线上事故。1.3 第一个静态网站部署让我们部署一个简单的静态页面。假设项目目录是/var/www/mysite创建目录和测试页面sudo mkdir -p /var/www/mysite echo h1Hello Nginx!/h1 | sudo tee /var/www/mysite/index.html添加server配置server { listen 80; server_name mysite.com; location / { root /var/www/mysite; index index.html; } access_log /var/log/nginx/mysite.access.log; error_log /var/log/nginx/mysite.error.log; }测试并重载sudo nginx -t sudo systemctl reload nginx现在访问http://你的服务器IP就能看到Hello World页面了。如果遇到403错误通常是权限问题可以用chmod -R 755 /var/www/mysite解决。2. 反向代理实战让Nginx成为你的流量调度员2.1 反向代理基础原理反向代理是Nginx最常用的功能之一。简单来说它就像个前台接待客户端访问example.com实际请求被Nginx接收Nginx将请求转发给内网的Tomcat/Node.js等服务获取响应后再返回给客户端这样做的好处是隐藏真实服务器信息提高安全性实现负载均衡后面会详细讲可以统一处理SSL、缓存等公共功能2.2 配置Node.js应用代理假设你的Node应用运行在http://localhost:3000配置如下server { listen 80; server_name api.yourdomain.com; location / { proxy_pass http://localhost:3000; 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_connect_timeout 60s; proxy_read_timeout 60s; proxy_send_timeout 60s; } }关键参数说明proxy_set_header传递客户端真实IP否则后端看到的所有请求都来自127.0.0.1超时设置根据业务调整API接口建议60s上传文件可能需要更长2.3 高级代理配置技巧动静分离配置server { listen 80; server_name www.yourdomain.com; # 动态请求转发到后端 location /api { proxy_pass http://backend; } # 静态资源直接本地处理 location ~* \.(jpg|css|js)$ { root /var/www/static; expires 7d; # 缓存7天 } }WebSocket代理配置location /chat/ { proxy_pass http://websocket_backend; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection upgrade; }我曾经遇到一个坑代理上传大文件时出现超时。后来发现需要调整client_max_body_size默认只有1MBhttp { client_max_body_size 20M; # 允许上传20MB文件 }3. 负载均衡高并发场景下的流量分配艺术3.1 负载均衡核心策略Nginx支持多种负载均衡算法轮询默认请求按顺序分配给各服务器加权轮询给性能好的服务器更高权重IP Hash同一IP的请求固定到同一服务器解决session问题最少连接优先分配给当前连接数最少的服务器3.2 实战配置示例假设你有三台Java应用服务器upstream java_app { # 加权轮询 server 192.168.1.101:8080 weight3; # 这台配置好分配更多请求 server 192.168.1.102:8080; server 192.168.1.103:8080 backup; # 备用服务器 # 使用最少连接算法 least_conn; # 健康检查 check interval3000 rise2 fall3 timeout1000; }然后在server配置中引用location / { proxy_pass http://java_app; proxy_next_upstream error timeout http_500; # 自动故障转移 }3.3 健康检查与故障转移Nginx Plus提供官方健康检查开源版可以通过第三方模块或简单配置实现server { location /health { access_log off; return 200 healthy\n; } } upstream backend { server 192.168.1.101:8080; server 192.168.1.102:8080 max_fails3 fail_timeout30s; }当某台服务器连续失败3次max_failsNginx会将其标记为不可用30秒后再重新尝试。4. 性能优化从基础配置到高级调优4.1 基础性能优化worker配置优化worker_processes auto; # 自动匹配CPU核心数 worker_rlimit_nofile 100000; # 每个worker能打开的文件描述符数量 events { worker_connections 4096; # 每个worker的最大连接数 use epoll; # Linux高性能网络模式 multi_accept on; # 一次接受所有新连接 }计算最大并发量worker_processes × worker_connections。比如4核CPU每个worker 4096连接理论最大并发是16,384。4.2 缓存与压缩配置Gzip压缩配置gzip on; gzip_min_length 1k; # 小于1K不压缩 gzip_comp_level 6; # 压缩级别1-9 gzip_types text/plain text/css application/json application/javascript; gzip_vary on; # 根据Accept-Encoding头返回不同内容代理缓存配置proxy_cache_path /var/cache/nginx levels1:2 keys_zonemy_cache:10m inactive60m; server { location / { proxy_cache my_cache; proxy_cache_valid 200 304 10m; # 成功响应缓存10分钟 proxy_cache_key $scheme$request_method$host$request_uri; add_header X-Proxy-Cache $upstream_cache_status; } }4.3 内核参数调优编辑/etc/sysctl.conf# 增加最大文件描述符 fs.file-max 1000000 # 优化TCP协议栈 net.ipv4.tcp_max_syn_backlog 8192 net.ipv4.tcp_tw_reuse 1 net.ipv4.tcp_fin_timeout 30执行sysctl -p生效。这些优化在我的生产环境中将QPS从3,000提升到了12,000。5. 安全加固保护你的Nginx服务器5.1 基础安全配置隐藏Nginx版本号server_tokens off;禁用不必要的方法location / { limit_except GET POST { deny all; } }SSL安全配置ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384; ssl_prefer_server_ciphers on; ssl_session_cache shared:SSL:10m; ssl_session_timeout 10m;5.2 防DDoS与限流限制请求速率limit_req_zone $binary_remote_addr zoneapi_limit:10m rate10r/s; location /api/ { limit_req zoneapi_limit burst20 nodelay; proxy_pass http://backend; }这个配置限制每个IP每秒最多10个API请求允许突发20个请求。5.3 WAF集成虽然Nginx本身不是WAF但可以通过ModSecurity等模块增强防护location / { ModSecurityEnabled on; ModSecurityConfig modsecurity.conf; proxy_pass http://backend; }我曾经用这套配置成功拦截了SQL注入攻击日志里能看到详细的攻击payload。

更多文章