- sudo aptitude install auto-apt checkinstall
- sudo chown YOUR_ACCOUNT /usr/local/src
- cd /usr/local/src
- wget http://ftp.stut.edu.tw/var/ftp/pub/OpenSource/apache//httpd/httpd-2.2.17.tar.gz
- tar zxvf httpd-2.2.17.tar.gz
- cd httpd-2.2.17
- auto-apt run ./configure --enable-mods-shared=most --enable-so --enable-rewrite --enable-expires --enable-cache --enable-usertrack
- make
- sudo checkinstall -D --fstrans=no
- ln -s /usr/local/apache2/bin/apachectl /etc/init.d/apachectl
- 將 /etc/init.d/apachectl 加到 /etc/rc.local 或用 udpate-rc.d 裝到 /etc/rc*.d/ 裡
安裝和設定 mod_wsgi
- 參考官網 QuickInstallationGuide, 沒什麼阻礙就順利編好
啟動、停止等操作:
- 透過 apachectl 操作, 它是一個 shell script, 最新版的很精簡, 幫忙傳參數給 httpd
- 附帶一提, 裝 Ubuntu package 的話, 操作方式變成 /etc/init.d/apache2 -> apache2ctl -> apache2, 多一層 /etc/init.d/apache2 另外包一些操作。
- httpd 或 apache2 只是編出來的名稱, 可用 --with-program-name 設定
安裝、設定的相關資訊
- ./configure --help:看有那些參數可選, 都不選也還 OK 啦
- apache2 有兩種 MPM (Multi-Processing Modules) 模式: prefork (multiple process) 或 worker (multiple thread), 預設是 prefork。Python thread 有頂頂大名的 GIL, 所以我先用 prefork 減少日後擔心的項目
- auto-apt 幫忙檢查 package dependency, 不用它也 OK
- checkinstall: 用來打包 package 檔, 之後方便管理。上述的流程會產生 httpd 的 package 檔, 並裝進去
- dpkg -L httpd 觀看裝了那些東西
- dpkg -r httpd 移除 apache2
- 用 httpd -l 觀看執行檔內編進了那些 modules, 若沒用 --enable-mods-shared=most 的話, 會編進一大堆
- 用 httpd -V 觀看預設參數, 像是 config 檔位置 (-D SERVER_CONFIG_FILE), 知道這個才有辦法開始設定
apache2 與 modules 的關係
- 官網的 DSO (dynamic shared object) 和 apxs 說明得很清楚, apache2 採用 dynamic loading 的方式載入 module, 可以讓 apache2 daemon 動態載入 modules, 不需重編 apache2 執行檔 。若 module 版號差不多, 應該是不用太在意 apache2 版本和 module 的版本對應
- 一但從原始碼編 apache2 後, 之後就要用原始碼編 module。不然裝 module package 時, 由於 package dependency 的關係, 會要求裝 apache2 的一些核心 package。雖說也可以照裝 apache2 的 package (記得要手動移掉 /etc/init.d/apache2 避免開機時啟動到舊的 apache2), 然後複製 /usr/lib/apache2/modules/ 下的東西到 /usr/local/apache2/modules/, 或直接改設定檔載入 /usr/lib/apache2/modules/。只是會編 apache2 後, 編 module 就沒那麼難了
- 可從官網 module 文件的 status 欄位了解如何取得該 module。base 表示編完 apache2 後就會放在 /usr/local/apache2/modules/ 下, 若 ./configure 時有加上 --enable (如 --enable-usertrack), 則會產生對應的設定在產生的設定檔裡。 ./configure 時沒加 enable, 之後想用 base 的 module, 就要自己找一下載入和設定的方式
- 若 status 為 extension (如 mod_ssl), apache2 官方的 module 似乎要透過重新 configure 重編的方式取得, 不確定有沒有更簡單的作法。
- third-party module (如 mod_wsgi) 會有文件說明如何用 apxs 編出 module。
apache2 的設定檔和 Debian (Ubuntu) 的 apache2 配置
- Managing Apache2 modules the Debian way 清楚的說明 Debian 配置 apache2 設定檔的方式。基本運作方式是透過預設的 /etc/apache2/apache2.conf 讀入分配好的目錄: /etc/apache2/conf.d、/etc/apache2/mods-enabled/、/etc/apache2/sites-enabled/, 來將 module 的設定和 virtualhost 的設定分散出去, 並保留 conf.d 提供其它客置需求。我覺得配得挺漂亮的。
- 為了讓整個設定保有彈性, /etc/apache2 還有下不少工夫, 像是設好 apache2ctl 和 config 檔, 將共同變數 USER、GROUP、PID_FILE 放在 /etc/apache2/envvars。雖然架構很漂亮, 當自己編 apache2 時, 硬要將原本的設定套到 Debian 配置, 只會事倍功半。另一方面我編出來的 apachectl 和原本 package 內的 apache2ctl 參數有些差異, 搞了一陣子就決定自己切 /usr/local/apache2/conf/httpd.conf 和 /usr/local/apache2/conf/conf.d/ 即可
- 這篇提到可用 ./configure --with-program-name=apache2 --enable-layout=Debian 編出類似的配置, 我試的結果的確滿像的, 不過還是湊不起來, 試一下失敗後就沒繼續弄了
php5
- 我有順便編看看 php5, 去除一堆延伸功能, 至少照網路上的教學編原始碼沒問題, 挺多遇到 mysql 錯誤: "Cannot find MySQL header files under", 照這篇說的, 裝好 libmysqlclient-dev 再編就 OK 了
- 用 checkinstall 安裝 package 時遇到 "dpkg error: trying to overwrite ...", 它嘗試覆蓋 /usr/local/apache2/conf/httpd.conf。找了一下只看到「用力覆蓋過去」的解法。也就是出現錯誤後再手動用 dpkg -i --force-overwrite php 裝。不確定之後 dpkg -r php 時, 是不是也會移除 httpd.conf。不過我的設定檔都有存在 VCS 裡, 出事的話也很容易復原
其它參考資料
沒有留言:
張貼留言