2021-09-27 windows下的挣扎 flask + nginx +gevent+tornado 组合测试记录

采用 flask + nginx+gevent+tornado的方式在windows中部署内容的各种尝试,测试环境是阿里云服务器windows 2019数据中心版本的系统镜像。

一、首先你得有一个写好的 flask web吧

》假设这个web就叫app.py那么我们启动他就应该是:
》python app.py

二、安装并配置nginx反向代理,提高安全性同时加强一定的并发能力

2.1 下载nginx-windows包

http://nginx.org/download/nginx-1.11.8.zip

2.2 解压缩后修改conf/nginx.conf 文件,在http:{}里边填上添加如下内容


	
    server { 
        listen 5001;
        server_name 47.105.72.***; 

        location / {
            proxy_set_header   X-Real-IP $remote_addr;
            proxy_set_header   Host      $http_host;
            proxy_pass         http://127.0.0.1:5000;
        				}
    			}

2.3启动nginx

切换到nginx根目录,点击nginx.exe
或者去这个目录 输入nginx 命令就可以启动服务器
关闭CMD窗口不会关闭nginx
关闭可以如下方法:
(1)输入nginx命令 nginx -s stop(快速停止nginx) 或 nginx -s quit(完整有序的停止nginx)
(2)使用taskkill taskkill /f /t /im nginx.exe

三、开放windows防火墙端口

3.1 进入防火墙配置中心
控制面板-防火墙-高级设置
==》设置入站规则
点击新建规则

  • tcp ===>特定本地端口 5001,并点击下一步

*选择允许链接并点击下一步

*设置名称并点击完成,即可生效

3.4 gevent #gevent这部分部分仅仅是记录,验证没用但是没舍得删,可直接跳转3.6部分以及tornado部分解决这个WSGI问题。。

pip install gevent

然后 在flask主入口程序最顶侧引入并打上猴子补丁

from gevent import monkey
monkey.patch_all()

补丁打好后用manage的装饰器写一个能够在黑屏终端执行的方法

@manage.command
def runserver_gevent():
	from gevent import pywsgi
	sever = pywsgi.WSGIServer(("127.0.0.1",5000),app)
	sever.serve_forever()

由于有NGINX的代理那就127.0.0.1 5000 最基础的就行了
下面贴出本次测试的所有主程部分

from gevent import monkey
monkey.patch_all()
from flask import Flask,request,redirect,url_for,render_template
from apps import creat_app
from flask_migrate import Manager,Migrate,MigrateCommand
from exts import db
from apps.user.models import User,ok1
import setting, os
app=Flask(__name__)
app=creat_app(app)
manage = Manager(app=app)
migrate = Migrate(app=app,db=db)
manage.add_command('db',MigrateCommand)
@manage.command
def runserver_gevent():
	from gevent import pywsgi
	sever = pywsgi.WSGIServer(("127.0.0.1",5000),app)
	sever.serve_forever()

if __name__=='__main__':
    manage.run()

存好文件后运行命令为:

python app.py runserver_gevent

3.5 访问地址

在浏览器输入 http://you_ip:5001即可。

最后,这么做一下是能够正常运行的,由于也是一个人测试也不知道有没有效果,以及实际价值(个人觉得比以前更容易卡死了~~),但是WINDOWS2019数据中心版的阿里云服务器也就折腾到这样了 真正的WEB服务器还是要换成linux系统的。

闭坑指南:严格来说这个博客是两天写的第一天用 flask + nginx+gevent其实这个方案是失败了,虽然程序能运行但是并没有解决单线程卡死的问题,也就是GEVENT的猴子补丁不适用,它内部WSGI也不适用WINDOWS 系统,所以以上GEVENT部分作为记录保留。一会这部分替换为tornado即可使用。下面是后续的负载均衡

3.6 这部分是写完了第一天晚上不甘心,又补充的内容负载均衡,这一次放弃了用gevent的启动方式而采用原版启动,考虑到一致困扰我的是服务器卡死的问题那我就多启动几个服务器,然后对NGINX配置了负载均衡的方案具体配置如下:还是改conf/nginx.conf 文件,在http:{}里边填上添加如下内容

    upstream testserver{
    server 127.0.0.1:5000;
    server 127.0.0.1:4999;
    server 127.0.0.1:4998;
    }
    server {
        listen 5001;
        server_name 47.105.*.*;
        location / {
            proxy_set_header   X-Real-IP $remote_addr;
            proxy_set_header   Host      $http_host;
            proxy_pass         http://testserver;
                    }
            }

上面,显而易见 第一个配置的 testserver是名字,把额外启动的几个服务器都填在大括号里,在下一个配置里边除了填侦听端口5001 服务器名字 47.105.. 最重要的是下面的 http://testserver 部分是说明了均衡服务器的列表名。

这里插入一条内容:NGINX会限制上传文件大小,如果要突破限制也要在这个配置里边填上红圈内容,最后10m表示 10兆,填100m就是100兆。

在这里插入图片描述

然后启动三个不同端口的服务器进行测试:请添加图片描述

图片显示~确实是。。。来请求后由三个服务器共同承担响应,想来就是卡死也得三个全卡死才挂掉(反正也没啥人看我开10个服务器闲着挂机也没事。十个全卡死想来也不太容易)。。。好吧短期治标了,治本还是换操作系统正经配置吧。

3.7 tornado方案

也是看到一篇博客 https://www.jianshu.com/p/9af55f90cf6d 他采用是的 Flask + Tornado + nginx 的办法,由于我之前NGINX都是部署完毕的那就直接用他的TORNADO部分测试吧,而且我记得有人说个tornado是一个高并发框架想来他的WSGI要是能用应该会比FLASK的自带开发服务器强大不少,个人网站也不会有多少并发量。

  1. 安装
pip install tornado
  1. 引用
#下面借用TORNADO的WSGI,先引用
from tornado.httpserver import HTTPServer
from tornado.wsgi import WSGIContainer
from tornado.ioloop import IOLoop
  1. 给manage搞个单独的启动方法
@manage.command
def runserver_wsgi():	
	s = HTTPServer(WSGIContainer(app))
	s.listen(5000) # 监听 5000 端口 ,仿照自带服务器端口
	IOLoop.current().start()

4. 启动服务器

python app.py runserver_wsgi

最后,为了便于理解和看我贴出自用项目的完整APP。py代码

from flask import Flask,request,redirect,url_for,render_template
from apps import creat_app
from flask_migrate import Manager,Migrate,MigrateCommand
from exts import db
from apps.user.models import User,ok1
import setting, os
#下面借用TORNADO的WSGI,先引用
from tornado.httpserver import HTTPServer
from tornado.wsgi import WSGIContainer
from tornado.ioloop import IOLoop

app=Flask(__name__)
app=creat_app(app)
manage = Manager(app=app)
migrate = Migrate(app=app,db=db)
manage.add_command('db',MigrateCommand)
### 这里加个装饰器
@manage.command
def runserver_wsgi():	
	s = HTTPServer(WSGIContainer(app))
	s.listen(5000) # 监听 5000 端口 ,仿照自带服务器端口
	IOLoop.current().start()

if __name__=='__main__':
    manage.run()

补充:测试发现NGINX代理端口5001和tornado的监听端口5000都可以捕获外边进入的请求,那为了保证使用代理就要在服务器安全组里边关闭tornado的侦听口5000的外部入请求提高安全性。至此,基本满意暂时使用此方案。

这里放一个tornado部署FALSK的博客链接,解释的比较细致

又来补充:经过以上处理基本流畅很多但还是偶尔发生卡死,有一篇博客说卡顿原因是CMD执行有关我把解决办法贴下面随后验证。

  1. 右击WEB程序cmd的窗口栏,选择默认值
  2. 取消勾选快速编辑功能
  3. 保存

补充的补充:经验证我觉得cmd方式没啥用,最后使用tornado+ngixt的负载均衡运行效果很好,开多个tornado服务器监听不同端口用起来比较丝滑,偶尔卡顿恢复也很快,服务器多开cpu负载几乎不增加,估计小微应用可以长期使用。

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值