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的几种开发工具介绍
Mar 07 Python
python使用电子邮件模块smtplib的方法
Aug 28 Python
python 读写、创建 文件的方法(必看)
Sep 12 Python
Python使用Windows API创建窗口示例【基于win32gui模块】
May 09 Python
利用python如何处理百万条数据(适用java新手)
Jun 06 Python
pytorch nn.Conv2d()中的padding以及输出大小方式
Jan 10 Python
Python Opencv中用compareHist函数进行直方图比较对比图片
Apr 07 Python
浅谈Keras的Sequential与PyTorch的Sequential的区别
Jun 17 Python
Selenium alert 弹窗处理的示例代码
Aug 06 Python
Python .py生成.pyd文件并打包.exe 的注意事项说明
Mar 04 Python
Python max函数中key的用法及原理解析
Jun 26 Python
Python实现生活常识解答机器人
Jun 28 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
PHP运行模式汇总
2016/11/06 PHP
Aliyun Linux 编译安装 php7.3 tengine2.3.2 mysql8.0 redis5的过程详解
2020/10/20 PHP
js下用层来实现select的title提示属性
2010/02/23 Javascript
Jquery 实现Tab效果 思路是js思路
2010/03/02 Javascript
JS继承 笔记
2011/07/13 Javascript
jQuery.buildFragment使用方法及思路分析
2013/01/07 Javascript
谈谈JavaScript中的函数与闭包
2013/04/14 Javascript
Jquery多选框互相内容交换的实例代码
2013/07/04 Javascript
jquery事件绑定解绑机制源码解析
2016/09/19 Javascript
Vue三层嵌套路由的示例代码
2018/05/05 Javascript
vueScroll实现移动端下拉刷新、上拉加载
2019/03/22 Javascript
js实现适配移动端的拖动效果
2020/01/13 Javascript
JavaScript 替换所有匹配内容及正则替换方法
2020/02/12 Javascript
vue2.0 解决抽取公用js的问题
2020/07/31 Javascript
vue-resource 拦截器interceptors使用详解
2021/01/18 Vue.js
Python Web服务器Tornado使用小结
2014/05/06 Python
详解Python中的多线程编程
2015/04/09 Python
Python3网络爬虫之使用User Agent和代理IP隐藏身份
2017/11/23 Python
python写入并获取剪切板内容的实例
2018/05/31 Python
Python把csv数据写入list和字典类型的变量脚本方法
2018/06/15 Python
python的set处理二维数组转一维数组的方法示例
2019/05/31 Python
postman模拟访问具有Session的post请求方法
2019/07/15 Python
Win系统PyQt5安装和使用教程
2019/12/25 Python
python3利用Axes3D库画3D模型图
2020/03/25 Python
Python轻量级web框架bottle使用方法解析
2020/06/13 Python
CSS3+Sprite实现僵尸行走动画特效源码
2016/01/27 HTML / CSS
CSS3绘制超炫的上下起伏波动进度加载动画
2016/04/21 HTML / CSS
Marc Jacobs彩妆官网:Marc Jacobs Beauty
2017/07/03 全球购物
优秀管理者获奖感言
2014/02/17 职场文书
推荐信格式范文
2014/05/09 职场文书
公司年会策划方案
2014/05/17 职场文书
2015年乡镇民政工作总结
2015/05/13 职场文书
雨中的树观后感
2015/06/03 职场文书
2015小学音乐教师个人工作总结
2015/07/21 职场文书
创业计划书之寿司
2019/07/19 职场文书
基于Python编写一个监控CPU的应用系统
2022/06/25 Python