Nginx 反向代理配置指南
Nginx 反向代理配置指南
目录
- 简介
- 基本概念
- 安装配置
- 基础配置示例
- 高级配置
- 性能优化
- 安全配置
- 常见问题
- 实际用法
简介
Nginx 是一个高性能的 HTTP 和反向代理服务器,也是一个 IMAP/POP3/SMTP 代理服务器。本文档主要介绍 Nginx 反向代理的配置和使用方法。
基本概念
什么是反向代理?
反向代理是指代理服务器接收客户端的请求,然后将请求转发给内部服务器,并将内部服务器的响应返回给客户端。客户端只知道代理服务器的地址,不知道内部服务器的存在。
反向代理的优势
- 负载均衡
- 提高安全性
- 性能优化
- SSL 终止
- 缓存加速
安装配置
安装 Nginx
# Ubuntu/Debian
sudo apt-get update
sudo apt-get install nginx
# CentOS
sudo yum install nginx
基本配置文件结构
http {
# 全局配置
include 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"';
# 上游服务器组
upstream backend {
server 127.0.0.1:8080;
server 127.0.0.1:8081;
}
# 服务器配置
server {
listen 80;
server_name example.com;
location / {
proxy_pass http://backend;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
}
基础配置示例
1. 简单的反向代理
server {
listen 80;
server_name example.com;
location / {
proxy_pass http://localhost:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
2. 负载均衡配置
upstream backend {
server 127.0.0.1:8080 weight=3;
server 127.0.0.1:8081 weight=2;
server 127.0.0.1:8082 weight=1;
}
server {
listen 80;
server_name example.com;
location / {
proxy_pass http://backend;
}
}
高级配置
SSL 配置
server {
listen 443 ssl;
server_name example.com;
ssl_certificate /path/to/cert.pem;
ssl_certificate_key /path/to/key.pem;
location / {
proxy_pass http://backend;
}
}
缓存配置
http {
proxy_cache_path /path/to/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_cache_use_stale error timeout http_500 http_502 http_503 http_504;
proxy_cache_valid 200 60m;
proxy_pass http://backend;
}
}
}
性能优化
1. 启用 Gzip 压缩
http {
gzip on;
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
}
2. 调整工作进程
worker_processes auto;
worker_rlimit_nofile 65535;
3. 优化缓冲区
http {
client_body_buffer_size 10K;
client_header_buffer_size 1k;
client_max_body_size 8m;
large_client_header_buffers 2 1k;
}
安全配置
1. 限制请求大小
http {
client_max_body_size 10m;
}
2. 访问控制
location /admin {
allow 192.168.1.0/24;
deny all;
}
3. 超时设置
http {
proxy_connect_timeout 60s;
proxy_send_timeout 60s;
proxy_read_timeout 60s;
}
常见问题
1. 502 Bad Gateway
- 检查后端服务是否正常运行
- 检查代理配置是否正确
- 查看错误日志
2. 性能问题
- 检查工作进程数是否合适
- 确认是否启用了缓存
- 检查缓冲区设置
3. 内存问题
- 调整 worker_connections
- 优化缓冲区大小
- 检查文件描述符限制
最佳实践
- 始终使用 HTTPS
- 定期更新 Nginx 版本
- 配置适当的日志级别
- 实施监控和告警
- 定期备份配置文件
参考资源
- Nginx 官方文档
- Nginx 配置指南
- Nginx 性能调优
实际用法
1. 前后端分离项目配置
# 前端静态文件
server {
listen 80;
server_name example.com;
# 前端文件目录
root /var/www/html;
index index.html;
# 处理前端路由
location / {
try_files $uri $uri/ /index.html;
}
# API 反向代理
location /api {
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;
}
}
2. 微服务架构配置
# 定义多个上游服务
upstream auth_service {
server 127.0.0.1:8001;
server 127.0.0.1:8002;
}
upstream user_service {
server 127.0.0.1:8003;
server 127.0.0.1:8004;
}
upstream order_service {
server 127.0.0.1:8005;
server 127.0.0.1:8006;
}
server {
listen 80;
server_name api.example.com;
# 认证服务
location /auth/ {
proxy_pass http://auth_service/;
}
# 用户服务
location /users/ {
proxy_pass http://user_service/;
}
# 订单服务
location /orders/ {
proxy_pass http://order_service/;
}
}
3. 静态资源加速
server {
listen 80;
server_name static.example.com;
# 静态文件缓存配置
location ~* .(jpg|jpeg|png|gif|ico|css|js)$ {
root /var/www/static;
expires 30d;
add_header Cache-Control "public, no-transform";
# 开启 gzip 压缩
gzip on;
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
}
}
4. WebSocket 代理
server {
listen 80;
server_name ws.example.com;
location /ws {
proxy_pass http://backend;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
5. 多域名配置
# 主域名
server {
listen 80;
server_name example.com;
location / {
proxy_pass http://backend;
}
}
# 博客子域名
server {
listen 80;
server_name blog.example.com;
location / {
proxy_pass http://blog_backend;
}
}
# 管理后台子域名
server {
listen 80;
server_name admin.example.com;
location / {
proxy_pass http://admin_backend;
}
}
6. 文件上传配置
server {
listen 80;
server_name upload.example.com;
# 上传文件大小限制
client_max_body_size 100M;
location /upload {
proxy_pass http://upload_backend;
# 上传超时设置
proxy_connect_timeout 300s;
proxy_send_timeout 300s;
proxy_read_timeout 300s;
# 临时文件目录
proxy_temp_path /tmp/nginx_proxy;
proxy_temp_file_write_size 100k;
}
}
7. 负载均衡策略配置
# 轮询(默认)
upstream backend1 {
server 127.0.0.1:8080;
server 127.0.0.1:8081;
}
# 权重轮询
upstream backend2 {
server 127.0.0.1:8080 weight=3;
server 127.0.0.1:8081 weight=2;
server 127.0.0.1:8082 weight=1;
}
# IP Hash
upstream backend3 {
ip_hash;
server 127.0.0.1:8080;
server 127.0.0.1:8081;
}
# 最少连接
upstream backend4 {
least_conn;
server 127.0.0.1:8080;
server 127.0.0.1:8081;
}
8. 健康检查配置
upstream backend {
server 127.0.0.1:8080 max_fails=3 fail_timeout=30s;
server 127.0.0.1:8081 max_fails=3 fail_timeout=30s;
server 127.0.0.1:8082 backup; # 备用服务器
}
server {
location / {
proxy_pass http://backend;
proxy_next_upstream error timeout http_500 http_502 http_503 http_504;
proxy_next_upstream_tries 3;
}
}