原文章地址: EOSONES博客
如今比較流行的是Nginx + Gunicorn 的方式部署 Django 項目,但本文采用的是小眾的Windows Server和IIS方式,其中需要一個Python包wfastcgi來將進入IIS的請求移交到Python應用程序進行處理。
部署前准備
1、購買服務器
在 linux 上部署時,一般有兩種選擇。centos系統使用較多,新人可以選擇有桌面環境的ubuntu系統。學生優惠9.9 元/月購買地址:阿里雲服務器學生專區、騰訊雲服務器學生專區。本文介紹的是Windows Server 2012 R2的部署。
2、購買域名
阿里雲域名注冊地址: 域名注冊系統,根據需求購買即可
3、解析域名到服務器
域名解析前需要先將綁定到服務器:綁定域名 ,隨后解析域名:解析域名
搭建服務器
如何登錄到Windows Server: 騰訊雲登錄服實例
1、IIS安裝和配置
如何安裝IIS:騰訊雲安裝配置 IIS,配置完成后瀏覽器訪問雲服務器的公網IP查看 IIS 服務是否正常運行。
2、安裝Python
如何安裝Python:安裝Python教程,注意勾選添加到環境變量,最后在命令提示符中輸入python並按Enter鍵,檢驗是否安裝成功。
3、配置虛擬環境
使用虛擬環境便於包管理,而且避免版本沖突,方便遷移項目。python3.3版中加入了venv模塊支持原生創建虛擬環境,並在3.4版本后加入了pip包,創立並激活虛擬環境后可直接使用,官方文檔。
- 創建虛擬環境
以管理員身份運行cmd或power shell,在當前目錄創建虛擬環境(Blog_ven為自定義的虛擬環境的名稱):
>python -m venv Blog_ven
或提前建立虛擬環境的文件夾C:\virtualenv\Blog_ven,指定文件夾創建虛擬環境
> cd C:\virtualenv\Blog_ven
> python -m venv .
- 激活虛擬環境
在上面的命令提示符中,進入虛擬環境Scripts文件夾下
> cd C:\virtualenv\Blog_ven\Scripts
#激活
> activate.bat
#退出
> deactivate.bat
在激活虛擬環境之后,會在命令提示符前出現(Blog_ven),之后即可以進行pip包的安裝,否則安裝到的是全局環境下
為確保我們不會遇到pip安裝或安全問題,讓我們升級更新Python的包安裝程序,在上面的命令提示符與虛擬環境激活下,運行以下命令:
python -m pip install –upgrade pip
- 遷移項目環境
當需要將本地測試虛擬環境env轉移到另一台電腦比如服務器時,直接可將env1里的文件全部復制到env2里,雖簡單但涉及修改文件路徑。推薦使用requirements.txt方法遷移。
進入本地原虛擬環境env1:
> cd C:\virtualenv\Blog_ven1\
> pip freeze > requirements.txt
此時包依賴信息將保存在C:\virtualenv\Blog_ven1\requirements.txt文件中,注意在有些包安裝前需要依賴其他包的需要手動調整一下順序。復制requirements.txt到C:\virtualenv\Blog_ven2中
進入目的服務器虛擬環境env:
>cd C:\virtualenv\Blog_ven2\
>pip install -r requirements.txt
pip就會自動從網上下載並安裝所有包,此時虛擬環境以及完全復制到服務器,在虛擬環境激活狀態下,確保在服務器本地可運行django項目:
>cd C:\demo.eosones.com\Mybolg
>python manage.py runserver 127.0.0.1:8000
4、安裝wfastcgi模塊
為了將django項目能夠部署到IIS上需要安裝額外的一個Python包,激活虛擬環境狀態下:
>pip install wfastcgi
安裝完成后需要啟動wfastcgi
>wfastcgi-enable
這里說明安裝成功,並且得到虛擬環境python路徑及虛擬環境下wfastcgi的安裝路徑,之后要用到這兩個路徑。(如需配置多個django項目,多個項目的wfastcgi的安裝路徑需不用,即單獨項目單獨虛擬環境即可)
#已經在配置提交路徑“MACHINE/WEBROOT/APPHOST”向“MACHINE/WEBROOT/APPHOST”的“system.webServer/fastCgi”節應用了配置更改
" C:\virtualenv\Blog_ven\Scripts\python.exe|C:\virtualenv\Blog_ven\lib\site-packages\wfastcgi.py" can now be used as a FastCGI script processor
5、配置IIS和django網站
我們在Django項目的根目錄下創建一個web.config的文件,里面內容如下:(如需手動配置:手動配置教程,英語配置教程)
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<system.webServer>
<handlers>
<add name="Python FastCGI"
path="*"
verb="*"
modules="FastCgiModule"
scriptProcessor=" C:\virtualenv\Blog_ven\Scripts\python.exe|C:\virtualenv\Blog_ven\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="C:\demo.eosones.com\Mybolg" />
<add key="DJANGO_SETTINGS_MODULE" value="Mybolg.settings" />
</appSettings>
</configuration>
這里對照着自己的網站,修改三處地方替換即可
- scriptProcessor用剛才得到的路徑代替
<add key="PYTHONPATH" value="">
這里的value要定位到當前的項目根目錄(跟manage.py同目錄)<add key="DJANGO_SETTINGS_MODULE" value="" />
這里寫入app的名字
然后打開IIS管理器:打開“控制面板”在“管理工具”中打開“Internet Information Services(IIS)管理器”。選中左邊欄網站右鍵添加網站,物理地址選中項目地址
6、配置靜態文件
此時網站已經可以訪問,但CSS等靜態文件沒有訪問到,首先對我們的django項目進行靜態文件資源遷移,在項目的settings.py文件中添加:
STATIC_ROOT = os.path.join(BASE_DIR, 'static')
在項目根目錄下輸入如下命令
>python manage.py collectstatic
執行命令后會把全部用到的靜態文件復制到STATIC_ROOT這個目錄下,生產環境中還需設置 DEBUG = False,此時App中的 'django.contrib.staticfiles' 將會失效,出錯時前端不再代碼等報錯信息。
然后我們在static文件夾中添加一個web.config文件,remove name中的值必須與之前的web.config中的一致,文件內容如下:
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<system.webServer>
<handlers>
<remove name="Python FastCGI" />
</handlers>
</system.webServer>
</configuration>
此時已經配置完成,為了能夠通過域名訪問站點,項目的settings.py文件中添加ALLOWED_HOSTS = ['*'] 或者ALLOWED_HOSTS = [ '.example.com', # Allow domain and subdomains]
問題匯總(持續更新)
HTTP 錯誤 500.0 - Internal Server Error,c:\sites\myproject_env\scripts\python.exe - FastCGI 進程意外退出
- 注意路徑中是否含有中文路徑
- 測試中使用python虛擬環境包virtualenv時報錯,切換到python自帶的env后解決
- 在IIS管理器的應用池中,將默認標識
ApplicationPoolIdentity
改為最高權限的LocalSystem
HTTP 404錯誤
- 在IIS網站中添加處理程序映射的模塊映射設置將請求限值的映射選項卡的復選框取消勾選
配置錯誤:不能在此路徑中使用此配置節。如果在父級別上鎖定了該節,便會出現這種情況。鎖定是默認設置的
- 因為 IIS 7 采用了更安全的 web.config 管理機制,默認情況下會鎖住配置項不允許更改。管理員運行命令行
%windir%\system32\inetsrv\appcmd unlock config -section:system.webServer/handlers