跳到主要内容基于 Nginx 和 Python 的 Web 项目部署配置实战 | 极客日志Python
基于 Nginx 和 Python 的 Web 项目部署配置实战
在 Linux 环境下使用 Nginx 配合不同 Python Web 框架(Django、Flask、FastAPI)进行生产环境部署的完整流程。涵盖虚拟环境搭建、WSGI/ASGI 服务器配置(uWSGI、Gunicorn、Uvicorn)、Systemd 服务管理以及 Nginx 反向代理设置。重点讲解静态文件处理、进程管理、日志配置及性能调优技巧,确保应用在高并发场景下的稳定运行。
菩提32 浏览 基于 Nginx 和 Python 的 Web 项目部署配置实战
Django 项目部署
核心原理
Django 是 Python 重量级 Web 框架,自带开发服务器仅适用于调试,生产环境需搭配 uWSGI(WSGI 服务器)+ Nginx(反向代理):
- WSGI:Python Web 服务器与应用的通信标准,uWSGI 实现该协议并管理 Python 进程;
- Nginx:处理静态文件、负载均衡、请求转发,将动态请求交给 uWSGI 处理,提升并发和安全性;
- 虚拟环境:隔离项目依赖,避免系统 Python 环境冲突。
环境准备
Python 环境部署
apt update && apt -y upgrade
apt -y install python3 python3-pip nginx build-essential python3-dev python3.12-venv
mkdir -p /data && cd /data
python3 -m venv myprojectenv
source myprojectenv/bin/activate
pip config set global.index-url https://pypi.doubanio.com/simple
pip config set install.trusted-host pypi.doubanio.com
Django 环境安装
pip install django==5.2
django-admin --version
初始化 Django 项目
django-admin startproject myproject && cd myproject
vim myproject/settings.py
ALLOWED_HOSTS = [, ]
STATIC_ROOT = os.path.join(BASE_DIR, )
DEBUG = False
python manage.py makemigrations
python manage.py migrate
python manage.py createsuperuser
python manage.py collectstatic
'10.0.0.13'
'localhost'
'static'
uWSGI 部署
安装 uWSGI
pip install uwsgi==2.0.29
uwsgi --version
配置 uWSGI(uwsgi.ini)
在 /data/myproject 目录创建 uwsgi.ini,核心配置如下:
[uwsgi]
chdir = /data/myproject
module = myproject.wsgi:application
home = /data/myprojectenv
master = true
processes = 5
threads = 2
socket = /data/myproject/myproject.sock
chmod-socket = 666
vacuum = true
uid = www-data
gid = www-data
daemonize = /var/log/uwsgi/myproject.log
pidfile = /data/myproject/uwsgi.pid
配置 uWSGI 系统服务(开机自启)
创建 /etc/systemd/system/uwsgi.service:
[Unit]
Description=uWSGI Service for Django Project
After=syslog.target network.target
[Service]
User=www-data
Group=www-data
WorkingDirectory=/data/myproject
ExecStart=/data/myprojectenv/bin/uwsgi --ini /data/myproject/uwsgi.ini
ExecReload=/bin/kill -HUP $MAINPID
ExecStop=/bin/kill -INT $MAINPID
Restart=always
RestartSec=3
KillMode=mixed
[Install]
WantedBy=multi-user.target
mkdir -p /var/log/uwsgi && chown www-data:www-data /var/log/uwsgi
systemctl daemon-reload
systemctl start uwsgi
systemctl enable uwsgi
systemctl status uwsgi
Nginx 部署
清理默认配置
rm -f /etc/nginx/sites-enabled/default
配置 Nginx(myproject.conf)
创建 /etc/nginx/conf.d/myproject.conf:
server {
listen 80;
server_name 10.0.0.13; # 服务器 IP/域名
# 静态文件处理(Nginx 直接返回,不经过 uWSGI)
location /static/ {
root /data/myproject; # 静态文件根目录
expires 30d; # 缓存 30 天
add_header Cache-Control "public";
}
# 动态请求转发给 uWSGI
location / {
include uwsgi_params; # 加载 uWSGI 通用参数
uwsgi_pass unix:/data/myproject/myproject.sock; # 对接 Socket
uwsgi_connect_timeout 30s; # 连接超时
uwsgi_read_timeout 30s; # 读取超时
}
# 日志配置
access_log /var/log/nginx/myproject_access.log;
error_log /var/log/nginx/myproject_error.log warn;
}
启动并验证 Nginx
nginx -t
systemctl restart nginx
systemctl enable nginx
curl http://10.0.0.13
curl http://10.0.0.13/admin
Flask 项目部署(Gunicorn + Nginx)
核心原理
Flask 是轻量级 Web 框架,生产环境使用 Gunicorn(WSGI 服务器)+ Nginx:
- Gunicorn:纯 Python 实现的 WSGI 服务器,配置简单、兼容性好;
- Nginx:反向代理,解决 Gunicorn 静态文件处理弱、并发能力不足的问题。
环境准备
mkdir -p /data && cd /data
python3 -m venv myflaskenv
source myflaskenv/bin/activate
pip config set global.index-url https://pypi.doubanio.com/simple
pip config set install.trusted-host pypi.doubanio.com
pip install flask==2.3.3 gunicorn==23.0.0
编写 Flask 应用
在 /data/flaskapp 目录创建 app.py:
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_world():
return 'Hello, Flask!'
@app.route('/user/<name>')
def user(name):
return f'Hello, {name}!'
if __name__ == '__main__':
app.run(host='0.0.0.0', port=5000, debug=False)
配置 Gunicorn
创建配置文件(gunicorn.conf.py)
bind = '127.0.0.1:5000'
workers = 4
worker_class = 'sync'
max_requests = 1000
max_requests_jitter = 50
accesslog = '/var/log/gunicorn/access.log'
errorlog = '/var/log/gunicorn/error.log'
loglevel = 'info'
timeout = 30
配置 Gunicorn 系统服务
创建 /etc/systemd/system/gunicorn.service:
[Unit]
Description=Gunicorn Service for Flask App
After=network.target
[Service]
User=www-data
Group=www-data
WorkingDirectory=/data/flaskapp
Environment="PATH=/data/myflaskenv/bin"
ExecStart=/data/myflaskenv/bin/gunicorn -c /data/flaskapp/gunicorn.conf.py app:app
ExecReload=/bin/kill -HUP $MAINPID
ExecStop=/bin/kill -INT $MAINPID
Restart=always
RestartSec=3
[Install]
WantedBy=multi-user.target
mkdir -p /var/log/gunicorn && chown www-data:www-data /var/log/gunicorn
systemctl daemon-reload
systemctl start gunicorn && systemctl enable gunicorn
Nginx 配置
创建 /etc/nginx/conf.d/flaskapp.conf:
server {
listen 80;
server_name 10.0.0.13;
location / {
proxy_pass http://127.0.0.1:5000; # 转发到 Gunicorn
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 30s;
}
access_log /var/log/nginx/flask_access.log;
error_log /var/log/nginx/flask_error.log warn;
}
nginx -t && systemctl restart nginx
curl http://10.0.0.13
curl http://10.0.0.13/user/test
FastAPI 项目部署(Uvicorn + Nginx)
核心原理
FastAPI 是异步 Web 框架,基于 ASGI(异步服务器网关接口),性能远超传统 WSGI 框架:
- Uvicorn:ASGI 服务器,支持异步 I/O,专为 FastAPI 优化;
- Nginx:反向代理,处理静态文件和请求分发,提升异步应用的并发能力。
环境准备
mkdir -p /data && cd /data
python3 -m venv myasgienv
source myasgienv/bin/activate
pip config set global.index-url https://pypi.doubanio.com/simple
pip config set install.trusted-host pypi.doubanio.com
pip install fastapi==0.104.1 uvicorn==0.24.0.post1 asyncio
编写 FastAPI 应用
在 /data/fastapp 目录创建 main.py:
import asyncio
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
async def read_root():
return {"Hello": "FastAPI"}
@app.get("/items/{item_id}")
async def read_item(item_id: int, q: str = None):
return {"item_id": item_id, "q": q}
async def fake_db_query():
await asyncio.sleep(1)
return {"message": "Data from database"}
@app.get("/db")
async def read_db():
result = await fake_db_query()
return result
配置 Uvicorn
创建启动配置(uvicorn_config.py)
import uvicorn
if __name__ == "__main__":
uvicorn.run("main:app", host="127.0.0.1",
port=8000,
log_level="info",
workers=4,
reload=False
配置 Uvicorn 系统服务
创建 /etc/systemd/system/uvicorn.service:
[Unit]
Description=Uvicorn Service for FastAPI App
After=network.target
[Service]
User=www-data
Group=www-data
WorkingDirectory=/data/fastapp
Environment="PATH=/data/myasgienv/bin"
ExecStart=/data/myasgienv/bin/python /data/fastapp/uvicorn_config.py
ExecReload=/bin/kill -HUP $MAINPID
ExecStop=/bin/kill -INT $MAINPID
Restart=always
RestartSec=3
[Install]
WantedBy=multi-user.target
systemctl daemon-reload
systemctl start uvicorn && systemctl enable uvicorn
Nginx 配置
创建 /etc/nginx/conf.d/fastapp.conf:
server {
listen 80;
server_name 10.0.0.13;
location / {
proxy_pass http://127.0.0.1:8000;
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 60s;
proxy_read_timeout 60s;
}
access_log /var/log/nginx/fastapi_access.log;
error_log /var/log/nginx/fastapi_error.log warn;
}
验证异步性能
pip install httpie
timeseq10 | xargs -I{} -P 10 http GET http://10.0.0.13/db
curl http://10.0.0.13
curl http://10.0.0.13/items/5?q=test
curl http://10.0.0.13/db
通用运维技巧
- 日志排查:
- uWSGI 日志:
tail -f /var/log/uwsgi/myproject.log
- Nginx 日志:
tail -f /var/log/nginx/myproject_error.log
- 服务重载:
- Django/Flask:
systemctl reload uwsgi/gunicorn(热重载,不中断服务)
- Nginx:
nginx -s reload
- 性能调优:
- uWSGI/Gunicorn 进程数:根据服务器 CPU 核心数调整(建议
2*CPU + 1);
- Nginx 开启 gzip 压缩:减少传输体积(在 http 块添加
gzip on;)。
总结
- Django 适合大型项目,搭配 uWSGI 稳定性最佳;
- Flask 适合轻量应用,Gunicorn 配置简单易维护;
- FastAPI 适合高并发异步场景,Uvicorn 充分发挥异步性能;
- Nginx 作为反向代理是所有生产环境的标配,负责静态文件、负载均衡和安全防护。
相关免费在线工具
- curl 转代码
解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online
- Base64 字符串编码/解码
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
- Base64 文件转换器
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
- Markdown转HTML
将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online
- HTML转Markdown
将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online
- JSON 压缩
通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online