0. 簡述
關於QGIS Server相關的文檔很少,我也沒有找到其源碼在哪里,所以有些問題也不知道怎么解決,只能慢慢摸索。
這里只記錄了在windows 10上安裝使用的過程,在linux下過程也差不多,但是簡單多了,很多缺失的東西可以直接命令安裝。
我這里使用了最高版本的,但是最好還是使用長期版本,沒有這么多問題。
參考:
1. 下載QGIS桌面64位版本
也可以不下載,使用OSGeo4W在線安裝程序,只安裝qgis-server但我測試這個安裝不全。我安裝是最新的3.2.3版本。

使用在線安裝的時候,下載站點最好選擇http://download.osgeo.org,這個網站下載最快。
下載地址: https://qgis.org/downloads/QGIS-OSGeo4W-3.2.3-1-Setup-x86_64.exe
安裝的時候最好不要安裝在C盤(win10下會很多地方有權限問題),安裝路徑中也最好不要有空格,原因后面會提到。
2. 下載安裝QGIS Server程序
下載地址:http://download.osgeo.org/osgeo4w/x86_64/release/qgis/qgis-server/
這里沒有找到32位版本程序的下載,只能下載64位版本。下載的版本要與桌面版本一致。
下載之后解壓到QGIS的安裝目錄即可,壓縮包內的目錄結構與QGIS安裝目錄結構是對應的。
然后復制一份httpd.d目錄下的httpd_qgis.conf.tmpl文件,改名為httpd_qgis.conf。

然后編輯這個新文件
- 將里面的
@osgeo4w@替換為QGIS的安裝目錄 - 將
@grassversion@替換為grass的版本號 - 將
@windir@替換為windows的目錄。
或者直接運行一下QGIS安裝目錄下的etc/postinstall下的qgis-server.bat腳本即可。
修改的結果大致如下:

3. 下載安裝Apache服務器
qgis server實質上是一個cgis程序,所以需要Apache服務器來調用。
Apache下載地址:https://www.apachelounge.com/download/
下載后直接解壓即可,注意不要解壓到有空格的目錄。
解壓之后修改conf目錄下在httpd.conf
首先修改最前面的SVRROOT變量值
Define SRVROOT "C:/Apache24"
ServerRoot "${SRVROOT}"
然后在最后位置,把httpd_qgis.conf包含進去
include "C:/Program Files/QGIS 3.2/httpd.d/*.conf"
因為qgis server是一個fastcgi程序,所以這里需要下載apache的fastcgi模塊
下載地址:https://www.apachelounge.com/download/
注意要下載與apache對應的版本。
下載之后解壓到apache目錄下的modules目錄下即可。
4、使用及問題處理
完成上面的步驟之后,可以啟動apache安裝目錄下的bin/httpd.exe程序了。
如果沒有報錯,則可以獲取一下GetCapabilities試試

這里我在httpd.conf中修改了端口,所以訪問的是8080端口。
Forbidden
You don't have permission to access /qgis/qgis_mapserv.fcgi.exe on this server.
這里可以看到,返回了403錯誤,這里說明這個文件是存在的,只是被apache禁止訪問了。
這里修改下apache的httpd.conf文件
<Directory />
AllowOverride none
Require all denied
</Directory>
修改為
<Directory />
AllowOverride none
Require all granted
</Directory>
或者修改httod_qgis.conf文件,添加Require all granted即可。
重啟httpd.exe后繼續測試,這時候發現返回的錯誤碼變成了503。

這時候可以打開apache的日志看看錯誤的原因。

這里可以看到,還是這個路徑中有空格的原因。
這個問題兩個解決辦法
- 一是把
qgis_mapserv.fcgi.exe程序文件復制到Apache安裝目錄下的cgi-bin目錄中,然后訪問http://127.0.0.1:8080/cgi-bin/qgis_mapserv.fcgi.exe?SERVICE=WMS&VERSION=1.3.0&REQUEST=GetCapabilities。 - 二是重新安裝qgis到沒有空格的路徑中去。
然后繼續測試,還可以遇到問題。
如下:

這個問題也很好解決,這是因為qgis_mapserv.fcgi.exe編譯的時候依賴的這些動態庫並沒有打包到里面來,需要自己去下載過來。同樣缺失的還有QtXml4.dll、QtCore4.dll、QtGui4.dll、QtNetwork4.dll、QtSvg4.dll,這些dll在QGIS2.18的安裝目錄下可以找到。我這里打包上傳一下,地址在這里qgis_mapserv.fcgi.exe-depends.7z。也可以使用OSGeo4W在線安裝程序下載。
繼續測試,這里還會碰到問題:

offscreen插件是Qt用於離屏渲染的,在Qt5.1版本才提供。
打開httpd_qgis.conf文件,可以看到在定義Qt插件路徑變量QT_PLUGIN_PATH的值的時候,里面對應路徑是qt4的,這里只需要把4改為5即可。
修改完成之后,重啟httpd.exe繼續測試。
經過上面處理之后,qgis_mapserv.fcgi.exe確實能夠被調用運行了,這個通過ProcessMinitor可以監測到調用過程。
按照網上一些資料的說法,將QGIS的工程文件xxx.qgs放入qgis_mapserv.fcgi.exe所在目錄,就可以用於提供默認的服務,不必指定map選項參數。但是我測試GetCapabilities的結果沒有成功,程序執行后返回500錯誤,也就是qgis_mapserv.fcgi.exe程序沒有正確返回對應的XML內容,在請求的時候添加map=xxx.qgs或map=xxx也都是失敗的。因為沒有相關的文檔和源碼,這個還需要繼續測試。
