Python多项目部署实战:Nginx+uWSGI+Virtualenv配置详解
本文详细讲解在Linux服务器上利用Virtualenv创建独立Python环境,结合uWSGI作为应用服务器,并通过Nginx进行反向代理的多项目部署方案。内容涵盖从虚拟环境搭建、Django项目配置、uWSGI参数设置到Nginx反向代理配置的完整流程,重点解析多项目共存时的端口分配、Socket通信及权限问题解决,帮助开发者实现高效、隔离的生产环境部署。
虚拟环境搭建与Django基础配置
首先,创建独立的运行环境,并将其命名为env。
[root@vultr ~]# mkdir projects # 测试的项目总目录
[root@vultr ~]# pip3 install virtualenv
[root@vultr ~]# cd projects
[root@vultr projects]# virtualenv env --python=python3 --no-site-packages
--python:指定Python版本
--no-site-packages:不复制系统已安装Python包
接着,激活该虚拟环境。
[root@vultr projects]# source env/bin/activate
激活成功后,命令行提示符前会显示(env),例如变为(env)[root@vultr opt]#。若需退出虚拟环境,只需执行deactivate命令即可。
随后,在虚拟环境中安装项目所需的依赖包。
使用pip3 install命令安装。在虚拟环境中安装的Python包不会影响系统全局环境,确保环境隔离。
接下来进行Django项目的具体配置。
第一步,将Django项目(以Hello项目为例)上传至服务器。
项目的目录结构如下所示。
Hello/
apps/
Hello/
manage.py
第二步,配置项目的数据库信息,编辑文件vi Hello/Hello/settings.py。
若项目部署在远程服务器,必须修改setting.py文件中的ALLOWED_HOSTS配置,以允许外部访问。
ALLOWED_HOSTS = ['*']
第三步,执行数据迁移操作。
在虚拟环境下,依次执行以下命令完成迁移: (env)[root@vultr Hello]# python3 manage.py makemigrations (env)[root@vultr Hello]# python3 manage.py migrate
第四步,收集静态文件,需再次编辑vi Hello/Hello/settings.py以配置STATIC_ROOT。
STATIC_ROOT = os.path.join(BASE_DIR, "static")
保存文件(:wq)后,执行收集静态文件的命令。
(env)[root@vultr Hello]# python3 manage.py collectstatic --noinput
第五步,使用runserver启动项目,验证项目是否能正常运行。
(env)[root@vultr Hello]# python3 manage.py runserver 0.0.0.0:8088
uWSGI应用服务器配置
配置uWSGI应用服务器。
完成Django基础测试后,先执行deactivate退出当前虚拟环境。
第一步,安装uWSGI组件。
[root@vultr Hello]# pip3 install uWSGI
第二步,通过命令行运行测试,确保uWSGI能正确加载项目。
在项目目录Hello下,执行以下测试命令:
[root@vultr Hello]# uwsgi --http ip:端口 --home /root/env/ --file Hello/wsgi.py --static-map=/static=static
--home参数用于指定虚拟环境的目录路径。
wsgi.py是Django创建项目时自动生成的入口文件。
若访问URL正常返回内容,说明Python虚拟环境和uWSGI配置无误。
第三步,使用ini配置文件来启动uWSGI,以便持久化运行。
建议创建projects目录来统一管理项目,其目录结构如下。
/root/projects/
script/ --> 存放uWSGI相关的文件,例如uwsgi.ini, uwsgi.pid...
Hello/ --> 项目目录
apps/ --> 应用程序目录
Hello/ --> settings.py等文件所在目录
static/
env/ --> 虚拟环境目录
[root@vultr projects]# vi script/uwsgi.ini
[uwsgi]
# 项目目录
chdir=/root/projects/Hello/
# 虚拟环境目录
home=/root/projects/env/
# 启动uwsgi的用户名和用户组
uid=root
gid=root
# 指定项目的application
module=Hello.wsgi:application
# 指定sock的文件路径
socket=/root/projects/script/uwsgi.sock
# 启用主进程
master=true
# 进程个数
workers=5
pidfile=/root/projects/script/uwsgi.pid
# 自动移除unix Socket和pid文件当服务停止的时候
vacuum=true
# 序列化接受的内容,如果可能的话
thunder-lock=true
# 启用线程
enable-threads=true
# 设置自中断时间
harakiri=30
# 设置缓冲
post-buffering=4096
# 设置日志目录
daemonize=/root/projects/script/uwsgi.log
第四步,掌握后台启动和停止uWSGI的命令。
[root@vultr projects]# uwsgi --ini script/uwsgi.ini # 启动
[root@vultr projects]# uwsgi --stop script/uwsgi.pid # 停止
Nginx反向代理与故障排查
最后配置Nginx反向代理服务器。
第一步,配置yum源以确保能安装Nginx。
[root@vultr projects]# vi /etc/yum.repos.d/nginx.repo
[nginx]
name=nginx repo
# 下面这行centos根据你自己的操作系统修改比如:OS/rehel
# 6是你Linux系统的版本,可以通过URL查看路径是否正确
baseurl=http://nginx.org/packages/centos/6/$basearch/
gpgcheck=0
enabled=1
第二步,执行安装命令:yum -y install nginx。
第三步,添加Nginx的配置文件。
[root@vultr projects]# vi /etc/nginx/conf.d/Hello.conf # 名字是随便起的,建议跟项目目录一样
server {
listen 84; # 端口
server_name 10.129.205.183 ; # 域名
access_log /var/log/nginx/access.log main;
charset utf-8;
gzip on;
gzip_types text/plain application/x-javascript text/css text/javascript application/x-httpd-php application/json text/json image/jpeg image/gif image/png application/octet-stream;
error_page 404 /404.html;
error_page 500 502 503 504 /50x.html;
# 指定项目路径uwsgi
location / {
include uwsgi_params; # 加载nginx和uwsgi的通信协议模块
uwsgi_connect_timeout 30; # 超时时间
uwsgi_pass unix:/root/projects/script/uwsgi.sock;
}
# 指定静态文件路径
location /static/ {
alias /root/projects/Hello/static/;
index index.html index.htm;
}
}
第四步,测试Nginx的启动与停止功能。
在启动Nginx前,先检查uWSGI进程是否已正常启动。
[root@vultr projects]# ps -ef | grep uwsgi
root 2299 1 0 06:22 ? 00:00:00 uwsgi --ini script/uwsgi.ini
root 2301 2299 0 06:22 ? 00:00:00 uwsgi --ini script/uwsgi.ini
root 2302 2299 0 06:22 ? 00:00:00 uwsgi --ini script/uwsgi.ini
root 2303 2299 0 06:22 ? 00:00:00 uwsgi --ini script/uwsgi.ini
root 2304 2299 0 06:22 ? 00:00:00 uwsgi --ini script/uwsgi.ini
root 2305 2299 0 06:22 ? 00:00:00 uwsgi --ini script/uwsgi.ini
root 2306 2299 0 06:22 ? 00:00:00 uwsgi --ini script/uwsgi.ini
root 2361 2016 0 06:32 pts/1 00:00:00 grep uwsgi
确认uWSGI运行后,启动Nginx服务。
[root@vultr projects]# /etc/init.d/nginx start
尝试访问URL,观察页面是否正常加载。

若访问失败并报错502,无需惊慌。502通常表示服务器错误,鉴于前文Django+uWSGI测试通过,问题大概率出在Nginx配置上。
此时需要查看Nginx的错误日志文件,确定日志文件的具体位置。
[root@vultr projects]# find / -name nginx.conf
/etc/nginx/nginx.conf
[root@vultr projects]# vi /etc/nginx/nginx.conf

通过error_log参数定位错误日志文件,打开error.log并查找最后一条错误记录。
日志显示类似:2019/05/12 06:41:43 [crit] 1514#1514: *2 connect() to unix:/root/projects/script/uwsgi.sock failed (13: Permission denied) while connecting to upstream, ...(后面省略)。
从failed (13: Permission denied) while connecting to upstream可以看出,错误原因是权限不足。这是因为将项目文件及uWSGI相关文件直接放在了/root/目录下,导致Nginx worker进程(通常非root用户)无法访问该Socket文件。
解决方法是修改路径。先停止Nginx和uWSGI,然后将项目路径从/root/projects/更改为/opt/projects/。
[root@vultr projects]# uwsgi --stop script/uwsgi.pid
[root@vultr projects]# /etc/init.d/nginx stop
停止 nginx: [确定]
[root@vultr projects]# cd ..
[root@vultr ~]# mv projects /opt/
[root@vultr ~]# cd /opt/projects/
接着,修改script/uwsgi.ini和/etc/nginx/conf.d/Hello.conf中所有涉及路径的配置,确保指向新的/opt/projects/目录。修改完成后,重新启动uWSGI和Nginx。
[root@vultr projects]# uwsgi --ini script/uwsgi.ini
[uWSGI] getting INI configuration from script/uwsgi.ini
[root@vultr projects]# /etc/init.d/nginx start
系统提示:正在启动 nginx: [确定]。
再次访问URL,此时页面访问正常,问题解决。
多项目共存部署方案
多项目部署方案。
利用virtualenv可以在同一台服务器上配置多个独立的Python运行环境。结合Nginx和uWSGI,可以实现一个服务器运行多个互不干扰的Python项目。
首先,理解Nginx与uWSGI的通信原理。

客户端请求首先到达Nginx。若为静态资源,Nginx直接处理;若为动态请求,Nginx通过Socket将请求转发给uWSGI服务器。Nginx与uWSGI之间的通信协议由/etc/nginx/conf.d/Hello.conf中配置的uwsgi_params文件定义。
那么,Nginx如何知道uWSGI的位置并通过Socket通信?回顾/etc/nginx/conf.d/Hello.conf文件配置。

配置中通过uwsgi_pass指定了Nginx与uWSGI通信的Socket文件路径。由此可见,部署多个项目只需为每个项目配置独立的uwsgi.ini文件和Nginx中对应的server块即可。
接下来进行多项目部署的实际测试。
第一步,配置第二个项目的虚拟环境,并测试使用runserver运行Django项目是否正常。目录结构如下。
opt/
projects/
Hello/ --> 第一个Django项目
env/ --> 第一个Django项目的虚拟环境
World/ --> 第二个Django项目
env_1/ --> 第二个Django项目的虚拟环境
script/ --> uwsig.ini等文件存放
第二步,配置World项目的uWSGI配置文件uwsgi_world.ini。
[root@vultr projects]# vi script/uwsgi_w.ini
[uwsgi]
# 项目目录
chdir=/opt/projects/World/
# 虚拟环境目录
home=/opt/projects/env_1/
# 启动uwsgi的用户名和用户组
uid=root
gid=root
# 指定项目的application
module=World.wsgi:application
# 指定sock的文件路径
socket=/opt/projects/script/uwsgi_w.sock
# 启用主进程
master=true
# 进程个数
workers=5
pidfile=/opt/projects/script/uwsgi_w.pid
# 自动移除unix Socket和pid文件当服务停止的时候
vacuum=true
# 序列化接受的内容,如果可能的话
thunder-lock=true
# 启用线程
enable-threads=true
# 设置自中断时间
harakiri=30
# 设置缓冲
post-buffering=4096
# 设置日志目录
daemonize=/opt/projects/script/uwsgi_w.log
第三步,配置Nginx以支持多项目访问。
# 可以分开多个配置文件,这里我放在同一个配置文件里
[root@vultr projects]# vi /etc/nginx/conf.d/Hello.conf
server {
listen 84; # 端口,请注意端口
server_name 10.129.205.183 ; # 域名
access_log /var/log/nginx/access.log main;
charset utf-8;
gzip on;
gzip_types text/plain application/x-javascript text/css text/javascript application/x-httpd-php application/json text/json image/jpeg image/gif image/png application/octet-stream;
error_page 404 /404.html;
error_page 500 502 503 504 /50x.html;
# 指定项目路径uwsgi
location / {
include uwsgi_params; # 加载nginx和uwsgi的通信协议模块
uwsgi_connect_timeout 30; # 超时时间
uwsgi_pass unix:/opt/projects/script/uwsgi.sock;
}
# 指定静态文件路径
location /static/ {
alias /opt/projects/Hello/static/;
index index.html index.htm;
}
}
server {
listen 86; # 端口,请注意端口
server_name 10.129.205.183 ; # 域名
access_log /var/log/nginx/access.log main;
charset utf-8;
gzip on;
gzip_types text/plain application/x-javascript text/css text/javascript application/x-httpd-php application/json text/json image/jpeg image/gif image/png application/octet-stream;
error_page 404 /404.html;
error_page 500 502 503 504 /50x.html;
# 指定项目路径uwsgi
location / {
include uwsgi_params; # 加载nginx和uwsgi的通信协议模块
uwsgi_connect_timeout 30; # 超时时间
uwsgi_pass unix:/opt/projects/script/uwsgi_w.sock;
}
# 指定静态文件路径
location /static/ {
alias /opt/projects/World/static/;
index index.html index.htm;
}
}
第四步,同时启动uWSGI和Nginx,分别访问两个不同端口的URL。测试结果显示访问均正常。
总结。
以上介绍了Python开发中基于Nginx+uWSGI+virtualenv的多项目部署教程,希望对你有所帮助。如有任何疑问,欢迎留言,小编会及时回复。感谢大家对本站的支持! 若本文对你有帮助,欢迎转载,请注明出处,谢谢!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













