在Windows下配置apache跑fcgi程式
FastCGI程式可以用c++語言來寫,使得我們在動態生成一個網站的時候可以更加靈活,除了呼叫c++庫之外,還可以加入平臺的API,本來在linux下跑起來的fastCGI程式,沒想到移植到Windows平臺下還是會出現很多問題,當你抓破腦袋都想不出問題所在的時候,非常打擊人的。
剛開始的時候,使用預設的配置安裝apache,下一步下一步完成。用fastCGI的庫建立的程式,在apache下不能執行。檢視error.txt發現,fcgi_mod can't spown progress ....,mod_fcgi 無法執行 C:\Program。FastCGI程式一個很不好的地方就是除錯起來真的很困難,沒有辦法斷點什麼的,而且錯誤提示只能看error.txt。這個問題在專案非常緊急的時候浪費了兩天時間,最後發現,問題實在可笑。並不是apache 不能執行 C Program(不能執行C程式),而是無法執行 C:\Program !
都是路徑惹的禍。apache預設安裝目錄是在C:\Program Files\Apache2.2\。在Apache的fastCGI模組建立程序的時候,就會傳入一個fastcgi程式的路徑, 因為“Program Files”中間有個空格,後面的值都被截斷了,所以建立一個C:\Pramgram程序。當然失敗了。把apache直接安裝到C盤目錄下,問題解決。
在Windows平臺用c++寫fastCGI程式需要的fastcgi庫可以在www.fastcgi.com官網上找到,下載下來解壓,裡面有個Makefile.nt檔案,就可以用VS 的 Command Prompt找到該路徑,然後nmake Makefile.nt編譯,編譯成功後在Release資料夾會找到 libfcgi.dll 和 libfcgi.dll.manifest檔案,加上include資料夾中的標頭檔案,就可以寫fastCGI程式了。
解決了一大問題後發現,fastCGI程式執行失敗,我就想,估計是libfcgi.dll得放到程式的路徑下,或者放在系統Windows\system32\下,這時,因為用VS建立的工程,編譯通過,我除錯執行一試,無法找到msvcr80d.dll、接著是無法找到msvcp80d.dll之類的。這個是涉及到manifest檔案的問題,因為VS 的CRT庫有很多個版本,dll需要知道它要呼叫到哪個版本,這就需要manifest檔案,只是經常manifest檔案會嵌入到dll中或者程式中,所以有時不需要它,偏偏我編譯的fcgi-2.4.0庫,編譯後的輸出,除了一個libfcgi.dll外,還有一個libfcgi.dll.manifest檔案。把libfcgi.dll.manifest加入到程式的manifest
input.終於可以跑起來了!。
當我一切都做好,把fastcgi網站移植到另外一臺機,新裝的乾淨系統。卻發現又是惱人的spawn process error,用VS的自帶工具depends.exe可以檢視fastCGI程式依賴哪些dll,看到了MSVCR80.DLL 和 MSVCP80.DLL的全路徑和版本號, 發現所在系統的版本比它低,最後下載最新的執行庫,問題解決!
其實在windows Serve 2003管理工具的事件檢視器的系統欄能查到程式找不到對應版本的MSVCR80.DLL和MSVCP80.DLL的錯誤提示。一般程式啟動時找不到DLL就會立刻提示錯誤。偏偏fastCGI只會在apache的error.txt記錄下讓你難以理解的建立程序失敗。
總算成功動態生成網站。