nginx 代理 负载均衡项目配置
Flask 项目
在生产环境中,使用 Nginx 和 Gunicorn 部署 Flask 项目是一种常见的架构。Nginx 作为反向代理服务器,负责处理客户端请求并将其转发给 Gunicorn 。
1、Nginx 配置文件
# 全局块
user www-data; # 设置运行 Nginx 的用户
worker_processes auto; # 自动设置工作进程数(等于 CPU 核心数)
error_log /var/log/nginx/error.log warn; # 错误日志路径和级别
pid /var/run/nginx.pid; # 主进程 PID 文件
# Events 块
events {
worker_connections 1024; # 每个工作进程的最大连接数
multi_accept on; # 同时接受多个连接
use epoll; # 使用高效的事件模型(适用于 Linux)
}
# 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; # 合并小包发送,提升性能
tcp_nodelay on; # 禁用 Nagle 算法,减少延迟
keepalive_timeout 65; # 长连接超时时间
client_max_body_size 20M; # 限制客户端上传文件的最大大小
gzip on; # 启用 GZIP 压缩
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
gzip_vary on; # 向客户端声明支持 GZIP 压缩
# Server 块
server {
listen 80; # 监听 HTTP 请求
server_name example.com www.example.com; # 绑定的域名
# SSL 配置(如果启用了 HTTPS)
listen 443 ssl http2; # 监听 HTTPS 请求
ssl_certificate /etc/nginx/ssl/example.com.crt; # SSL 证书路径
ssl_certificate_key /etc/nginx/ssl/example.com.key; # SSL 私钥路径
ssl_protocols TLSv1.2 TLSv1.3; # 支持的 SSL 协议版本
ssl_ciphers HIGH:!aNULL:!MD5; # 加密算法
ssl_prefer_server_ciphers on; # 优先使用服务端加密算法
# 根目录和索引文件
root /var/www/flask_app; # Flask 应用的静态文件目录
index index.html;
# 处理静态文件
location /static/ {
alias /var/www/flask_app/static/; # 静态文件路径
expires 30d; # 设置缓存时间
}
# 反向代理到 Gunicorn
location / {
proxy_pass http://127.0.0.1:8000; # Gunicorn 的监听地址
proxy_set_header 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; # 转发协议类型
proxy_read_timeout 90; # 设置读取超时时间
proxy_redirect off; # 禁用重定向
}
# 错误页面
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html; # 错误页面路径
}
}
}
2、Gunicorn 配置文件
Gunicorn 是一个 WSGI HTTP 服务器,用于 Flask 应用,以下是一个 配置文件 (gunicorn_config.py)
# 绑定地址和端口
bind = "127.0.0.1:8000"
# 工作进程数(建议为 CPU 核心数的 2-4 倍)
workers = 4
# 工作进程类型(推荐使用 gthread 或 sync)
worker_class = "gthread"
# 每个线程池中的线程数
threads = 2
# 超时时间(秒)
timeout = 30
# 最大请求数(防止内存泄漏)
max_requests = 1000
max_requests_jitter = 200
# 日志配置
accesslog = "/var/log/gunicorn/access.log"
errorlog = "/var/log/gunicorn/error.log"
loglevel = "info"
# 进程名称
proc_name = "flask_app"
# 是否启用守护进程模式
daemon = True
# 用户和组
user = "www-data"
group = "www-data"
Django 项目
在生产环境中,使用 Nginx 和 uWSGI 部署 Django 是一种常见的架构。Nginx 作为反向代理服务器,负责处理客户端请求并将其转发给 uWSGI 。
1、Nginx 配置文件
# 全局块
user www-data; # 设置运行 Nginx 的用户
worker_processes auto; # 自动设置工作进程数(等于 CPU 核心数)
error_log /var/log/nginx/error.log warn; # 错误日志路径和级别
pid /var/run/nginx.pid; # 主进程 PID 文件
# Events 块
events {
worker_connections 1024; # 每个工作进程的最大连接数
multi_accept on; # 同时接受多个连接
use epoll; # 使用高效的事件模型(适用于 Linux)
}
# 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; # 合并小包发送,提升性能
tcp_nodelay on; # 禁用 Nagle 算法,减少延迟
keepalive_timeout 65; # 长连接超时时间
client_max_body_size 20M; # 限制客户端上传文件的最大大小
gzip on; # 启用 GZIP 压缩
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
gzip_vary on; # 向客户端声明支持 GZIP 压缩
# Server 块
server {
listen 80; # 监听 HTTP 请求
server_name example.com www.example.com; # 绑定的域名
# SSL 配置(如果启用了 HTTPS)
listen 443 ssl http2; # 监听 HTTPS 请求
ssl_certificate /etc/nginx/ssl/example.com.crt; # SSL 证书路径
ssl_certificate_key /etc/nginx/ssl/example.com.key; # SSL 私钥路径
ssl_protocols TLSv1.2 TLSv1.3; # 支持的 SSL 协议版本
ssl_ciphers HIGH:!aNULL:!MD5; # 加密算法
ssl_prefer_server_ciphers on; # 优先使用服务端加密算法
# 根目录和索引文件
root /var/www/django_app; # Django 应用的静态文件目录
index index.html;
# 处理静态文件
location /static/ {
alias /var/www/django_app/static/; # 静态文件路径
expires 30d; # 设置缓存时间
}
# 处理媒体文件
location /media/ {
alias /var/www/django_app/media/; # 媒体文件路径
expires 30d; # 设置缓存时间
}
# 反向代理到 uWSGI
location / {
include uwsgi_params; # 包含 uWSGI 参数
uwsgi_pass unix:/var/run/uwsgi/django_app.sock; # uWSGI 的 Unix Socket 路径
uwsgi_read_timeout 90; # 设置读取超时时间
}
# 错误页面
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html; # 错误页面路径
}
}
}
2、uWSGI 是一个 应用服务器,以下是一个配置文件实例 (uwsgi.ini)
[uwsgi]
# 项目相关配置
chdir = /var/www/django_app # Django 项目的根目录
module = django_app.wsgi:application # WSGI 模块路径
home = /var/www/django_app/venv # Python 虚拟环境路径
# 进程和线程配置
master = true # 启用主进程
processes = 4 # 工作进程数(建议为 CPU 核心数的 2-4 倍)
threads = 2 # 每个进程的线程数
enable-threads = true # 启用线程支持
# Socket 配置
socket = /var/run/uwsgi/django_app.sock # 使用 Unix Socket
chmod-socket = 660 # 设置 Socket 文件权限
vacuum = true # 进程退出时清理 Socket 文件
# 日志配置
logto = /var/log/uwsgi/django_app.log # 日志文件路径
# 性能优化
buffer-size = 32768 # 增大缓冲区大小
harakiri = 60 # 超时时间(秒)
max-requests = 1000 # 最大请求数(防止内存泄漏)
max-requests-jitter = 200 # 随机化最大请求数
# 用户和组
uid = www-data # 运行用户
gid = www-data # 运行用户组
# 守护进程模式
daemonize = /var/log/uwsgi/django_app_daemon.log # 后台运行日志