Ubuntu 上編 apache2 + mod_wsgi 原始碼以及 module、設定的簡介

基本安裝流程
  • 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
啟動、停止等操作:
  • 透過 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 裡, 出事的話也很容易復原
其它參考資料

                    留言

                    這個網誌中的熱門文章

                    (C/C++ ) 如何在 Linux 上使用自行編譯的第三方函式庫

                    熟悉系統工具好處多多

                    virtualbox 使用 USB 裝置