說明
本來想用Nginx+uwsgi的方式部署Flask項目构蹬,但uwsgi在Windows環(huán)境下還需其他依賴困后,而且要修改部分文件內(nèi)容鹉梨,照著Windows 10安裝uWSGI:不可行婴程、失敗了一頓操作晋辆,最終還是失敗了G觥!瓶佳!于是嘗試使用Apache+mod_wsgi芋膘。
方案一:Apache+mod_wsgi
安裝Apache
下載Apache包
打開壓縮包,把Apache24文件夾放到C盤根目錄霸饲,即Apache的默認路徑“C:\Apache24”为朋。另外如果服務(wù)器上打開了iis要先關(guān)掉,因為iis跟Apache默認的端口都是80端口厚脉,端口沖突時會造成Apache服務(wù)無法安裝或者啟動习寸。
然后打開cmd,cd到“C:\Apache24\bin”傻工,運行“httpd –k install”安裝Apache服務(wù)霞溪,然后啟動它。(常用命令:運行服務(wù)httpd –k start中捆,停止服務(wù) httpd –k stop)
啟動后Windows的控制面板>管理工具>服務(wù)中可看到Apache2.4服務(wù)鸯匹。
打開瀏覽器,在地址欄輸入“127.0.0.1”或者“l(fā)ocalhost”泄伪,如果瀏覽器顯示的網(wǎng)頁里邊出現(xiàn)“It Works!”忽你,就說明Apache服務(wù)安裝成功。這個時候在你自己的電腦上輸入服務(wù)器的ip地址也能看到此頁面臂容。
安裝mod_wsgi
下載mod_wsgi
使用pip install命令安裝此whl文件科雳。
安裝好之后運行“mod_wsgi-express module-config”,得到三行語句脓杉,把這三行語句復(fù)制出來糟秘,后邊配置站點的時候會用到。
開始配置
創(chuàng)建wsgi入口文件
在項目文件夾中新建一個 wsgi.py文件球散,要注意里邊的application一定不能改成別的尿赚,因為mod_wsgi解析的時候只認這個東西。最簡版本的wsgi.py代碼如下所示:
import sys
Sys.path.insert(0, 'D:\path\to\project') #第二個參數(shù)為項目路徑
from test import app as application # wsgi只認這個application
在Apache中配置站點
配置httpd.conf
打開Apach安裝目錄c:\Apache24\conf\httpd.conf文件進行Apache配置蕉堰。找到有很多LoadModule的位置凌净,把之前得到的三行語句復(fù)制到里邊去,表示使用wsgi來作為Python Web服務(wù)網(wǎng)關(guān)接口屋讶。
這時候保存httpd.conf去重啟Apache服務(wù)冰寻,會發(fā)現(xiàn)Apache服務(wù)的名字變了。
找到httpd.conf文件中
LoadModule vhost_alias_module modules/mod_vhost_alias.so
皿渗、
Include conf/extra/httpd-vhosts.conf
這兩行斩芭,把前邊的“#”號注釋符刪掉轻腺,表示啟用虛擬主機并讀取httpd- vhost.conf中的虛擬主機配置來配置站點。
配置httpd-vhosts.conf
打開C:\Apache24\conf\extra\httpd-vhosts.conf文件划乖,里邊的兩個VirtualHost例子可以在每行前邊加“#”號注釋掉或者直接刪掉贬养,在最后加上下面的語句:
<VirtualHost *:80>
ServerAdmin serveradmin@yourserver.com
DocumentRoot D:\path\to\project
ServerName http://dummy-host.example.com
<Directory "D:\path\to\project">
Require all granted
Require host ip
</Directory>
WSGIScriptAlias / E:\path\to\project\wsgi.py
ErrorLog "logs/error.log"
</VirtualHost>
配置虛擬站點,配置相關(guān)的端口號琴庵,項目目錄误算,wsgi.py的路徑等
其中:
VirtualHost表示這是一個虛擬主機的配置,80指的是所用的端口為默認的80端口迷殿《瘢可以弄很多不同的 VirtualHost并使用其他端口,但是要記得去防火墻中添加對應(yīng)的端口的例外贪庙,同時在httpd.conf中查找Listen相關(guān)配置代碼段增加對 應(yīng)端口的監(jiān)聽蜘犁。
ServerAdmin是服務(wù)器管理員的電子郵箱地址。
ServerName是服務(wù)器的IP地址止邮。
Directory是對應(yīng)的項目文件夾
WSGIScriptAlias需要寫出wsgi.py文件的路徑这橙。中間那根斜杠表示url為根目錄,也就是測試該站點的地址為http://127.0.0.1或者http://localhost导披。
至此配置完成屈扎,保存httpd.conf與httpd-vhosts.conf文件,然后重啟Apache服務(wù)撩匕。每次修改配置文件之后都要重啟Apache服務(wù)鹰晨。
測試
打開瀏覽器進行測試,至此部署成功止毕!
但是模蜡!很快有新的問題出現(xiàn)了。請求某些接口時總是不能成功(本地測試可以扁凛,部署到服務(wù)器上就失斎碳病),至今沒有找到原因谨朝,待以后再探索卤妒。于是嘗試第二種方案:Nginx+Tornado
方案二:Nginx+Tornado
配置Nginx
下載Nginx包
解壓,利用cmd進入目錄后輸入:
start nginx.exe
即可啟動nginx服務(wù)器字币。啟動后在瀏覽器中輸入http://localhost會顯示nginx的歡迎畫面则披。
如果未顯示說明80端口被其它應(yīng)用占用了。
其他常用的命令有:
nginx.exe -s quit #停止服務(wù)
nginx.exe -s stop #停止服務(wù)
nginx.exe -s reload #重啟服務(wù)
將Tornado用作wsgi
使用pip install命令安裝Tornado洗出。
在項目文件夾下創(chuàng)建server.py文件并寫下如下代碼:
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)
IOLoop.current().start()
Tornado負責(zé)監(jiān)聽9900端口士复。
使用python server.py
將項目運行起來。
修改Nginx配置文件
修改nginx的配置文件nginx.conf(在解壓目錄下的conf子文件夾下):
server {
listen 80;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
root html;
index index.html index.htm;
proxy_pass http://localhost:9900;
}
....其他配置信息
}
修改location / 塊中的內(nèi)容共苛,添加一行proxy_pass判没,則將訪問localhost:80的請求全部轉(zhuǎn)發(fā)到localhost:9900端口蜓萄,也就是tornado監(jiān)聽的端口隅茎。
測試
重啟nginx服務(wù)器澄峰,輸入服務(wù)器地址進行測試。成功辟犀!且運行穩(wěn)定俏竞。
Tips
修改配置文件并重啟Nginx后,有時會出現(xiàn)無論如何都指向的是Nginx主頁面堂竟。其實是我們開啟了多個Nginx的進程魂毁,所以我們把多余的Nginx進程終止掉。
在nginx.exe的路徑下輸入命令
taskkill /fi "imagename eq nginx.exe" /f
再重新開啟Nginx:start nginx.exe
就可以訪問了出嘹。