web应用程序之服务器部署

      当一个web应用层序开发好后,无论你是用什么语言,最后都要考虑部署到服务器上测试使用,这里就常见的服务器上部署进行如下的摸索总结。WSGI(Web Server Gateway Interface),翻译为Python web服务器网关接口,即PythonWeb应用程序(如Flask)和Web服务器(如Nginx)之间的一种通信协议。也就是说,如果让你的Web应用在任何服务器上运行,就必须遵循这个协议。

       那么实现WSGI协议的web服务器有哪些呢?就比如uWSGIgunicorn,下面总结了5个常用的WSGI容器

可能你在许多地方看到的都是采用Nginx + uWSGI(或gunicorn)的部署方式。实际上,直接通过uWSGIgunicorn直接部署也是可以让外网访问的,那你可能会说,那要Nginx何用?别急,那么接来下介绍另一个Web服务器——Nginx

Nginx作为一个高性能Web服务器,具有负载均衡、拦截静态请求、高并发...等等许多功能,你可能要问了,这些功能和使用Nginx + WSGI容器的部署方式有什么关系?

  • 首先是负载均衡,如果你了解过OSI模型的话,其实负载均衡器就是该模型中4~7层交换机中的一种,它的作用是能够仅通过一个前端唯一的URL访问分发到后台的多个服务器,这对于并发量非常大的企业级Web站点非常有效。在实际应用中我们通常会让Nginx监听(绑定)80端口,通过多域名或者多个location分发到不同的后端应用。
  • 其次是拦截静态请求,简单来说,Nginx会拦截到静态请求(静态文件,如图片),并交给自己处理。而动态请求内容将会通过WSGI容器交给Web应用处理;
  • Nginx还有其他很多的功能,这里便不一一介绍。那么前面说了,直接通过uWSGIgunicorn也可以让外网访问到的,但是鉴于Nginx具有高性能、高并发、静态文件缓存、及以上两点、甚至还可以做到限流与访问控制,所以选择Nginx是很有必要的;

这里可以说明,如果你选择的架构是:Nginx + WSGI容器 + web应用,WSGI容器相当于一个中间件;如果选择的架构是uWSGI + web应用,WSGI容器则为一个web服务器。那nginx+uwsgi 和nginx+gunicorn,这两种方案,应该如何选择呢?其实这个看自己的选择,两者都还行,不过第二种配置简单点。下面就这两种方式不同配置方式进行阐述。

(1)nginx+gunicorn

Gunicorn是一个WSGI HTTP服务器,python自带的有个web服务器,叫做wsgiref,Gunicorn的优势在于,它使用了pre-fork worker模式,gunicorn在启动时,会在主进程中预先fork出指定数量的worker进程来处理请求,gunicorn依靠操作系统来提供负载均衡,推进的worker数量是(2*$num_cores)+1。我们知道,python是单线程的语言,当进程阻塞时,后续请求将排队处理。所用pre-fork worker模式,极大提升了服务器请求负载。

  • 安装及简单使用
pip install gunicorn

gunicorn -h
  • 简单示例
####测试脚本test.py
from flask import Flask

app = Flask(__name__)


@app.route('/demo', methods=['GET'])
def demo():
    return "gunicorn and flask demo."

###gunicorn运行脚本 -w 表示2个线程 -b 表示映射的ip及端口 -c 加载配置文件
gunicorn -w 2 -b 172.0.0.1:4000 test:app
  • 生产环境

在生产环境,起停和状态的监控最好用supervisior之类的监控工具,然后在gunicorn的前端放置一个http proxy server, 譬如nginx。

supervisorctl status        //查看所有进程的状态
supervisorctl stop es       //停止es
supervisorctl start es      //启动es
supervisorctl restart       //重启es
supervisorctl update        //配置文件修改后使用该命令加载新的配置
supervisorctl reload        //重新启动配置中的所有程序

(2)nginx+uwsgi

uWSGI是一个Web服务器,它实现了WSGI协议、uwsgi、http等协议。Nginx在Http Uwsgi Module中的作用是与uWSGI服务器进行交换。

要注意 WSGI / uwsgi / uWSGI 这三个概念的区分。

  • WSGI看过前面小节的同学很清楚了,是一种通信协议。
  • uwsgi同WSGI一样是一种通信协议。
  • 而uWSGI是实现了uwsgi和WSGI两种协议的Web服务器。

uwsgi协议是一个uWSGI服务器自有的协议,它用于定义传输信息的类型(type of information),每一个uwsgi packet前4byte为传输信息类型描述,它与WSGI相比是两样东西。

  • 安装简单使用
pip install uwsgi

uwsgi --ini uwsgi.ini   ####启动
 
uwsgi --stop uwsgi.pid  ##停止 当配置了pidfile = uwsgi.pid选项
 
killall -s INT /虚拟环境/bin/uwsgi  ##停止 ,未配置uwsgi.pid选项
 
ps -ef|grep uwsgi  ###查看与uwsgi相关的进程信息

使用示例可以参考https://blog.csdn.net/xiaomu_347/article/details/107191671


补:supervisor

supervisor是一个用python语言编写的进程管理工具,它可以很方便的监听、启动、停止、重启一个或多个进程。当一个进程意外被杀死,supervisor监听到进程死后,可以很方便的让进程自动恢复,不再需要程序员或系统管理员自己编写代码来控制,更详细的使用方法请参考之前的文章 https://xugaoxiang.com/2019/12/04/supervisor/

首先创建/etc/supervisor/conf.d/gunicorn.conf文件,这是gunicorn服务的配置文件

[program:gunicorn]

command=/home/xugaoxiang/anaconda3/bin/gunicorn -w 2 -b :5000 run:app

directory=/home/xugaoxiang/workshop/Flask-10-wtf

autostart=true

autorestart=true

user=xugaoxiang

redirect_stderr=true

接着还是同样的方法创建nginx的配置文件,/etc/supervisor/conf.d/nginx.conf,内容是

[program:nginx]

command=/usr/sbin/nginx -g 'daemon on;'

autostart=true

autorestart=true

user=root

redirect_stderr=true

nginx是需要root权限的,所以user应该设置成root。最后就可以重启supervisor

sudo /etc/init.d/supervisor restart

参考链接:

1、深入理解uwsgi和gunicorn网络模型_uwsgi三层模型-CSDN博客(深入理解uwsgi和gunicorn网络模型)

2、https://segmentfault.com/a/1190000020386810?utm_source=tag-newestDjango搭建个人博客:将项目部署到阿里云服务器

3、https://www.cnblogs.com/2mei/p/9213785.htmlDJANGO项目部署到服务器上

4、如何把本地的Django项目部署到服务器(亲测)_django webapi服务如何发布到服务器-CSDN博客(如何把本地的Django项目部署到服务器(亲测))

5、nginx+uwsgi 和nginx+gunicorn区别、如何部署

6、深入理解uwsgi和gunicorn网络模型

7、Flask教程(十二)项目部署-CSDN博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xiaomu_347

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值