在 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 服務器。

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 安裝爲服務的好處是可以提供持久的服務。

參考

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章