之前写过一篇博文:如何在 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 服务器。
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 安装为服务的好处是可以提供持久的服务。