一、Nginx 核心概念与架构
1.1 为什么选择 Nginx?
Nginx 采用事件驱动的异步架构,相比传统的多线程模型,能够以更少的资源处理更多并发连接。以下是性能对比图:
传统多线程模型
vs Nginx事件驱动模型
┌─────────────┐ ┌─────────────┐
│ 客户端请求 │ │ 客户端请求 │
│ (
10,
000个) │ │ (
10,
000个) │
└─────────────┘ └─────────────┘
│ │
▼ ▼
┌─────────────┐ ┌─────────────┐
│ 创建
10,
000个 │ │ 仅需要少数 │
│ 线程 │ │ 工作进程 │
└─────────────┘ └─────────────┘
│ │
▼ ▼
┌─────────────┐ ┌─────────────┐
│ 内存占用高 │ │ 内存占用低 │
│ 上下文切换频繁 │ │ 高效事件处理 │
└─────────────┘ └─────────────┘
1.2 Nginx 配置文件结构
# 主配置文件:nginx.conf
# 全局块
user nginx nginx;
worker_processes auto;
error_log /var/log/nginx/error.log
warn;
pid /var/run/nginx.pid;
# events块:配置网络连接
events {
worker_connections 10240;
# 每个worker进程最大连接数
use epoll;
# 使用epoll高效网络模型
multi_accept on;
# 同时接受多个连接
}
# http块:主要配置区域
http {
include /etc/nginx/mime.types;
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;
# 性能优化参数
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
# 包含子配置
include /etc/nginx/conf.d/
*.conf;
include /etc/nginx/sites-enabled/*;
}
二、反向代理与负载均衡实战
2.1 架构示意图
客户端请求 →
Nginx (负载均衡器) → 后端服务器集群
↓ ↓ ↓
浏览器 →
upstream模块 →
[192.168.1.10:8080]
→
[192.168.1.11:8080]
→
[192.168.1.12:8080]
2.2 完整配置代码
# 负载均衡策略配置
upstream backend_cluster {
# 1. 轮询策略(默认)
server 192.168.1.10:8080 weight=3; # 权重3,处理更多请求
server 192.168.1.11:8080 weight=2; # 权重2
server 192.168.1.12:8080 weight=1; # 权重1
server 192.168.1.13:8080 backup; # 备份服务器
# 2. 最少连接数策略
least_conn;
# 3. IP哈希策略(会话保持)
# ip_hash;
# 健康检查
keepalive 32;
proxy_next_upstream error timeout http_500 http_502 http_503;
}
# 服务器配置
server {
listen 80;
server_name api.yourdomain.com;
# 反向代理配置
location /api/ {
proxy_pass http://backend_cluster;
# 重要请求头传递
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 30s;
proxy_read_timeout 120s;
proxy_send_timeout 120s;
# 缓冲区优化
proxy_buffering on;
proxy_buffer_size 4k;
proxy_buffers 8 4k;
# 错误处理
proxy_intercept_errors on;
error_page 500 502 503 504 /50x.html;
}
# 状态监控页面(谨慎开放)
location /nginx_status {
stub_status on;
access_log off;
allow 192.168.1.0/24;
deny all;
}
}
三、静态资源优化配置
3.1 静态资源处理流程
请求流程:
客户端 → Nginx → 静态文件缓存 → Gzip压缩 → 浏览器缓存
↓ ↓ ↓ ↓ ↓
HTTP请求 判断文件类型 内存/磁盘缓存 压缩传输 缓存头设置
3.2 完整静态资源配置
server {
listen 80;
server_name static.yourdomain.com;
# 图片资源配置
location ~* \.(jpg|jpeg|png|gif|ico|webp)$ {
root /data/images;
access_log off;
# 缓存设置
expires 1y;
add_header Cache-Control
"public, immutable";
# 图片优化
image_filter resize
800 600;
# 动态调整尺寸
image_filter_buffer 10M;
# WebP自动转换(需要额外模块)
# if ($http_accept ~* "webp") {
# set $webp_ext ".webp";
# }
}
# CSS/JS资源配置
location ~* \.(css|js)$ {
root /data/static;
# 缓存策略
expires 6M;
add_header Cache-Control
"public";
# Gzip压缩
gzip on;
gzip_vary on;
gzip_min_length 1024;
gzip_types text/css application/javascript;
# 预压缩版本支持
gzip_static on;
}
# 字体文件配置
location ~* \.(woff2|woff|ttf)$ {
root /data/static/fonts;
expires 1y;
add_header Cache-Control
"public, immutable";
add_header Access-Control-Allow-Origin
"*";
}
# 防盗链配置
location /uploads/ {
valid_referers none blocked server_names
*.yourdomain.com;
if (
$invalid_referer) {
return 403;
# 或者返回水印图片
# rewrite ^ /images/watermark.png;
}
}
}
四、限流与安全配置
4.1 限流算法示意图
令牌桶算法:
┌─────────────────┐
│ 令牌生成器 │ → 每秒添加N个令牌
│ (rate=10r/s) │
└─────────────────┘
↓
┌─────────────────┐
│ 令牌桶 │ → 最大容量=突发请求数
│ (burst=20) │
└─────────────────┘
↓
┌─────────────────┐
│ 请求处理 │ → 每个请求消耗1个令牌
└─────────────────┘
4.2 完整安全配置
http {
# 限流区域定义
limit_req_zone $binary_remote_addr zone=api_limit:
10m rate=10r/s;
limit_conn_zone $binary_remote_addr zone=conn_limit:
10m;
# 全局安全头
add_header X-Frame-Options DENY;
add_header X-Content-Type-Options nosniff;
add_header X-XSS-Protection
"1; mode=block";
add_header Strict-Transport-Security
"max-age=31536000";
}
server {
# 登录接口严格限流
location /api/login {
limit_req zone=api_limit burst=
20 nodelay;
limit_conn conn_limit
5;
# 频率限制日志
limit_req_status 429;
access_log /var/log/nginx/login.log main;
proxy_pass http://backend_cluster;
}
# 关键API限流
location /api/v1/ {
limit_req zone=api_limit burst=
10 delay=
5;
limit_conn conn_limit
10;
proxy_pass http://backend_cluster;
}
# IP黑白名单
location /admin/ {
allow 192.168.1.100;
allow 10.0.0.0/
8;
deny all;
# 基本认证
auth_basic "Admin Area";
auth_basic_user_file /etc/nginx/.htpasswd;
proxy_pass http://backend_cluster;
}
# 恶意User-Agent过滤
if (
$http_user_agent ~* (wget|curl|scan|bot)) {
return 403;
}
}
五、HTTPS与性能优化
5.1 HTTPS握手优化流程
传统HTTPS握手 优化后的HTTPS握手
┌─────────────┐ ┌─────────────┐
│ ClientHello │ │ ClientHello │
├─────────────┤ ├─────────────┤
│ ServerHello │ │ ServerHello │
│ 证书交换 │ │ 会话恢复 │
│ 密钥交换 │ ├─────────────┤
├─────────────┤ │ 应用数据 │
│ 应用数据 │ └─────────────┘
└─────────────┘
3次RTT 1次RTT
5.2 完整HTTPS配置
server {
listen 443 ssl http2;
# 启用HTTP/2
server_name www.yourdomain.com;
# SSL证书配置
ssl_certificate /etc/ssl/certs/yourdomain.crt;
ssl_certificate_key /etc/ssl/private/yourdomain.key;
ssl_trusted_certificate /etc/ssl/certs/ca-bundle.crt;
# SSL性能优化
ssl_protocols TLSv1.
2 TLSv1.
3;
ssl_ciphers ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-CHACHA20-POLY1305;
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:
10m;
ssl_session_timeout 1d;
ssl_buffer_size 4k;
# HTTP/2优化
http2_max_concurrent_streams 128;
http2_max_field_size 16k;
http2_max_header_size 32k;
# HSTS强制HTTPS
add_header Strict-Transport-Security
"max-age=31536000; includeSubDomains" always;
# OCSP装订提升性能
ssl_stapling on;
ssl_stapling_verify on;
location / {
proxy_pass http://backend_cluster;
# HTTP/2特有优化
proxy_http_version 1.
1;
proxy_set_header Connection
"";
}
}
# HTTP重定向到HTTPS
server {
listen 80;
server_name www.yourdomain.com;
return 301 https://
$server_name$request_uri;
}
六、监控与故障排查
6.1 监控配置
# 状态监控
server {
listen 8080;
server_name localhost;
location /nginx_status {
stub_status on;
access_log off;
allow 127.0.0.1;
deny all;
}
location /server-status {
return 302 /nginx_status;
}
}
# 日志格式优化
log_format detailed
$remote_addr - $remote_user [$time_local]
"$request" $status $body_bytes_sent
"$http_referer" "$http_user_agent"
rt=$request_time uct="$upstream_connect_time"
uht="$upstream_header_time" urt="$upstream_response_time";
6.2 常用诊断命令
# 检查配置语法
nginx -t
# 热重载配置
nginx -s reload
# 查看连接状态
netstat -an | grep :80 | wc -l
# 实时监控访问日志
tail -f /var/log/nginx/access.log | grep -v "200"
# 性能测试
ab -n 10000 -c 100 https://yourdomain.com/
七、配置总结表
配置模块
关键参数
推荐值
作用
全局配置
worker_processes
auto
自动设置工作进程数
事件模型
worker_connections
10240
每个进程最大连接数
负载均衡
least_conn
-
最少连接数策略
静态资源
expires
1y
长期缓存静态文件
限流防护
limit_req
rate=10r/s
请求频率限制
SSL优化
ssl_session_cache
shared:SSL:10m
SSL会话缓存
压缩传输
gzip_min_length
1024
最小压缩文件大小
通过以上完整的配置示例和优化建议,你可以构建一个高性能、高可用的Nginx服务器环境。记得根据实际业务需求调整参数,并定期进行压力测试和性能优化。