发布web服务器

nginx+uWSGI+django+virtualenv+supervisor

导论

WSGI是Web服务器网关接口。它是一个规范,描述了Web服务器如何与Web应用程序通信,以及Web应用程序如何链接在一起以处理一个请求,(接收请求,处理请求,响应请求),用于解析动态HTTP请求
uwsgi是通信协议,是uWSGI服务器的单独协议,用于定义传输信息的类型   

应用nginx与uwsgi的原因

1. 首先nginx 是对外的服务接口,外部浏览器通过url访问nginx.

2. nginx 接收到浏览器发送过来的http请求, 将包进行解析, 分析url, 如果是静态文件请求就直接访问用户给nginx配置的静态文件目录, 直接返回用户请求的静态文件.

如果不是静态文件, 而是一个动态的请求, 那么nginx就将请求转发给uwsgi, uwsgi 接收到请求之后将包进行处理, 处理成wsgi可以接受的格式, 并发给wsgi, wsgi 根据请求调用应用程序的某个文件, 某个文件的某个函数, 最后处理完将返回值再次交给wsgi, wsgi将返回值进行打包, 打包成uwsgi能够接收的格式, uwsgi接收wsgi 发送的请求, 并转发给nginx,nginx最终将返回值返回给浏览器。

3. 要知道第一级的nginx并不是必须的, uwsgi完全可以完成整个的和浏览器交互的流程, 但是要考虑到某些情况.
应用nginx的优点:
1.安全问题,程序不能直接被浏览器访问到,而是通过nginx, nginx只开放某个接口,uwsgi本身是内网接口,这样运维人员在nginx上加上安全性的限制,可以达到保护程序的作用。

2.负载均衡问题,一个uwsgi很可能不够用,即使开了多个work也是不行,毕竟一台机器的cpu和内存都是有限的,有了nginx做代理,一个nginx可以代理多台uwsgi完成uwsgi的负载均衡。

3.静态文件问题,用django或是uwsgi这种东西来负责静态文件的处理是很浪费的行为,而且他们本身对文件的处理也不如nginx好,所以整个静态文件的处理都直接由nginx完成,静态文件的访问完全不去经过uwsgi以及其后面的东西。
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 设置读取它。

服务器就是:1.接收请求 2.处理请求 3.返回响应

supervisor

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

部署项目

1. python3虚拟环境

2. 安装uwsgi
pip3 install uwsgi

3. 通过uwsgi启动django项目

	1) 进入项目第一层
	cd Ace_crm
    
	2) 执行命令,启动django
	uwsgi --http :8000 --module Ace_crm.wsgi
	
4. 热加载uwsgi
uwsgi --http :8088 --module Ace_crm.wsgi --py-autoreload=1 

5.配置文件uwsgi.ini, 启动uwsgi.
# 需要手动创建配置文件,(建议与项目在一起)

[uwsgi]
# Django-related settings    *****
# the base directory (full path) -->写入项目的绝对路径
chdir           = /opt/day81/Ace_crm
# Django's wsgi file  *****
# 写入django的第二层文件夹,和wsgi.py文件
module          = Ace_crm.wsgi
# the virtualenv (full path)
# 虚拟环境的绝对路径   *****
home            = /root/Envs/ace_crm
# process-related settings
# master
master          = true
# maximum number of worker processes
processes       = 5
# 如果不使用nginx进行代理,想直接访问django后台,可以使用http协议
# http = 0.0.0.0:8000
# 如果使用nginx进行反向代理,请使用socket协议,注释掉http协议
socket          = 0.0.0.0:8000
# ... with appropriate permissions - may be needed
# chmod-socket    = 664
# clear environment on exit
vacuum          = true

nginx + uwsgi

6.nginx + uwsgi : 启动项目
    
1) 配置nginx中nginx.conf文件, nginx进行反向代理
# nginx自带ngx_http_uwsgi_module模块,起到nginx和uwsgi交互作用
location / {
        # 通过uwsgi_pass设置服务器地址和协议, 将动态请求转发给uwsgi处理.
		include  uwsgi_params;
		uwsgi_pass 0.0.0.0:8000;
}

# http://192.168.11.192/static/admin/css/base.css
# 处理静态文件资源, 客户请求url时, 由nginx代理我们去找static文件.
location  /static {
		alias /opt/CrmStatic;
}

#nginx处理媒体资源
location /media{
     alias /opt/nginx1-12/media;  
}
# 配置完成启动nginx

2) 修改django中的settings.py,收集静态资源

STATIC_ROOT="/opt/CrmStatic"
STATIC_URL = '/static/'
STATICFILES_DIRS = [
    os.path.join(BASE_DIR, 'static')
]

3) 在django项目中收集静态文件, (自己创建CrmStatic文件夹,settings中相对应)
python3 manage.py collectstatic

4) 查看CrmStatic中的静态文件是否收集完成

supervisor启动uwsgi

1. 安装supervisor, (在真实环境下,使用物理环境python2去安装)
yum install python-setuptools
easy_install supervisor

2. 安装完成, 生成配置文件
echo_supervisord_conf > /etc/supervisord.conf

3.在配置文件中, 添加任务, 管理uwsgi
vim /etc/supervisord.conf    # 在最底行, 写入配置如下

[program:s17uwsgi]
# 填写绝对路径
command=/root/Envs/ace_crm/bin/uwsgi   --ini  /opt/day81/Ace_crm/uwsgi.ini
stopasgroup=true      
killasgroup=true   


4. 启动supervisor服务
supervisord -c  /etc/supervisord.conf 

5. 通过命令管理任务,管理uwsgui
supervisorctl -c /etc/supervisord.conf

6. supervisor命令
 
supervisorctl update      # 更新新的配置到supervisord  
supervisorctl reload      # 重新启动配置中的所有程序
start program_name        # 启动进程
stop  program_name        # 停止进程
stop  all                 # 停止全部进程
start all                 # 开启全部进程
status 任务名              # 查看某一进程的状态
restart program_name      # 重启进程

# nginx重启
nginx -s reload
# program_name = 配置中写的程序名称 (s17uwsgi)
posted @ 2019-06-28 08:54  言值  阅读(682)  评论(0编辑  收藏  举报