1. 为什么选择Nginx作为反向代理
在Web服务架构中,反向代理的选择往往决定了整个系统的性能和稳定性。Nginx以其卓越的事件驱动架构闻名,单机就能轻松应对数万并发连接,这得益于它独特的master-worker进程模型。与传统的Apache等线程化服务器不同,Nginx的worker进程通过epoll机制高效处理IO事件,避免了上下文切换的开销。
我曾在生产环境对比测试过主流Web服务器:当并发连接达到5000时,Apache的内存占用飙升到1.2GB,而Nginx仅消耗不到200MB。这种资源效率对于云原生环境尤为重要,特别是在Kubernetes集群中部署时,Nginx的轻量化特性可以显著降低节点资源压力。
2. 环境准备与Nginx安装
2.1 系统环境检查
在开始安装前,建议执行以下检查(以CentOS 7为例):
bash复制# 检查内核版本
uname -r
# 确认SELinux状态
getenforce
# 查看防火墙规则
iptables -L -n
重要提示:如果SELinux处于Enforcing模式,需要预先配置策略或切换为Permissive模式,否则可能导致Nginx无法绑定低端口。
2.2 多版本安装方案
2.2.1 通过系统包管理器安装
bash复制# CentOS/RHEL
sudo yum install epel-release
sudo yum install nginx
# Ubuntu/Debian
sudo apt update
sudo apt install nginx
这种方式的优点是简单快捷,但版本可能较旧。例如在CentOS 7上默认安装的是1.20版本,而当前稳定版已到1.25。
2.2.2 官方源安装最新版
bash复制# CentOS/RHEL
sudo rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
sudo yum install nginx
# Ubuntu
curl -fsSL https://nginx.org/keys/nginx_signing.key | sudo apt-key add -
sudo add-apt-repository "deb http://nginx.org/packages/ubuntu $(lsb_release -cs) nginx"
sudo apt update
sudo apt install nginx
2.2.3 源码编译安装
当需要定制模块时(如GeoIP、Brotli压缩),源码编译是更好的选择:
bash复制wget https://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 \
--with-http_v2_module \
--with-http_realip_module
make -j$(nproc)
sudo make install
编译参数说明:
--with-http_ssl_module启用HTTPS支持--with-http_v2_module支持HTTP/2协议--with-http_realip_module用于获取客户端真实IP
3. Nginx核心配置解析
3.1 基础配置结构
Nginx的主配置文件通常位于/etc/nginx/nginx.conf,其核心结构如下:
nginx复制user nginx;
worker_processes auto; # 自动匹配CPU核心数
events {
worker_connections 1024; # 每个worker的最大连接数
use epoll; # Linux高性能事件模型
}
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;
keepalive_timeout 65;
# 包含子配置文件
include /etc/nginx/conf.d/*.conf;
}
3.2 反向代理配置实战
假设我们需要将example.com的请求代理到本地的Node.js应用(运行在3000端口):
nginx复制server {
listen 80;
server_name example.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_send_timeout 60s;
proxy_read_timeout 60s;
# 缓冲区优化
proxy_buffering on;
proxy_buffer_size 4k;
proxy_buffers 8 16k;
}
# 静态文件直接处理
location /static/ {
alias /var/www/static/;
expires 30d;
access_log off;
}
}
关键参数解析:
proxy_set_header确保后端服务能获取真实客户端信息- 超时设置需要根据业务特点调整,API服务可以缩短,文件上传需要延长
- 缓冲区配置对高并发场景尤为重要,不当设置可能导致内存暴涨
4. 高级配置与性能调优
4.1 负载均衡配置
Nginx支持多种负载均衡算法:
nginx复制upstream backend {
least_conn; # 最少连接算法
server 192.168.1.101:8000 weight=5;
server 192.168.1.102:8000;
server 192.168.1.103:8000 max_fails=3 fail_timeout=30s;
# 长连接保持
keepalive 32;
}
server {
location / {
proxy_pass http://backend;
proxy_http_version 1.1;
proxy_set_header Connection "";
}
}
4.2 缓存加速配置
对于动态内容,可以启用代理缓存:
nginx复制proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m inactive=60m;
server {
location / {
proxy_cache my_cache;
proxy_cache_key "$scheme$request_method$host$request_uri";
proxy_cache_valid 200 302 10m;
proxy_cache_valid 404 1m;
add_header X-Proxy-Cache $upstream_cache_status;
}
}
4.3 SSL/TLS最佳实践
现代安全配置示例:
nginx复制server {
listen 443 ssl http2;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
# 协议与加密套件
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers 'TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:ECDHE-ECDSA-AES128-GCM-SHA256';
ssl_prefer_server_ciphers on;
# 性能优化
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 1d;
ssl_buffer_size 4k;
# HSTS增强安全
add_header Strict-Transport-Security "max-age=63072000" always;
}
5. 运维监控与故障排查
5.1 状态监控配置
启用Nginx状态页:
nginx复制server {
listen 127.0.0.1:8080;
location /nginx_status {
stub_status on;
access_log off;
allow 127.0.0.1;
deny all;
}
}
输出示例:
code复制Active connections: 291
server accepts handled requests
16630948 16630948 31070465
Reading: 6 Writing: 179 Waiting: 106
5.2 常见问题排查指南
502 Bad Gateway
- 检查后端服务是否运行:
curl -v http://backend:port - 查看Nginx错误日志:
tail -f /var/log/nginx/error.log - 确认防火墙规则:
iptables -L -n
性能瓶颈分析
- 监控连接状态:
ss -ant | awk '{print $1}' | sort | uniq -c - 检查打开文件限制:
ulimit -n - 分析慢请求:
awk '$7 > 2 {print $0}' /var/log/nginx/access.log
5.3 日志分析技巧
使用GoAccess生成实时报表:
bash复制goaccess /var/log/nginx/access.log --log-format=COMBINED --real-time-html --output=report.html
关键日志字段说明:
$upstream_response_time:后端处理时间$request_time:客户端总请求时间$bytes_sent:响应体大小
6. 安全加固措施
6.1 基础安全配置
nginx复制server {
# 禁用不必要的HTTP方法
if ($request_method !~ ^(GET|HEAD|POST)$ ) {
return 405;
}
# 隐藏Nginx版本号
server_tokens off;
# 防止MIME类型混淆攻击
add_header X-Content-Type-Options "nosniff";
# 防止点击劫持
add_header X-Frame-Options "SAMEORIGIN";
# CSP内容安全策略
add_header Content-Security-Policy "default-src 'self'";
}
6.2 限流防护
nginx复制limit_req_zone $binary_remote_addr zone=api_limit:10m rate=10r/s;
location /api/ {
limit_req zone=api_limit burst=20 nodelay;
proxy_pass http://api_backend;
}
6.3 动态黑名单管理
nginx复制geo $blocked_ip {
default 0;
include /etc/nginx/blocked_ips.conf;
}
server {
if ($blocked_ip) {
return 403;
}
}
blocked_ips.conf格式:
code复制1.2.3.4 1;
5.6.7.8 1;