Nginx 生产配置文件

发布于:2025-04-07 ⋅ 阅读:(19) ⋅ 点赞:(0)

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 # 后台运行日志