之前寫過一篇博文:如何在 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 安裝爲服務的好處是可以提供持久的服務。