剛用Python作為後台語言做了一個網站,測試伺服器是Windows的,把網站發布到這台伺服器上,可花了我好些時間。把遇到的問題在這裡作個記錄。
第一步、下載安裝Apache2.2
第二步、下載安裝Python2.7
第三步、為Apache配置wsgi模組
1、下載:http://www.lfd.uci.edu/~gohlke/pythonlibs/ 搜尋wsgi,對應好python版本
2、解壓,將mod_wsgi.so放到apache的modules目錄下
3、配置,開啟Apache目錄下的conf\httpd.conf,搜尋LoadModule位置,在後面加上
LoadModule wsgi_module modules/mod_wsgi.so
第四步、把項目拷貝到伺服器的任意目錄下,如C:\www-data\projectname ,並在conf\httpd.conf檔案中搜尋DocumentRoot位置,後面加上:
WSGIScriptAlias / "C:/www-data/projectname/application.py"
# 此處application.py要改成自己項目啟動的py檔案名稱
<Directory "C:/www-data/projectname">
Order deny,allow
Allow from all
</Directory>
這時,我到Windows的服務裡試圖啟動Apache,結果報錯說:
Windows不能從本機電腦啟動服務,請聯絡廠商什麼什麼的。。搞得我一頭霧水,後來看了一下Apache目錄下的logs,
發現報錯資訊:
can not load mod_wsgi.so
還有:ImportError: No module named site
到網上搜了一下,可能是因為Python的環境沒有配好,於是添加環境變數 PYTHONPATH,值為Python的安裝路徑,如C:\Python27
再啟動,報錯:
can not import web,因為我用到的webpy,mysqldb等外掛程式還沒有下載安裝呢。
我下載了mysqldb 的 tar格式檔案,回來解壓,想通過python setup.py install 的方式安裝,但是安裝報錯:
cannot open include file:'config-win.h': No such file or directory
怎麼辦呢?看網上的解決方案五花八門,好像都不簡單。後來,我重新下載了exe格式的mysqldb,直接運行安裝,嘿!就可以了!
我再啟動,開始報程式裡面的錯誤了,No module named url。
url 是我自己寫的Module,但明明在那個位置,它就是找不到,於是在啟動程式的application.py 頂部加上兩句:
import sys, os
sys.path.append(os.path.dirname(__file__))
再啟動,報錯說TemplateNotFound
我用的jinja2作為模板工具,八成又是路徑的問題,它找不到我的模板。於是修改代碼
render_jinja(‘/templates', encoding='utf-8')為
render_jinja(os.path.normpath(os.path.dirname(__file__) + '../templates'), encoding='utf-8')
再啟動,終於看到不報錯的頁面了。但是它直接顯示的Html代碼,而不是頁面!!
看一下回應標頭資訊:context-type: text/plain, 怎麼Apache把頁面當成文本直接返回了??網上搜了一下,大概是Apache與wsgi之間的什麼問題。。沒時間看那麼多了,不如自己在代碼裡給設定一下回應標頭好了。於是加上一段預先處理的代碼(這是webpy相關的代碼):
webapp = web.application(urls, globals())
def my_loadhook():
web.header('Content-type', "text/html; charset=utf-8")
webapp.add_processor(web.loadhook(my_loadhook))
再啟動,終於可以看到正常的頁面了,我淚流滿面啊!