Nginx+uWSGI部署Python Web应用实践
在Python Web应用的生产环境部署中,Nginx结合uWSGI是业内广泛采用的成熟方案。Nginx作为高性能的反向代理服务器,负责处理静态资源请求和流量分发;uWSGI作为WSGI服务器,负责与Python Web应用通信,解析请求并转发响应。二者配合可以大幅提升应用的并发处理能力和稳定性。
环境准备
部署前需要准备以下基础环境:
Linux服务器(本文以Ubuntu 22.04为例)
Python 3.8及以上版本
已开发完成的Python Web应用(本文以Flask框架的简单应用为例)
安装依赖组件
首先更新系统软件源,然后安装Nginx和uWSGI相关依赖:
# 更新软件源 sudo apt update # 安装Nginx sudo apt install nginx -y # 安装Python包管理工具pip sudo apt install python3-pip -y # 安装uWSGI pip3 install uwsgi
准备测试Web应用
我们创建一个简单的Flask应用作为部署示例,在项目目录中创建app.py文件,内容如下:
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello():
return 'Hello, Nginx+uWSGI Deployment Success!'
if __name__ == '__main__':
app.run()同时建议为项目创建独立的虚拟环境,避免依赖冲突,虚拟环境创建和依赖安装命令如下:
# 安装虚拟环境工具 pip3 install virtualenv # 创建虚拟环境 virtualenv venv # 激活虚拟环境 source venv/bin/activate # 在虚拟环境中安装Flask pip install flask
配置uWSGI
uWSGI支持通过配置文件管理启动参数,我们在项目根目录创建uwsgi.ini配置文件,内容如下:
[uwsgi] # 应用目录 chdir = /path/to/your/project # 虚拟环境路径 home = /path/to/your/project/venv # 模块入口,格式为模块名:应用实例名 module = app:app # 使用socket方式与Nginx通信,端口自定义,注意不要冲突 socket = 127.0.0.1:5000 # socket文件权限,确保Nginx可以访问 chmod-socket = 664 # 以守护进程方式运行 daemonize = /path/to/your/project/uwsgi.log # 进程数 processes = 4 # 线程数 threads = 2 # 主进程 master = true # 自动清理pid文件 vacuum = true
配置完成后,可以通过以下命令启动uWSGI服务:
uwsgi --ini uwsgi.ini
如果需要停止uWSGI服务,可以执行:
killall -9 uwsgi
配置Nginx
Nginx的站点配置文件存放在/etc/nginx/sites-available/目录下,我们创建名为python-app的配置文件:
server {
# 监听端口,默认80端口
listen 80;
# 服务器域名,没有域名可以填写服务器公网IP
server_name https://www.ipipp.com;
# 静态资源配置,根据实际项目调整路径
location /static {
alias /path/to/your/project/static;
}
# 动态请求转发到uWSGI
location / {
include uwsgi_params;
# 与uwsgi.ini中配置的socket地址一致
uwsgi_pass 127.0.0.1:5000;
}
}配置文件创建完成后,需要建立软链接到/etc/nginx/sites-enabled/目录启用配置,然后测试Nginx配置是否正确并重启服务:
# 建立软链接 sudo ln -s /etc/nginx/sites-available/python-app /etc/nginx/sites-enabled/ # 测试Nginx配置 sudo nginx -t # 重启Nginx服务 sudo systemctl restart nginx
部署验证与常见问题排查
完成上述配置后,在浏览器中访问服务器公网IP或配置的域名,如果看到页面显示Hello, Nginx+uWSGI Deployment Success!,则说明部署成功。
如果出现访问异常,可以按照以下步骤排查:
检查uWSGI是否正常运行:执行
ps aux | grep uwsgi查看uWSGI日志:
tail -f /path/to/your/project/uwsgi.log排查应用启动错误检查Nginx日志:错误日志路径为
/var/log/nginx/error.log,访问日志为/var/log/nginx/access.log确认防火墙是否开放80端口:执行
sudo ufw allow 80/tcp开放端口
进阶优化建议
生产环境部署后,还可以根据实际进一步优化:
配置Nginx缓存策略,提升静态资源访问速度
使用Systemd管理uWSGI服务,实现开机自启和异常自动重启
配置HTTPS证书,通过Let's Encrypt免费证书实现全站HTTPS访问
根据服务器性能调整uWSGI的进程数和线程数,优化并发处理能力