在 Windows 平台部署 Flask

之前写过一篇博文:如何在 CentOS 6.5 上部署 Flask,介绍了在 Linux 上通过 nginx + uwsgi 部署 Flask 的方法。由于平时开发的时候在 Windows 平台,Flask 本身带的 web server 功能太弱,所以考虑 nginx 是否可以在 Windows 平台应用。经过在网上的查找,找到解决方案:Flask + Tornado + nginx。以下是 nginx 在 Windows 部署的方法。

下载和安装

下载地址:https://nginx.org/en/download.html,选择 Windows 版本,下载后解压缩到目标位置即可。

启动和关闭

此时,进入 nginx 安装目录,通过下面的命令:

start nginx

可以启动 nginx,由 nginx 提供 http 服务。使用

nginx -s stop

快速停止 nginx 服务。但因为并没有对 nginx 进行配置,所以没有什么实际的作用。接下来我们需要对 nginx 进行配置,让 nginx 作为 Flask 的 http 服务器。在 Linux 操作系统中,可以使用 gunicorn 或 uwsgi 作为 WSGI 服务器,但 Windows 不能使用,所以使用 tornado 充当 wsgi。

Tornado 作为 wsgi

我们用一个非常简单的 Flask 工程来进行测试, Flask 工程包含两个文件:

myflask/
    app.py
    server.py

app.py 为 Flask 程序,代码如下:

from flask import Flask
 
app = Flask(__name__)
 
@app.route('/')
def index():
    return 'hello flask'

server.py 是一段 Tornado 代码,让 Tornado 作为 wsgi 服务器:

from tornado.httpserver import HTTPServer
from tornado.wsgi import WSGIContainer
from app import app
from tornado.ioloop import IOLoop

s = HTTPServer(WSGIContainer(app))
s.listen(9900) # 监听 9900 端口
IOLoop.current().start()

然后在当前目录下通过 python server.py 可以启动 Flask 程序。Tornado 监控 9900 端口。

配置 nginx

接下来配置 nginx,当用户在浏览器中输入 http://localhost,nginx 自动转发到 9900 端口,这样就可以关联到 Tornado 充当的 WSGI 服务器。

扫描二维码关注公众号,回复: 8971034 查看本文章

nginx 的配置文件 nginx.conf 在安装目录下 conf 子文件加下,打开该文件,进行如下配置:

http {   
    server {
        listen       80;
        server_name  localhost;
        server_name  127.0.0.1;     
        charset     utf-8;           

        location / {
            root   html;
            index  index.html index.htm;
            proxy_pass  http://localhost:9900;
        }
        # other configurations
  }

配置完成后,重新启动 nginx ,当用户在浏览器中输入 http://localhost,nginx 将请求转发到 9900 端口,从而关联到我们的 Flask 程序。

将 nginx 加载 Windows 服务

通过 start nginx 启动 nginx 服务,缺点是当关闭 command 窗口,这个服务就终止了。在 Windows 操作系统中,我们可以使用 winsw 将 nginx 加载到 Windows 服务。

winsw 是一个一个开源的项目,可以将一个自定义进程包装为一个 Windows 服务,项目地址:Github,下载地址:WinSW

下载后,将 exe 文件放到 nginx.exe 相同的文件夹下,并且将 winsw.exe 改名为 nginx-service.exe。改名的目的是为了后续在服务中容易找到,并不是必须的。

然后在相同的文件夹下创建一个 nginx-service.xml 文件。文件的内容在 https://github.com/kohsuke/winsw/blob/master/doc/xmlConfigFile.md 中有说明。比如,需要配置 nginx,xml 文件的内容如下:

<service>
    <id>nginx</id>
    <name>Nginx Service</name>
    <description>Nginx Service</description>
    <logpath>C:\Programs\nginx-1.17.5\logs</logpath>
    <log mode="roll-by-size">
      <sizeThreshold>10240</sizeThreshold>
      <keepFiles>8</keepFiles>
    </log>
    <executable>C:\Programs\nginx-1.17.5\nginx.exe</executable>
    <startarguments>-p C:\Programs\nginx-1.17.5\nginx</startarguments>
    <stopexecutable>C:\Programs\nginx-1.17.5\nginx.exe</stopexecutable>
    <stoparguments>-p C:\Programs\nginx-1.17.5\nginx -s stop</stoparguments>
  </service>

另外,为了支持 .net 4.0,还需要在相同的目录下创建一个 nginx-service.exe.config 文件,注意这两个配置文件的名称是跟着 nginx-service 来的,必须相同。文件的内容是固定的,如下所示:

<configuration>
  <startup>
    <supportedRuntime version="v2.0.50727" />
    <supportedRuntime version="v4.0" />
  </startup>
  <runtime>
    <generatePublisherEvidence enabled="false"/> 
  </runtime>
</configuration>

完成配置后,在命令行窗口通过下面的命令进行安装:

nginx-service.exe install

安装之后,进入 Windows 服务,可以在服务中进行属性的设置和启动与停止的管理。

将 nginx 安装为服务的好处是可以提供持久的服务。

参考

发布了188 篇原创文章 · 获赞 136 · 访问量 43万+

猜你喜欢

转载自blog.csdn.net/stone0823/article/details/103161739