经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » Django » 查看文章
将django项目发布到互联网上
来源:cnblogs  作者:王剑威  时间:2018/12/11 9:28:53  对本文有异议

supervisor需要用到的技术

1. nginx反向代理

2. nginx负载均衡

3. uwsgi

4. supervisor

5. virtualenv

 

安装nginx

  1. 详情参考 https://www.cnblogs.com/594504110python/p/10077464.html

 

安装mysql

  1. 详情参考 https://www.cnblogs.com/594504110python/p/10070751.html

 

准备一个python虚拟环境

  1. 详情参考 https://www.cnblogs.com/594504110python/p/10059374.html
  2.         https://www.cnblogs.com/594504110python/p/10060602.html

 

上传项目

简单使用xftp或lrzsz将项目上传至ESC(我用的是阿里云)

我写了一个CRM系统, 就一这个项目为例, 来做项目发布

 

项目环境(模块)准备

在项目的原始环境中收集项目中所用的模块

  1. C:\Users\SATH>pip freeze > install.py    # 会将所有的模块及模块版本写入install.py中

将install.py也上传至服务器, 

在服务器中根据install.py去准备环境

  1. pip3 install -r install.py

 

测试模块是否安装成功, 验证代码的完整性

在虚拟环境中直接runserver, 运行Django项目

  1. [root@16:54 /project/CRM]# workon crm    # 进入到虚拟环境(crm)  [root@16:55 /project/CRM]# python3 manage.py runserver 0.0.0.0:8888 启动Django

 

wsgi介绍

  1. WSGIWeb服务器网关接口。它是一个规范,描述了Web服务器如何与Web应用程序通信,以及Web应用程序如何链接在一起以处理一个请求,(接收请求,处理请求,响应请求)
  2. 基于wsgi运行的框架有bottle,DJango,Flask,用于解析动态HTTP请求
  3. 支持WSGI的服务器
  4.     wsgiref
  5.         python自带的web服务器
  6.     Gunicorn
  7.         用于linux python wsgi Http服务器,常用于各种djangoflask结合部署服务器。
  8.     mode_wsgi
  9.         实现了Apachewsgi应用程序的结合
  10.     uWSGI
  11.         C语言开发,快速,自我修复,开发人员友好的WSGI服务器,用于Python Web应用程序的专业部署和开发。
  12.  
  13. 在部署python程序web应用程序时,可以根据性能的需求,选择合适的wsgi server,不同的wsgi server区别在于并发支持上,有单线程,多进程,多线程,协程的区别,其功能还是近似,无非是请求路由,执行对应的函数,返回处理结果。
  14.  
  15.  
  16.  
  17.  
  18. Django部署
  19.  
  20. Django的主要部署平台是 WSGI,这是用于Web服务器和应用程序的Python标准。
  21.  
  22. Django startproject管理命令设置一个简单的默认WSGI配置,可以根据需要为您的项目进行调整,并指示任何符合WSGI的应用程序服务器使用。
  23.  
  24. application 
  25. 使用WSGI部署的关键概念是应用程序服务器用于与代码通信的 application 可调用。它通常在服务器可访问的Python模块中作为名为 application 的对象提供。
  26.  
  27. startproject 命令创建包含这样的 application 可调用的文件 <project_name>/wsgi.py. ,它被Django的开发服务器和生产WSGI部署使用。
  28. WSGI服务器从其配置中获取 application 可调用的路径。 Django的内置服务器,即 runserver 命令,从 WSGI_APPLICATION 设置读取它。

 

为什么要用nginx+uwsgi

  1. 1 首先nginx 是对外的服务接口,外部浏览器通过url访问nginx,
  2.  
  3. 2nginx 接收到浏览器发送过来的http请求,将包进行解析,分析url,如果是静态文件请求就直接访问用户给nginx配置的静态文件目录,直接返回用户请求的静态文件,
  4.  
  5. 如果不是静态文件,而是一个动态的请求,那么nginx就将请求转发给uwsgi,uwsgi 接收到请求之后将包进行处理,处理成wsgi可以接受的格式,并发给wsgi,wsgi 根据请求调用应用程序的某个文件,某个文件的某个函数,最后处理完将返回值再次交给wsgi,wsgi将返回值进行打包,打包成uwsgi能够接收的格式,uwsgi接收wsgi 发送的请求,并转发给nginx,nginx最终将返回值返回给浏览器。
  6.  
  7. 3要知道第一级的nginx并不是必须的,uwsgi完全可以完成整个的和浏览器交互的流程,但是要考虑到某些情况1 安全问题,程序不能直接被浏览器访问到,而是通过nginx,nginx只开放某个接口,uwsgi本身是内网接口,这样运维人员在nginx上加上安全性的限制,可以达到保护程序的作用。
  8.  
  9. 2负载均衡问题,一个uwsgi很可能不够用,即使开了多个work也是不行,毕竟一台机器的cpu和内存都是有限的,有了nginx做代理,一个nginx可以代理多台uwsgi完成uwsgi的负载均衡。
  10.  
  11. 3静态文件问题,用django或是uwsgi这种东西来负责静态文件的处理是很浪费的行为,而且他们本身对文件的处理也不如nginx好,所以整个静态文件的处理都直接由nginx完成,静态文件的访问完全不去经过uwsgi以及其后面的东西。

 

nginx和uwsgi的拟人化交互过程

  1. Nginxhello wsgi,我刚收到一个请求,你准备下然后让django来处理吧
  2.  
  3. WSGI:好的nginx,我马上设置环境变量,然后把请求交给django
  4.  
  5. Django:谢谢WSGI,我处理完请求马上给你响应结果
  6.  
  7. WSGI:好的,我在等着
  8.  
  9. Django:搞定啦,麻烦wsgi吧响应结果传递给nginx
  10.  
  11. WSGI:太棒了,nginx,响应结果请收好,已经按照要求传递给你了
  12.  
  13. nginx:好滴。我把响应交给用户。合作愉快

 

下载,安装uwsgi

  1. (crm)  [root@17:11 /project/CRM/superCRM/views]# pip3 install uwsgi

 

使用uwsgi来跑一个小demo测试

先来写一个函数来处理请求

  1. (crm)  [root@nginx-lb 01:46 /opt/env]# cat ./test.pydef application(env, start_response):
  2.     start_response('200 OK', [('Content-Type','text/html')])return [b"Hello World"] # python3

 

使用uwsgi启动这个web程序

  1. (crm)  [root@nginx-lb 01:47 /opt/env]
  1.     --wsgi-file: 执行的程序文件
  1. *** Starting uWSGI 2.0.17.1 (64bit) on [Tue Dec 11 01:49:14 2018] ***4.8.5 20150623 (Red Hat 4.8.5-36) on 10 December 2018 17:36:33-3.10.0-862.el7.x86_64 nodename: nginx-1/opt//root/Envs/crm/bin/--uid/--gid/--*** WARNING: you are running uWSGI as root !!! (use the --uid flag) *** 
  2. *** WARNING: you are running uWSGI without its master process manager *** 1796 40961024--thunder-8000 fd 41 (pid: 2141127.0.0.1:43040 (port auto-assigned) fd 3--uid/--gid/--*** WARNING: you are running uWSGI as root !!! (use the --uid flag) ***3.6.5 (default, Nov 29 2018, 02:50:43)  [GCC 4.8.5 20150623 (Red Hat 4.8.5-28*** Python threads support  disabled. You can enable it with --enable-threads ***0x15e3ba0--uid/--gid/--*** WARNING: you are running uWSGI as root !!! (use the --uid flag) *** limited to 100 graceful operations on workers  6072920 bytes (71 KB)  1*** Operational MODE: single process ***=) ready  0 seconds on interpreter 0x15e3ba0 pid: 2140--uid/--gid/--*** WARNING: you are running uWSGI as root !!! (use the --uid flag) *** 
  3. *** uWSGI  running  multiple interpreter mode ***

访问结果

uWsgi热加载python程序

热加载也就是在程序代码发生改变后, 自动重启程序

  1. 在启动命令后面加上参数
  2. uwsgi --http :8088 --module mysite.wsgi --py-autoreload=1

 

 

使用uwsgi启动一个Django项目

  1. uwsgi --http :8888  --module crm.wsgi --py-autoreload=1 --module: 其实是指定一个application
  2.  
  3. crmwsgi.py文件中是这样写的
  4. os.environ.setdefault("DJANGO_SETTINGS_MODULE", "CRM.settings")
  5.  
  6. application = get_wsgi_application()
  7. 其实uwsgi需要的是一个application 对象

 

使用uwsgi的配置文件方式启动一个项目

手动创建一个uwsgi.ini文件

  1. (crm)  [root@nginx-lb 02:19 /opt/env/CRM]# cat uwsgi.ini [uwsgi]#项目的绝对路径,定位到项目的第一层chdir           = /opt/env/CRM#指明项目的wsgi文件路径module          = CRM/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也会到时静态文件请求不到的情况

  1. (crm)  [root@nginx-lb 02:27 /opt/env/CRM]# uwsgi --ini uwsgi.ini

 这样就是用uwsgi启动了一个django项目

 

收集项目中的静态文件

上面说了静态文件在经过uwsgi后应用服务器上的静态文件是不能别解析的, 所以我问就需要将静态文件从应用服务器转移到nginx上

nginx处理静态文件这是一个很好的选择

先收集应用服务器中的静态文件, django提供了这样的功能, 只需要在配置文件中去添加以下配置

这个配置的意思其实就是指定收集的静态文件放在这个目录下

然后执行以下命令去收集

  1. python3 manage.py collectstatic

 

配置nginx反向代理, 接受静态请求

配置nginx.conf

  1. worker_processes  1;
  2.  
  3.  
  4. events {
  5.     worker_connections  1024;
  6. }
  7.  
  8.  
  9. http {
  10.     include       mime.types;
  11.     sendfile        on;
  12.     keepalive_timeout  65;
  13.     upstream test {    # 负载均衡池server 127.0.0.1:8000;        # 这个地址就是uwsgi.ini文件中socket配置的ip+port    }
  14.     server {
  15.         listen       80;
  16.         server_name  localhost;
  17.         location / {
  18.             uwsgi_pass test;    # 指定负载均衡池include /opt/nginx1-12/conf/uwsgi_params;    # 要指定一个uwsgi的配置文件, nginx有一个默认的, 见下图        }
  19.         location /static {    # 负责处理静态文件的请求alias /opt/static;
  20.         }       
  21.     }
  22. }

 

 测试

现在的情况是动态请求nginx返回给django, 静态请求nginx自己就能够处理

静态资源也能加载出来了

看下我的页面吧, 当~当~当~

 

 使用supervisor管理uwsgi

supervisor 是基于 python 的任务管理工具,用来自动运行各种后台任务,当然你也能直接利用 nohup 命令使任务自动后台运行,但如果要重启任务,每次都自己手动 kill 掉任务进程,这样很繁琐,而且一旦程序错误导致进程退出的话,系统也无法自动重载任务。

由于supervisor在python3下无法使用,因此只能用python2去下载!!!!!!

  1. #注意此时已经退出虚拟环境了!!!!!yum install python-setuptools
  2. easy_install supervisor

生成默认的配置文件

 

 配置文件解释

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

 

进入supervisord.conf在末尾添加如下配置

上面command前面的 # 号是不需要的, 删除即可, 否则会报错

 

使用supervisord来启动uwsgi

  1. [root@nginx-lb 05:16 ~/pip-9.0.1]# supervisord -c /etc/supervisord.conf # 启动supervisord
  2.  [root@nginx-lb 05:16 ~/pip-9.0.1]# supervisorctl # 进入supervisord交互式命令行mydjango                         RUNNING   pid 4358, uptime 0:00:07supervisor>

 

supervisorctl常用的交互式操作

  1. ===

 

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号