Nginx + PHP-FPM on FreeBSD

閒著沒事幹就嘗試把 Apache 2.2 搭配 PHP-FPM 的架構轉移至 Nginx。

根據維基百科,Nginx 是一個高效率、輕量的 HTTP 伺服器,在靜態檔案的效能相當好,不過若是有處理動態網頁 (像是 PHP) 的需求,則一般透過 FastCGI 的模式執行。先前我們已經建置了 Apache + mod_fcgid 搭配 PHP-FPM 的架構,因此在這次的轉移中我們只要把 Apache 換成 Nginx 即可。

首先就是安裝 Nginx。

cd /usr/ports/www/nginx && make install

安裝 PHP-FPM 與設定的部份就不在詳述了,可以找先前的文章參考。

繼續閱讀 “Nginx + PHP-FPM on FreeBSD”

Nginx + PHP-FPM on FreeBSD

FreeBSD 建置 Apache + mod_fastcgi + php-fpm

近日在實驗 Apache 使用 FastCGI (mod_fastcgi) 搭配 PHP 提供的 PHP-FPM 網頁架構。

Apache 如果什麼都沒有動的話,應該預設是跑 prefork ,也就是預先 fork 一些子程序出來等連線,這樣的架構在大量連線的伺服器來說不是很穩定。更改編譯選項可以換成用 worker mpm 方式,如此一來 Apache 可以用 thread  的方式來執行,資源利用較有效率。

除此之外,PHP 的部份也可以改用 FastCGI 的方式來執行。

預設安裝的 mod_php5 的執行方式是由 Apache 呼叫,等待 PHP 程式執行完畢之後再一起輸出給使用者。若是使用 CGI 的方式來執行,則當 Apache 收到 PHP 執行需求的時候,會去叫起 php-cgi 這隻程式,等待其執行完畢之後再回傳結果。當然這也不是有效率的作法,因為一次只接受一個連線,若有多個連線要叫起一堆的 php-cgi。若採用 FastCGI protocol 的方式執行,php-cgi 這隻程式會成為一隻 daemon 在背景執行,隨時等待連線。

FastCGI protocol 在 Apache 裡面的實做方式有兩種,mod_fastcgi 與 mod_fcgid。前者發展較早,由 fastcgi.com 維護,fastcgi process 開起來之後會一直在後台跑,隨時接受連線;後者為 Apache 基金會自己的項目,目標是可以隨時動態增減 fastcgi process 的數量,一旦用完就殺掉,有效利用資源又不致於在 晚上 流量大的時候被打掛。關於這兩個的優劣並沒有絕對,各位可以上網搜尋相關資料。

繼續閱讀 “FreeBSD 建置 Apache + mod_fastcgi + php-fpm”

FreeBSD 建置 Apache + mod_fastcgi + php-fpm

dokuwiki 整合 minecraft 驗證系統

dokuwiki 是一套我很喜歡的迷你 wiki 系統,他的特色包括輕巧又有足夠的功能、檔案以純文字撰寫等。

因為目前所架設的 Minecraft 伺服器有採用 AuthMe 驗證系統,因為要在遊戲裡面註冊帳號實在是很麻煩,因此很早以前就寫了個網站方便更改資料、註冊帳號。但是 wiki 也需要帳號,考量到使用者編輯的需要,每次都要使用者一直註冊帳號實在是很不方便,因此就嘗試結合 dokuwiki 的認證機制,讓使用者可以使用同一組帳號密碼登入遊戲與網站。

dokuwiki 支援各種登入驗證方式,預設是採用 plaintext,也就是密碼 hash 之後存在純文字檔案中。由於 AuthMe 是採用 MySQL 作為後台,因此我們就以 mysql_class.php 這個 MySQL 範例檔案來修改。

新建一個 local.protected.php 於 conf 資料夾中,這樣設定檔才不會被自動設定蓋掉。同時從 /conf/mysql.conf.php.example 可以看到各種應該寫的 MySQL query,我建議直接改名成 mysql.conf.php 然後直接 require 到  local.protected.php 中,這樣升級時就不會被覆蓋。同時,這邊也要搭配 AuthMe 的架構,如果你有更改過資料庫欄位的命名,也要配合調整 query。

由於要自己撰寫 authentication backend,所以將 /inc/auth/mysql.class.php 複製一份,更名為  minecraft.class.php。可以將 minecraft 更改為自己喜歡的名稱,但注意於之後都要使用同樣的 class 名稱。

class auth_minecraft extends auth_basic {
//auth_mysql 改成 auth_minecraft
...
    function checkPass($user,$pass){
    //主要驗證的程式
    ...
    return $rc;
    }
}

剩下要改寫的部份其實不多,照著官網提供的資料結構與 AuthMe 給的密碼加密方式 (sha256) 就可以了。這樣就完成最基本的驗證登入,剩下的部份也都照著改寫,應該就沒有問題了。

Reference:
https://www.dokuwiki.org/auth:mysql 
https://www.dokuwiki.org/devel:authentication_backends

UPDATED 20130329:

沒想到才過沒多久,Dokuwiki 就改變驗證後台的撰寫方式了 Orz

現在是採用 Authentication Plugin 的方式撰寫,其實跟之前的方法差不多,主要就是要寫一個外掛放在後台這樣子。

詳細資源請參考 https://www.dokuwiki.org/devel:auth_plugins 

dokuwiki 整合 minecraft 驗證系統