Python开发之Nginx+uWSGI+virtualenv多项目部署教程


Posted in Python onMay 13, 2019

1、新建独立运行环境,命名为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包

2、激活虚拟环境

[root@vultr projects]# source env/bin/activate

执行后命令提示符前面会出现一个env,变成(env)[root@vultr opt]#,退出虚拟环境执行deactivate即可。

3、安装项目依赖:

pip3 install, 在虚拟环境中安装的包,不会对系统环境造成影响。

Django项目配置

1、上传Django项目: Hello项目

目录结构:

Hello/
 apps/
 Hello/
 manage.py

2、配置项目的数据库信息:vi Hello/Hello/settings.py

如果是远程服务器,需要修改setting.py文件中的ALLOWED_HOSTS:

ALLOWED_HOSTS = ['*']

3、数据迁移

(env)[root@vultr Hello]# python3 manage.py makemigrations
(env)[root@vultr Hello]# python3 manage.py migrate

4、收集静态文件:vi Hello/Hello/settings.py

STATIC_ROOT = os.path.join(BASE_DIR, "static")

:wq保存后,执行

(env)[root@vultr Hello]# python3 manage.py collectstatic --noinput

5、用runserver启动项目,看是否正常运行

(env)[root@vultr Hello]# python3 manage.py runserver 0.0.0.0:8088

uWSGI配置

deactivate退出虚拟环境

1、安装uWSGI

[root@vultr Hello]# pip3 install uWSGI

2、命令行运行测试

在 项目目录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没有问题.

3、使用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

4、后台启动停止uWSGI的命令

[root@vultr projects]# uwsgi --ini script/uwsgi.ini # 启动
[root@vultr projects]# uwsgi --stop script/uwsgi.pid # 停止

Nginx配置

1、 配置yum:

[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

2、 安装: yum -y install nginx

3、添加配置文件

[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;
 }
}

4、启动与停止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

启动Nginx

[root@vultr projects]# /etc/init.d/nginx start

访问URL,见证奇迹的时刻到了,然后...

Python开发之Nginx+uWSGI+virtualenv多项目部署教程

ok,报错了,莫慌。度娘查了502是服务器错误,然而前面测试了Django+uWSGI没问题,所以最有可能是在Nginx出错了。

来,我们查看一下Nginx的错误日志文件,日志文件在哪呢???

[root@vultr projects]# find / -name nginx.conf
/etc/nginx/nginx.conf
[root@vultr projects]# vi /etc/nginx/nginx.conf

Python开发之Nginx+uWSGI+virtualenv多项目部署教程

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和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中关于路径的都修改过来,修改好后,再次启动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、virtualenv可以实现一个服务器上运行多个项目,且互不干扰。

首先我们先来了解一下Nginx+uWSGI通信原理。

Python开发之Nginx+uWSGI+virtualenv多项目部署教程

请求首先交给Nginx,如果是静态内容Nginx就直接处理了,如果是动态内容就将请求交给uWSGI服务器,Nginx和uWSGI之间是通过Socket来通信的,通信协议就是/etc/nginx/conf.d/Hello.conf里配置的uwsgi_params文件。

那么,现在我们来梳理一下,Nginx是怎么知道uWSGI在哪里?通过什么和uWSGI做Socket通信,回看/etc/nginx/conf.d/Hello.conf文件:

Python开发之Nginx+uWSGI+virtualenv多项目部署教程

原来是根据uwsgi_pass指定了Nginx与uWSGI通信的Socket文件路径,看到这,就知道好办了,一个项目配置一个uwsgi.ini文件和nginx.conf里的一个server,那既然需要部署多个项目,那就是多个uwsgi.ini和nginx.conf里的多个server。

好的,我们开始测试:

1、配置虚拟环境以及测试用runserver运行Django项目是否正常。 我的目录结构是:

opt/
 projects/
  Hello/ --> 第一个Django项目
  env/  --> 第一个Django项目的虚拟环境
  World/ --> 第二个Django项目
  env_1/ --> 第二个Django项目的虚拟环境
  script/ --> uwsig.ini等文件存放

2、配置World项目的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

3、配置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;
 }
}

4、启动uWSGI和Nginx,访问两个端口的URL。 ok,访问正常。

总结

以上所述是小编给大家介绍的Python开发之Nginx+uWSGI+virtualenv多项目部署教程,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

Python 相关文章推荐
Python中的MongoDB基本操作:连接、查询实例
Feb 13 Python
Windows中使用wxPython和py2exe开发Python的GUI程序的实例教程
Jul 11 Python
Python图片裁剪实例代码(如头像裁剪)
Jun 21 Python
Django中login_required装饰器的深入介绍
Nov 24 Python
python 爬虫一键爬取 淘宝天猫宝贝页面主图颜色图和详情图的教程
May 22 Python
Python中xml和json格式相互转换操作示例
Dec 05 Python
Python3实现爬取简书首页文章标题和文章链接的方法【测试可用】
Dec 11 Python
python 图像判断,清晰度(明暗),彩色与黑白实例
Jun 04 Python
python中怎么表示空值
Jun 19 Python
Python如何定义有默认参数的函数
Aug 10 Python
Python用SSH连接到网络设备
Feb 18 Python
tensorboard 可视化之localhost:6006不显示的解决方案
May 22 Python
PyQt5的PyQtGraph实践系列3之实时数据更新绘制图形
May 13 #Python
Python实现插入排序和选择排序的方法
May 12 #Python
Python中将两个或多个list合成一个list的方法小结
May 12 #Python
python实现海螺图片的方法示例
May 12 #Python
详解用python写网络爬虫-爬取新浪微博评论
May 10 #Python
python的turtle库使用详解
May 10 #Python
详解Python sys.argv使用方法
May 10 #Python
You might like
MYSQL 小技巧 -- LAST_INSERT_ID
2009/11/24 PHP
php empty,isset,is_null判断比较(差异与异同)
2010/10/19 PHP
yii实现级联下拉菜单的方法
2014/07/31 PHP
phalcon框架使用指南
2016/02/23 PHP
微信自定义分享php代码分析
2016/11/24 PHP
CakePHP框架Model函数定义方法示例
2017/08/04 PHP
phpmyadmin在宝塔面板里进不去的解决方案
2020/07/06 PHP
JavaScript confirm选择判断
2008/10/18 Javascript
jQuery 操作下拉列表框实现代码
2010/02/22 Javascript
修改好的jquery滚动字幕效果实现代码
2011/06/22 Javascript
jQuery取id有.的值的方法
2014/05/21 Javascript
通过jquery 获取URL参数并进行转码
2014/08/18 Javascript
一个js过滤空格的小函数
2014/10/10 Javascript
jQuery对象和DOM对象之间相互转换的方法介绍
2015/02/28 Javascript
jquery插件jSignature实现手动签名
2015/05/04 Javascript
jQuery实现弹出带遮罩层的居中浮动窗口效果
2016/09/12 Javascript
Express进阶之log4js实用入门指南
2018/02/10 Javascript
在vscode中统一vue编码风格的方法
2018/02/22 Javascript
React diff算法的实现示例
2018/04/20 Javascript
通过函数作用域和块级作用域看javascript的作用域链
2018/08/05 Javascript
使用webpack构建应用的方法步骤
2019/03/04 Javascript
windows下create-react-app 升级至3.3.1版本踩坑记
2020/02/17 Javascript
关于vue-cli3打包代码后白屏的解决方案
2020/09/02 Javascript
vue实现列表拖拽排序的功能
2020/11/02 Javascript
ant-design-vue中tree增删改的操作方法
2020/11/03 Javascript
Vue页面渲染中key的应用实例教程
2021/01/12 Vue.js
python队列通信:rabbitMQ的使用(实例讲解)
2017/12/22 Python
Windows下安装Django框架的方法简明教程
2018/03/28 Python
从请求到响应过程中django都做了哪些处理
2018/08/01 Python
Python for循环通过序列索引迭代过程解析
2020/02/07 Python
保安员岗位职责
2013/11/17 职场文书
先进班级集体事迹材料
2014/01/30 职场文书
大学军训感想
2014/02/12 职场文书
作文评语集锦
2014/12/25 职场文书
兵马俑的导游词
2015/02/02 职场文书
Go语言安装并操作redis的go-redis库
2022/04/14 Golang