Python+Flask+Tornado+Nginx服务器部署解决方案
上期文章,我们分享了flask的简单入门,哪里我们的代码都是运行在本机上面。flask作为一个web服务器,最后当然要部署在云服务器上
flask云服务器配置
* Serving Flask app "flaskweb" (lazy loading)
* Environment: production
WARNING: Do not use the development server in a production environment.
Use a production WSGI server instead.
* Debug mode: off
* Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
这是上期文章中,flask提示的问题
WARNING: Do not use the development server in a production environment.这句话的意思是flask不要使用在生产环境中,由于flask是一个简单的web框架,flask 在正式的服务器上的表现能力确实不足,当然你的网站访问量不是很多的时候,完全可以使用flask来进行服务,我们来使用Tornado来部署服务器环境来代替flask的WSGI ,下图是网友整理的一个服务器相应一个浏览器处理的过程,主要是 如下:
1、浏览器输入网站进行网页请求
2、服务器端的Nginx 反向代理来监听网络的请求接口(一般是80(http)或者443端口(https))
3、nginx解析到服务器上的WSGI 服务
4、WSGI 服务托管flask web服务器的程序
5、flask web 服务器原路返回网页与数据
服务器处理流程
Tornado
Tornado是一个开源的网络服务器框架,它是基于社交聚合网站FriendFeed的实时信息服务开发而来的,Tornado使FriendFeed使用的可扩展的非阻塞Web服务器及其相关工具的开源版本,这个Web框架看起来有些像web.py或 Google的webapp,不过为了更加有效地利用非阻塞服务器环境,Tornado这个Web框架还包含了一些相关的有用工具和优化。
Tornado与现代主流的Web服务器框架有着明显的区别:它是非阻塞式的服务器,速度相当快。这得益于其非阻塞的方式和对epoll的运用。Tornado每秒可以处理数以千计的连接,对于实时Web服务来说Tornado确实是一个理想的Web框架
轻量级Web框架
异步非阻塞IO处理方式
Tornado采用的单进程单线程异步IO的网络模式,其高性能源于Tornado基于Linux的Epoll(UNIX为kqueue)的异步网络IO。
出色的抗负载能力
不依赖多进程或多线程
WSGI全栈替代产品
WSGI把应用(Application)和服务器(Server)结合起来,Tornado既可以是WSGI应用也可以是WSGI服务。
既是WebServer也是WebFramework
我们使用Tornado作为flask的WSGI服务来托管flask的网页,这样我们就可以部署大访问量的生产服务环境
参考上期的文章,我们新建一个web.py的flask web 代码
from flask import Flask, request
from flask import render_template
app = Flask(__name__)
@app.route('/')
def index():
return render_template('index.html')
@app.route('/powers')
def powers():
return 'hello word, hello flask!'
if __name__ == '__main__':
app.run()
在flask web.py 文件夹下,新建一个tornadoweb.py文件,里面配置Tornado
当然,在配置以前你需要在服务器上安装tornado,直接使用pip install 安装即可
from tornado.wsgi import WSGIContainer
from tornado.httpserver import HTTPServer
from web import app#web是我們flask代码的名称web.py
from tornado.ioloop import IOLoop
s = HTTPServer(WSGIContainer(app))
s.bind(5000,"0.0.0.0")#监听5000端口,作为服务器这里配置成0.0.0.0,服务器就可以监听所有浏览器的访问了。
s.start(1)
IOLoop.instance().start()
以上几句简单的代码便可以使用tornado来托管flask,个人感觉tornado的入门简单,比其它web服务器代理配置简单方便的多。这里需要注意,我们不再运行web.py而是运行tornadoweb.py这个脚本
tornado主要跟本地服务器打交道,而跟浏览器打交道的便是nginx
nginx配置
Nginx 同 Apache 一样都是一种 Web 服务器。基于 REST 架构风格,以统一资源描述符(Uniform Resources Identifier)URI 或者统一资源定位符(Uniform Resources Locator)URL 作为沟通依据,通过 HTTP 协议提供各种网络服务。
Nginx 使用基于事件驱动架构,使得其可以支持数以百万级别的 TCP 连接。高度的模块化和自由软件许可证使得第三方模块层出不穷(这是个开源的时代啊)。Nginx 是一个跨平台服务器,可以运行在 Linux、Windows、FreeBSD、Solaris、AIX、Mac OS 等操作系统上。这些优秀的设计带来的极大的稳定性。
Nginx 是一款自由的、开源的、高性能的 HTTP 服务器和反向代理服务器;同时也是一个 IMAP、POP3、SMTP 代理服务器。
Nginx 可以作为一个 HTTP 服务器进行网站的发布处理,另外 Nginx 可以作为反向代理进行负载均衡的实现。
nginx可以提供的服务
web 服务.负载均衡 (反向代理)web cache(web 缓存)
nginx 的优点
高并发。静态小文件占用资源少。2万并发、10个线程,内存消耗几百M。功能种类比较多。web,cache,proxy。每一个功能都不是特别强。支持epoll模型,使得nginx可以支持高并发。nginx 配合动态服务和Apache有区别。(FASTCGI 接口)利用nginx可以对IP限速,可以限制连接数。配置简单,更灵活。
nginx是免安装的,你只需要到官网上下载对应的版本即可,小编的服务器系统是win系统,下载压缩文件到本地服务器上,解压缩,就可以看到nginx.exe文件,双击就可以打开一个nginx服务,在打开服务之前,我们需要配置一下(conf),修改nginx.conf的配置文件
server {
listen 80;# 监听80端口
server_name 39.106.000.00;#服务器的IP地址
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
proxy_pass http://127.0.0.1:5000;# 本机5000端口上的flask 服务
}
我们主要使用nginx来做反向代理,主要来监听不同浏览器进行的80或者443端口的访问,当接受到一个请求后,nginx会反向代理给配置的本地端口上,我们配置的是5000端口,然而5000端口正是我们运行的tornado托管的flask服务器,配置完成后,在nginx.exe文件夹下打开cmd命令框,输入nginx.exe,便打开了nginx服务
现在我们服务器上已经部署好了一个web服务,总结一下,主要是三个配置
1:flask python原始文件,这里主要处理网页代码以及网站数据 >>>web.py
2:tornado服务器,这里主要托管我们的flask的原始网站>>>tornadoweb.py
3:nginx反向代理服务器,这里主要监听外来ip的访问 >>>nginx.exe
ok,我们的服务都搭建完成了,输入服务器的地址与我们代码中的路由,便可以看到我们搭建的网站了
let’s try it
这里是小编的服务器地址,当然你需要注册一个域名,然后让你的域名解析到你的服务器上,就可以输入域名看到我们搭建的网站了
这里推广一下人工智能研究所出品的专栏:人工智能的检测与追踪,感兴趣的小伙伴可以探讨学习
Nginx 的https的配置
以上便是服务器端的完整部署方案,只是我们只监听了80端口,但是https监听的是443端口,我们需要修改一下nginx服務配置监听443端口
server {
listen 443 ssl;
server_name 39.106.000.00;#服务器的IP地址;
ssl_certificate cert.pem; SSL的证书
ssl_certificate_key cert.key;
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
location / {
proxy_pass http://127.0.0.1:5000;
}
}
修改后需要nginx重新reload一下,服务才能生效
在nginx的文件夹中打开cmd命令框,输入nginx -s reload
服务便可以生效
https nginx
代码调试过程中若想关闭nginx ,需要在cmd命令框中输入nginx -s quit
以上配置完成后就可以使用https來进行访问了
nginx中的证书大家可以到域名注册商哪里免费下载ssl的证书