发布django项目
supervisor需要用到的技术
1. nginx反向代理
2. nginx负载均衡
3. uwsgi
4. supervisor
5. virtualenv
安装nginx
详情参考 https://www.cnblogs.com/594504110python/p/10077464.html
安装mysql
详情参考 https://www.cnblogs.com/594504110python/p/10070751.html
准备一个python虚拟环境
详情参考 https://www.cnblogs.com/594504110python/p/10059374.html
https://www.cnblogs.com/594504110python/p/10060602.html
上传项目
简单使用xftp或lrzsz将项目上传至ESC(我用的是阿里云)
我写了一个CRM系统, 就一这个项目为例, 来做项目发布

项目环境(模块)准备
在项目的原始环境中收集项目中所用的模块
C:\Users\SATH>pip freeze > install.py # 会将所有的模块及模块版本写入install.py中
将install.py也上传至服务器,
在服务器中根据install.py去准备环境
pip3 install -r install.py
测试模块是否安装成功, 验证代码的完整性
在虚拟环境中直接runserver, 运行Django项目
[root@16:54 /project/CRM]# workon crm # 进入到虚拟环境
(crm) [root@16:55 /project/CRM]# python3 manage.py runserver 0.0.0.0:8888 启动Django
wsgi介绍
WSGI是Web服务器网关接口。它是一个规范,描述了Web服务器如何与Web应用程序通信,以及Web应用程序如何链接在一起以处理一个请求,(接收请求,处理请求,响应请求)
基于wsgi运行的框架有bottle,DJango,Flask,用于解析动态HTTP请求
支持WSGI的服务器
wsgiref
python自带的web服务器
Gunicorn
用于linux的 python wsgi Http服务器,常用于各种django,flask结合部署服务器。
mode_wsgi
实现了Apache与wsgi应用程序的结合
uWSGI
C语言开发,快速,自我修复,开发人员友好的WSGI服务器,用于Python Web应用程序的专业部署和开发。 在部署python程序web应用程序时,可以根据性能的需求,选择合适的wsgi server,不同的wsgi server区别在于并发支持上,有单线程,多进程,多线程,协程的区别,其功能还是近似,无非是请求路由,执行对应的函数,返回处理结果。 Django部署 Django的主要部署平台是 WSGI,这是用于Web服务器和应用程序的Python标准。 Django的 startproject管理命令设置一个简单的默认WSGI配置,可以根据需要为您的项目进行调整,并指示任何符合WSGI的应用程序服务器使用。 application
使用WSGI部署的关键概念是应用程序服务器用于与代码通信的 application 可调用。它通常在服务器可访问的Python模块中作为名为 application 的对象提供。 startproject 命令创建包含这样的 application 可调用的文件 <project_name>/wsgi.py. ,它被Django的开发服务器和生产WSGI部署使用。
WSGI服务器从其配置中获取 application 可调用的路径。 Django的内置服务器,即 runserver 命令,从 WSGI_APPLICATION 设置读取它。
为什么要用nginx+uwsgi
1 首先nginx 是对外的服务接口,外部浏览器通过url访问nginx, 2nginx 接收到浏览器发送过来的http请求,将包进行解析,分析url,如果是静态文件请求就直接访问用户给nginx配置的静态文件目录,直接返回用户请求的静态文件, 如果不是静态文件,而是一个动态的请求,那么nginx就将请求转发给uwsgi,uwsgi 接收到请求之后将包进行处理,处理成wsgi可以接受的格式,并发给wsgi,wsgi 根据请求调用应用程序的某个文件,某个文件的某个函数,最后处理完将返回值再次交给wsgi,wsgi将返回值进行打包,打包成uwsgi能够接收的格式,uwsgi接收wsgi 发送的请求,并转发给nginx,nginx最终将返回值返回给浏览器。 3要知道第一级的nginx并不是必须的,uwsgi完全可以完成整个的和浏览器交互的流程,但是要考虑到某些情况 1 安全问题,程序不能直接被浏览器访问到,而是通过nginx,nginx只开放某个接口,uwsgi本身是内网接口,这样运维人员在nginx上加上安全性的限制,可以达到保护程序的作用。 2负载均衡问题,一个uwsgi很可能不够用,即使开了多个work也是不行,毕竟一台机器的cpu和内存都是有限的,有了nginx做代理,一个nginx可以代理多台uwsgi完成uwsgi的负载均衡。 3静态文件问题,用django或是uwsgi这种东西来负责静态文件的处理是很浪费的行为,而且他们本身对文件的处理也不如nginx好,所以整个静态文件的处理都直接由nginx完成,静态文件的访问完全不去经过uwsgi以及其后面的东西。
nginx和uwsgi的拟人化交互过程
Nginx:hello wsgi,我刚收到一个请求,你准备下然后让django来处理吧 WSGI:好的nginx,我马上设置环境变量,然后把请求交给django Django:谢谢WSGI,我处理完请求马上给你响应结果 WSGI:好的,我在等着 Django:搞定啦,麻烦wsgi吧响应结果传递给nginx WSGI:太棒了,nginx,响应结果请收好,已经按照要求传递给你了 nginx:好滴。我把响应交给用户。合作愉快
下载,安装uwsgi
(crm) [root@17:11 /project/CRM/superCRM/views]# pip3 install uwsgi

使用uwsgi来跑一个小demo测试
先来写一个函数来处理请求
(crm) [root@nginx-lb 01:46 /opt/env]# cat ./test.py
def application(env, start_response):
start_response('200 OK', [('Content-Type','text/html')])
return [b"Hello World"] # python3
使用uwsgi启动这个web程序
(crm) [root@nginx-lb 01:47 /opt/env]# uwsgi --http :8000 --wsgi-file ./test.py 启动命令
参数介绍:
--http: 使用的协议
:8000: ip+poet, 默认ip是本机地址
--wsgi-file: 执行的程序文件
启动结果
*** Starting uWSGI 2.0.17.1 (64bit) on [Tue Dec 11 01:49:14 2018] ***
compiled with version: 4.8.5 20150623 (Red Hat 4.8.5-36) on 10 December 2018 17:36:33
os: Linux-3.10.0-862.el7.x86_64 #1 SMP Fri Apr 20 16:44:24 UTC 2018
nodename: nginx-lb
machine: x86_64
clock source: unix
pcre jit disabled
detected number of CPU cores: 1
current working directory: /opt/env
detected binary path: /root/Envs/crm/bin/uwsgi
uWSGI running as root, you can use --uid/--gid/--chroot options
*** WARNING: you are running uWSGI as root !!! (use the --uid flag) ***
*** WARNING: you are running uWSGI without its master process manager ***
your processes number limit is 1796
your memory page size is 4096 bytes
detected max file descriptor number: 1024
lock engine: pthread robust mutexes
thunder lock: disabled (you can enable it with --thunder-lock)
uWSGI http bound on :8000 fd 4
spawned uWSGI http 1 (pid: 2141)
uwsgi socket 0 bound to TCP address 127.0.0.1:43040 (port auto-assigned) fd 3
uWSGI running as root, you can use --uid/--gid/--chroot options
*** WARNING: you are running uWSGI as root !!! (use the --uid flag) ***
Python version: 3.6.5 (default, Nov 29 2018, 02:50:43) [GCC 4.8.5 20150623 (Red Hat 4.8.5-28)]
*** Python threads support is disabled. You can enable it with --enable-threads ***
Python main interpreter initialized at 0x15e3ba0
uWSGI running as root, you can use --uid/--gid/--chroot options
*** WARNING: you are running uWSGI as root !!! (use the --uid flag) ***
your server socket listen backlog is limited to 100 connections
your mercy for graceful operations on workers is 60 seconds
mapped 72920 bytes (71 KB) for 1 cores
*** Operational MODE: single process ***
WSGI app 0 (mountpoint='') ready in 0 seconds on interpreter 0x15e3ba0 pid: 2140 (default app)
uWSGI running as root, you can use --uid/--gid/--chroot options
*** WARNING: you are running uWSGI as root !!! (use the --uid flag) ***
*** uWSGI is running in multiple interpreter mode ***
访问结果

uWsgi热加载python程序
热加载也就是在程序代码发生改变后, 自动重启程序
在启动命令后面加上参数
uwsgi --http :8088 --module mysite.wsgi --py-autoreload=1
使用uwsgi启动一个Django项目
uwsgi --http :8888 --module crm.wsgi --py-autoreload=1 --module: 其实是指定一个application 在crm的wsgi.py文件中是这样写的
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "CRM.settings") application = get_wsgi_application()
其实uwsgi需要的是一个application 对象
使用uwsgi的配置文件方式启动一个项目
手动创建一个uwsgi.ini文件
(crm) [root@nginx-lb 02:19 /opt/env/CRM]# cat uwsgi.ini
[uwsgi]
#项目的绝对路径,定位到项目的第一层
chdir = /opt/env/CRM
#指明项目中的wsgi文件路径, 上面已经指定了项目的根目录, 所以这里使用相对路径即可, 注意使用的是 . 而不是 /
module = CRM.wsgi
#指明你的虚拟解释器的第一层路径
home = /root/Envs/crm
#指明通过uwsgi,启动多少个进程
processes = 1 #非常重要
#非常重要
#非常重要
#如果你已经配置了nginx(启动了nginx服务,配置了uwsgi_pass),请用这个socket连接, nginx在指定web服务器时纪要指定这个地址
#socket = 0.0.0.0:8000 #如果你没用nginx,想通过uwsgi直接启动web服务,指明http协议
http = 0.0.0.0:9999 #在退出uwsgi环境后,清空环境变量
vacuum = true
使用配置文件启动项目
看到了一个非常丑的页面, 不是因为我没写, 而是因为uwsgi不会解析Django的静态文件, 后面会吧这个静态文件放到nginx上, 还有一点
在项目的settings.py中DEBUG=True默认为True, 当静态文件还在应用服务器上的时候, 改为False也会到时静态文件请求不到的情况
(crm) [root@nginx-lb 02:27 /opt/env/CRM]# uwsgi --ini uwsgi.ini

这样就是用uwsgi启动了一个django项目
收集项目中的静态文件
上面说了静态文件在经过uwsgi后应用服务器上的静态文件是不能别解析的, 所以我问就需要将静态文件从应用服务器转移到nginx上
nginx处理静态文件这是一个很好的选择
先收集应用服务器中的静态文件, django提供了这样的功能, 只需要在配置文件中去添加以下配置
这个配置的意思其实就是指定收集的静态文件放在这个目录下

然后执行以下命令去收集
python3 manage.py collectstatic

配置nginx反向代理, 接受静态请求
配置nginx.conf
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
sendfile on;
keepalive_timeout 65;
upstream test { # 负载均衡池
server 127.0.0.1:8000; # 这个地址就是uwsgi.ini文件中socket配置的ip+port
}
server {
listen 80;
server_name localhost;
location / {
uwsgi_pass test; # 指定负载均衡池
include /opt/nginx1-12/conf/uwsgi_params; # 要指定一个uwsgi的配置文件, nginx有一个默认的, 见下图
}
location /static { # 负责处理静态文件的请求
alias /opt/static;
}
}
}

测试
现在的情况是动态请求nginx返回给django, 静态请求nginx自己就能够处理
静态资源也能加载出来了
看下我的页面吧, 当~当~当~

使用supervisor管理uwsgi
supervisor 是基于 python 的任务管理工具,用来自动运行各种后台任务,当然你也能直接利用 nohup 命令使任务自动后台运行,但如果要重启任务,每次都自己手动 kill 掉任务进程,这样很繁琐,而且一旦程序错误导致进程退出的话,系统也无法自动重载任务。
由于supervisor在python3下无法使用,因此只能用python2去下载!!!!!!
#注意此时已经退出虚拟环境了!!!!!
yum install python-setuptools
easy_install supervisor
生成默认的配置文件

配置文件解释
supervisord.conf配置文件参数解释
[program:xx]是被管理的进程配置参数,xx是进程的名称
[program:xx]
command=/opt/apache-tomcat-8.0.35/bin/catalina.sh run ; 程序启动命令
autostart=true ; 在supervisord启动的时候也自动启动
startsecs=10 ; 启动10秒后没有异常退出,就表示进程正常启动了,默认为1秒
autorestart=true ; 程序退出后自动重启,可选值:[unexpected,true,false],默认为unexpected,表示进程意外杀死后才重启
startretries=3 ; 启动失败自动重试次数,默认是3
user=tomcat ; 用哪个用户启动进程,默认是root
priority=999 ; 进程启动优先级,默认999,值小的优先启动
redirect_stderr=true ; 把stderr重定向到stdout,默认false
stdout_logfile_maxbytes=20MB ; stdout 日志文件大小,默认50MB
stdout_logfile_backups = 20 ; stdout 日志文件备份数,默认是10
; stdout 日志文件,需要注意当指定目录不存在时无法正常启动,所以需要手动创建目录(supervisord 会自动创建日志文件)
stdout_logfile=/opt/apache-tomcat-8.0.35/logs/catalina.out
stopasgroup=false ;默认为false,进程被杀死时,是否向这个进程组发送stop信号,包括子进程
killasgroup=false ;默认为false,向进程组发送kill信号,包括子进程
进入supervisord.conf在末尾添加如下配置

上面command前面的 # 号是不需要的, 删除即可, 否则会报错
使用supervisord来启动uwsgi
[root@nginx-lb 05:16 ~/pip-9.0.1]# supervisord -c /etc/supervisord.conf # 启动supervisord
[root@nginx-lb 05:16 ~/pip-9.0.1]# supervisorctl # 进入supervisord交互式命令行
mydjango RUNNING pid 4358, uptime 0:00:07
supervisor>
supervisorctl常用的交互式操作
一、添加好配置文件后 二、更新新的配置到supervisord
supervisorctl update
三、重新启动配置中的所有程序
supervisorctl reload
四、启动某个进程(program_name=你配置中写的程序名称)
supervisorctl start program_name
五、查看正在守候的进程
supervisorctl
六、停止某一进程 (program_name=你配置中写的程序名称)
pervisorctl stop program_name
七、重启某一进程 (program_name=你配置中写的程序名称)
supervisorctl restart program_name
八、停止全部进程
supervisorctl stop all
注意:显示用stop停止掉的进程,用reload或者update都不会自动重启。
发布django项目的更多相关文章
- 白手起家Django项目发布上篇_linux centos 环境部署
在项目发布之前,首先准备好我们编写好的Django项目,这个我们在之后博客有写,大家可以去看, 首先,先开始安装linux服务器,作为Django项目的发布服务器.以Vmware虚拟机为例子,大家也可 ...
- Django项目发布到Apache2.4配置mod_wsgi,解决遭遇的各种坑。
环境: Apache2.4 32bit Python 3.7.1 (v3.7.1:260ec2c36a, Oct 20 2018, 14:05:16) [MSC v.1915 32 bit (Inte ...
- 发布一个Django项目
一.部署环境准备,准备python3和虚拟环境解释器,virtualenvwrapper 1.修改python3的环境变量 PATH=/opt/python36/bin:/usr/local/sbin ...
- 白手起家Django项目发布中篇_Centos下Python2和3并存环境部署
python环境部署 我们今天学习的内容是如何将Django项目部署到linux服务器上,我们部署的linux系统是centos7首先,我们先在linux上搭建我们的Python3环境: 在这里首先强 ...
- 白手起家Django项目发布下篇_Django项目nginx部署
上一篇完成了python的安装,接下来安装python的依赖包和项目的依赖包 1. python-devel 命令:yum -y install python-devel 安装Django1.8.2 ...
- Python开发入门与实战2-第一个Django项目
2.第一个Django项目 上一章节我们完成了python,django和数据库等运行环境的安装,现在我们来创建第一个django project吧,迈出使用django开发应用的第一步. 2.1.创 ...
- [译]如何使用 Docker 组件开发 Django 项目?
原文地址:Django Development With Docker Compose and Machine 以下为译文 Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包 ...
- Django 1.6 最佳实践: 如何设置django项目的设置(settings.py)和部署文件(requirements.txt)
Django 1.6 最佳实践: 如何设置django项目的设置(settings.py)和部署文件(requirements.txt) 作者: Desmond Chen,发布日期: 2014-05- ...
- Django项目实践4 - Django站点管理(后台管理员)
http://blog.csdn.net/pipisorry/article/details/45079751 上篇:Django项目实践3 - Django模型 Introduction 对于某一类 ...
随机推荐
- RBG灯颜色渐变(颜色要尽可能多)程序分析
相信很多调过RBG灯的朋友都是通过分别改变R.B.G的占空比来改变颜色的,但是不是发现了一个问题,那就是不管怎样调都很难实现几十种颜色的变化,一般只有是7种颜色的渐变.下面给朋友们分享一个可以实现几十 ...
- QBC(Query By Criteria) QBE (Query By Example)
QBC 参考:(Hibernate的QBC查询) //is empty and is not empty @Test public void testQBC(){ Session session = ...
- CAA介绍(转)
CAA是DS公司正对于其一系列产品,eg:CATIA,ENOVIA,DELIMA,etc,进行二次开发的一个环境.与VC结合的比较紧密.CAAV4是用于Unix/Linux的,到CAAV5才移植到Wi ...
- check_mk的性能案例
http://wiki.lustre.org/Check_MK/Graphite/Graphios_Setup_Guide Dell PowerEdge R515 2x 8-Core AMD Opte ...
- Selenium2学习(九)-- 多窗口,句柄(handle)
前言 有些页面的链接打开后,会重新打开一个窗口,对于这种情况,想在新页面上操作,就得先切换窗口了.获取窗口的唯一标识用句柄表示,所以只需要切换句柄,我们就能在多个页面上灵活自如的操作了. 一.认识多窗 ...
- 再学UML-UML用例建模解析(二)
(1) 关联关系 关联关系是指执行者与用例之间的关系,又称为通信关系,如果某个执行者可以对某个用例进行操作,它们之间就具有关联关系,如下图所示,“经理”有一个功能为“查看库存报表”,因此可以在执行者“ ...
- 如何通过一个SAPGUI屏幕反查这个屏幕对应的事务码
假设我通过某种跳转方式打开了下图这个SAPGUI的屏幕,但我想搞清楚用哪一个事务码可以直接到达这个屏幕,而不通过繁琐的点击,应该怎么做? 步骤1,点击Order字段,按F1打开帮助界面, 点上图的图标 ...
- 设置IE浏览器的默认主页
实现效果: 知识运用: RegistryKey类的GetValue方法 public Object GetValue (string name , Object defaultValue) name ...
- Pod常使用命令
pod 命令汇总 # 创建默认的 Podfile $ pod init # 第一次使用安装框架 $ pod install # 安装框架,不更新本地索引,速度快 $ pod install --no- ...
- c++字符串初始化
#include<string> string s1 = "abcdefg"; string s2("abcdefg");