緣起
使用django開發了一個項目,客戶的技術體系是全棧window的,所以要求我們提供把項目部署到windows服務器的服務。
寫這個原因是舊的在 windows 上運行python網站程序的文檔,基本上全過時了。
從macOS登陸windows服務器
嗯,需要安裝 Microsoft Remote Desktop,版本是 8.0.x。需要注意的是微軟官網的下載鏈接是直接鏈接到app store,而該App在中國區不上架,所以下載不了。最后解決問題是同事在網上找到了個下載版。
登陸的時候,還有一個要注意的就是在配置的session那里勾選Connect to admin session。也許只是用Administrator賬號登陸的話才需要,我沒試其它賬號。
注:MS Office 2011 for Mac 自帶的那個RDC不行了,版本2.1.x的,一登陸就證書不對之類的,是登陸不上去的。
安裝 Python
這個很容易,直接在python官網下載就行,我下載的是64位的版本,因為是64位的機器,需要往下拉一下頁面才能找到,直接點Download按鈕下載的是32位的。
安裝的時候,有兩個地方要特別注意,一是要勾選Add to PATH,二是一定要把它安裝到沒有空格的路徑下,比如c:/python36,不要使用默認的c:/Program files/python36,你在后面會被折騰死,我不會告訴你我浪費了一天的時間,最后重裝python解決的。
安裝 wfastcgi
在windows上跑django或其它python網站程序,用IIS是最正確的,使用 apache/nginx會更加難管理。但是IIS不支持wsgi,而django自1.7起就棄用了fastcgi,在1.9的時候更是刪除了,所以我們編寫的網站程序無法直接跑在IIS上,因為我們用的是1.11版本,太新了。
wfastcgi是當前唯一、唯一、唯一可用可靠的把wsgi橋接到fastcgi的方案,之前花好幾天看到的,基本上都過時了,那些基本django1.2/1.4版本寫的文章,丟掉吧,別看了,完全沒有用處。github上有個django-windows-tools的項目,也過時了,七八年前的了,別看了;也有一篇相關的文章,Installing Django on IIS: A Step-by-Step Tutorial流毒甚廣,別看了。那些帶有PyISAPIe、isapie-wsgi字樣的,統統都不靠譜,見到就閃吧。
wfastcgi感覺生命力會長久一些,因為它其實出自微軟自身,根正苗紅,也有Azure云計算的需要。開發它的團隊是Python Tools for Visual Studio的那幫人,實力強勁。
安裝好python以后,開個Power Shell新窗口,運行pip install wfastcgi就可以安裝成功了。然后再運行一下wfastcgi-enable命令啟用它即可,成功運行后,會輸出一個目錄,告訴你可以把它加到配置文件(稍后講)。
安裝 git
當然了,首先要把項目的代碼 clone 到本地。需要安裝git,具體用法就不說了。不過安裝的時候,有一個很重要的點,就是問你要使用哪個加密庫。默認是使用 OpenSSL,我是原生黨,所以改選了使用有windows native字樣的那個,結果后來使用 git 的時候,驗證賬號密碼一直出錯,坑死爹爹了。切記這里不要亂選了。
在這里說一下題外話,安裝git的時候,可以把跟Cygwin相關的選項取消掉,使用GOW即可,非常好用,基本上常用的命令都有了,安裝GOW之后,在Power Shell中用起來感覺跟在macOS的終端下的體驗有得一拼。官網:https://github.com/bmatzelle/gow ,支持的命令列表:https://github.com/bmatzelle/gow/wiki/executables_list 。
代碼一定要用 manager.py runserver本地跑一下啦,只要依賴的包裝好了,一般而言是沒有問題的。然后可以進入下一步。
配置 web.config
在IIS中新建一個網站,把域名分配過去就好。然后在manager.py的同級目錄新建一個文本文件web.config,里面的內容有個模板可以套:
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<system.webServer>
<handlers>
<add name="Python FastCGI"
path="*"
verb="*"
modules="FastCgiModule"
scriptProcessor="<Path to Python>/python.exe|<Path to Python>/lib/site-packages/wfastcgi.py"
resourceType="Unspecified"
requireAccess="Script"/>
</handlers>
</system.webServer>
<appSettings>
<add key="WSGI_HANDLER" value="django.core.wsgi.get_wsgi_application()" />
<add key="PYTHONPATH" value="<Path to Django App>" />
<add key="DJANGO_SETTINGS_MODULE" value="<Django App>.settings" />
</appSettings>
</configuration>
scriptProcessor的值,要改為前文說過的運行wfastcgi輸出的那個值。PYTHONPATH的value要改為manager.py的那個目錄,也就是你項目的根目錄。DJANGO_SETTINGS_MODULE的value中的<Django App>要改為你的項目名。
然后重啟一下你的網站,域名沒有錯的話,應該就可以訪問了。
嗯,就是這么簡單,這么霸道。但我不會告訴你我找資料的那240個小時的。
如果你看到頁面沒有css樣式了,應該是找不到靜態文件,執行一下manager.py collectstatic應該就好了。
另外,為了讓靜態文件的處理不經過Python這一層,建議往static和media目錄下各放一個web.config文件,內容都是:

記得如果你改過最前面的web.config文件中的name值,這里也要對應。這樣就可以在獲取靜態文件的時候快一點了。
參考:
https://pypi.python.org/pypi/wfastcgi
http://kronoskoders.logdown.com/posts/1074588-running-a-django-app-on-windows-iis