在cpanel/WHM的centos主機上灌php的memcached擴展

如果運氣好的話,用下方的指令就可以搞定了。
yum install php php-pecl-memcache

直接用yum install安裝,有時候會因為repo的問題而裝不起來。所以用tarball來裝,反而快。

Step 1 – 下載memcache
mkdir repo
cd repo
wget  http://pecl.php.net/get/memcache-3.0.6.tgz
tar -xvfz memcache-3.0.6.tgz

Step 2 – 編繹 & 安裝
cd memcache-3.0.6
phpize

這時候,應該會看到類似的訊息:
Configuring for:
PHP Api Version: 20041225
Zend Module Api No: 20060613
Zend Extension Api No: 220060519
./configure
make
make install

Step 3 – 修改php.ini
在php中,啟用memcache
echo "extension=memcache.so" >> /usr/local/lib/php.ini
service httpd restart

如果要創業,需要先考慮租虛擬主機嗎?

從統計來講,新創的公司90%活不過3年,這往往是成本控管的問題。由於,身為主機商的我也常被問這個問題:「如果要創業,需要先考慮租虛擬主機嗎?」

在此也提供我的觀點。我的觀點的核心思考,是先有盈餘再考慮投資。
(1) 最初期可以考慮不租用主機,買域名就好。域名一個價位約在台幣400塊一年,算是容易負擔得起的價位。有了自己的獨立域名,也可以用這個域名,設定轉址,指向自己在露天、雅虎的商城,或是自己的blog。

(2) 對於傳統產業
如果是賣衣服、鞋子、百貨等等的線上商店,且商品沒有違反善良風俗,也就是說:在露天、雅虎等線上商城都可以上架,那其實大可以把主機的費用先省下來,先用免費的就好。 門面固然重要,但是也可以不急於一時。等到線上商店起步一兩年後,已經有一定的營收時,例如,每年營收100萬。這時候,可以開始考慮逐步引入虛擬主機。初期的話,由於unethost提供的主機是無限流量的,可以考慮先租來做為圖床使用。中後期,則可以考慮在租用的空間裡,發展自己的帳務系統、進銷存系統、購物車等。

(3) 對於科技資訊業
一般而言, 科技資訊業本身的員工,對於網站有一定的維護能力,不一定需要租用虛擬主機。然而這時候,可以考慮成本和穩定性。舉個例子,租用虛擬主機之後,由於公司對外網站,是架在主機商的共用伺服器中,如此就避免了架在公司內部電腦,常有的停電、中毒等因素,造成的網站停擺。

最初期,可以考慮先只購買域名。等到公司對外網站逐步發展到一定的規模時,例如:每天上站人數1000人、或是說,每天有大量的檔案下載,這時就可以考慮換成租用虛擬主機。

(4) 對於內容文化產業
這個行業的特色是,一方面賣的商品,算是虛擬的商品( 影片、文字等),所以對網站的需求比較高,另一方面,這個行業的核心,並不是資訊處理。也就是說,從事這個行業的人員,通常不會有高水準的IT素養。在這樣子的現實之下,儘早租用主機,把非核心的網站架設交給主機商。等到論壇/blog等程式架好了之後,再來自己維護。該外包的外包,業主本身專心於本業,算是比較經濟的作法。

 

延伸閱讀: 如何取網域名稱?可以幫助seo的優化嗎?

apache mod_security關閉單一網域

有一些程式,例如Ecshop,遇到apache mod_security這個模組,ecshop的舊版本,會有不相容的情況。這種時候,如果客戶不願意升級,我必須採取的處理方式,就是針對該客戶的單一網域,關閉apache mod_security

要針對單一網域關閉apache的mod_security,根據我的測試,無法使用.htaccess檔來做,會當掉。一定要直接把相關的指令,寫在apache的config檔裡。而cpanel/WHM的apache config檔,是配合GUI自動生成的,不能隨便修改。所以這個改法,必須考慮cpanel的檔案配置。方法如下:

mkdir -p /usr/local/apache/conf/userdata/std/2/username/domain.com

然後生成檔案:

/usr/local/apache/conf/userdata/std/2/username/domain.com/mod_security.conf

在這個檔案中,加入:

<IfModule mod_security2.c> SecRuleEngine Off </IfModule>

存檔

然後,執行:

/scripts/ensure_vhost_includes --user=username

其中,username是cpanel的使用者名稱,而domain.com是網域名稱。

msn對話重新編排

常常遇到一種情境,需要把msn的對話記錄,截取下來做為資料。

典型的MSN對話長成這樣子:

21/8/2012 PM 3:22:52 http://unethost.com QQ 其實我是希望你‧‧‧
21/8/2012 PM 3:23:13 http://unethost.com QQ 我們公司的購物車系統,叫做WHMCS 
21/8/2012 PM 3:23:21 http://unethost.com QQ 我有找到免費的影片教學 
21/8/2012 PM 3:23:30 http://unethost.com QQ 但是,這個影片教學是4.0版的

這樣子的資料,如果直接貼上的話,因為前面的日期/時間/使用者名稱太多了,造成閱讀者的困難,所以比較細心的作法,應該要改成這樣子:

我:其實我是希望你直接以錄製的方式來做 
我:我們公司的購物車系統,叫做WHMCS 
我:國外有這個的影片教學 
我:但是,這個影片教學是4.0版的

這個修改,把日期/使用者取代掉,是很容易的,因為pattern是固定的。然而,如果要取代掉幾點幾分,這個時間的部分時,就困難多了,因為pattern是不固定的。時間會一直變動。

以這個例子裡,要取代掉時間的話,需要用到正規表示法(regular expressions),以geany為例子的話,就是先按下ctrl +H 。出現「取代的視窗」,在Search for這邊填上[0-9]:[0-9][0-9]:[0-9][0-9],並且勾選 Use regualr expressions,在Replace All這邊,按下 In Document。這樣子就可以一口氣消去所有的時間。

減少垃圾信的技巧

一般而言,只要把Email信箱公佈在web之後,由於網路上會有很多的掃名單機器人,不停地爬網頁,網頁上的email信箱很自然就會被列入廣告信的名單。

如果要避免因為公布email而收到垃圾信,其實是有方法的。其中一種方法,就是利用機器人看不懂「圖檔」的特性而設計的。將機器人可以讀的email address轉換成圖檔,再放到網站上。

要找這種轉換器,英文的關鍵字是Email icon generator。下方提供操作方法。

  1. 請先連到:http://services.nexodyne.com/email/
  2. 在”Enter your e-mail address:”中填入您的e-mail帳號
  3. 在@後方的下拉選單選好你的E-Mail是哪一家廠商提供的。
  4. 按下”Generate”後,就會產生資料

而產生出來的範本圖檔就像這樣子:

什麼是mod_evasive?

mod_evasive是Apache伺服器的一個第三方模組,可以回避HTTP DoS或DDoS攻擊。它在設計上,是網路檢測和網絡管理工具, 可以很容易地配置與iptables以及諸如此類的防火牆模組溝通。 mod_evasive可以透過電子郵件或syslog程序來回報網路檢測 的結果。

工作原理
通過建立內部動態的IP地址和URI hash表,如果下列的任一條件滿足,就會阻擋某一IP地址對網站的存取:
(1) 對同一網頁每秒超過某個次數的請求。
(2 )每秒針對同一個apache的子程序,送出超過50個請求。
(3) 當某個IP地址被暫時列入黑名單時,依然送出請求。

mod_evasive對於單一伺服器的腳本攻擊或是分布式攻擊,都相當有效。然而就和其它迴避的方法一樣,如果伺服器的頻寬或 是記憶体已經被攻擊的流量佔用,伺服器依然會變慢。所以使用mod_evasive時,將其與iptables這類的防火牆整合,可以更有效地發揮它的功效。

這個模塊會在每個apache子程序中,產生獨立的監聽者(listener),因此mod_evasive有內建的記憶体清理機制和縮放 (scaling)的能力。由於這種在每一個apache子程序中獨立計算攻擊的機制,正常的http請求,幾乎不會被誤判為攻擊。只有 腳本攻擊會被判定為攻擊。就算正在瀏覽網頁的使用者,不停地按F5,使網頁重新載入,也不會被mod_evasive誤判為攻擊。

如何安裝:
(1) 下載
(2) tar zxvf  mod_evasive_1.10.1.tar.gz
(3) cd mod_evasive_1.10.1
(4) ./configure
(5) make && make install
(6) 重新啟動 apache

接下來,是設定檔的部分:

APACHE v1.3
   -----------
   <IfModule mod_evasive.c>
       DOSHashTableSize    3097
       DOSPageCount        2
       DOSSiteCount        50
       DOSPageInterval     1
       DOSSiteInterval     1
       DOSBlockingPeriod   10
   </IfModule>
APACHE v2.0
   -----------
   <IfModule mod_evasive20.c>
       DOSHashTableSize    3097
       DOSPageCount        2
       DOSSiteCount        50
       DOSPageInterval     1
       DOSSiteInterval     1
       DOSBlockingPeriod   10
   </IfModule>

根據敝公司的實務經驗,調節上述的參數,對於阻擋的效果,並沒有很大的影響。但是,有兩點需要特別注意:
(1) apache的keep-alive要設定為true, 否則,mod_evasive的效果會很差。
(2) 安裝完畢之後,務必使用mod_evasive隨安裝包附的 test.pl 程式,來驗証是否mod_evasive被正確的設定了。

附註:防禦DDoS是很複雜困難的技術,如果mod_evasive你無法獨立安裝,或是你安裝了mod_evasive還是無法解決DDoS的問題,請你參考unethost的WAF解決方案

php指定對外連線使用的IP位置

一般而言,主機商的主機,不會只有一個IP位置。通常會有超過一個,以備不時之需。然而,由於網路上的有些服務,常會鎖IP,所以透過php去存取遠端的網站時,有時候就必須考慮這個對外連線使用的IP位置。

使用ifconfig指令,通常eth0上附加的這個ip就是預設的對外連線用IP(outgoing IP address)。由於使用者登入主機時,是一般user,無法使用ifconfig。所以要用其它方法來判斷。其中一種方式是curl。下面這個指令就可以得到系統預設對外主動連線時所使用的IP了。

curl -s ip.appspot.com

而,如果對外是透過php去存取遠端的資料,又必須指定php一定要透過某個網路介面/IP address來連線的話,可以考慮使用php curl library。範例的code如下:

<?
$url = “http://www.google.com”
$curlh = curl_init($url);
curl_setopt($curlh, CURLOPT_USERAGENT, $uagent);
curl_setopt($curlh, CURLOPT_INTERFACE, “888.888.888.888“);
curl_setopt($curlh, CURLOPT_RETURNTRANSFER, true);
$result = curl_exec($curlh);

echo $result;
?>

其中,”888.888.888.888″,就是要被指定用對外連線用的IP位置。

利用lftp來做資料的備分

lftp本來是linux下才能用的程式,通常我們是推荐客戶使用filezilla這種有GUI的,比較容易學習。不過,由於lftp有一些特性,例如說mirror,讓我們覺得,還是推一下它吧。

在centOS linux下安裝:

安裝lftp前要先增加CentOS官方認可的rpmforge這家的repo。
rpm –import http://apt.sw.be/RPM-GPG-KEY.dag.txt

i386系統
rpm -ihv http://apt.sw.be/redhat/el5/en/i386/rpmforge/RPMS/rpmforge-release-0.5.2-2.el5.rf.i386.rpm
x86_64系統
rpm -ihv http://apt.sw.be/redhat/el5/en/x86_64/rpmforge/RPMS/rpmforge-release-0.5.2-2.el5.rf.x86_64.rpm

最後下yum install -y lftp就可以完成安裝。

在windows XP下安裝:

由於通常需要處理Cygwin的問題,比較麻煩。也因此,我們此處提供一個懶人包,是已經打包好Cygwin的lftp zip檔,解開資料夾就可以用了。要用的時候,滑鼠去點mirror.bat這個執行檔。而mirror.txt則是用來給lftp用的command。這個mirror.txt請用記事本修改。

Lftp的常用指令教學:

(1) 登入ftp
lftp 用戶名稱:密碼@ftp地址:通訊端口(預設值21)
或是
open -u 用戶名稱, 密碼 -p 通訊端口 ftp地址

(2) 在本機端的目錄裡移動
lcd 本機電腦的資料夾
// 註:lftp的指令命名原則是,如果命令是L開頭,指的就是local,即本機電腦的操作。所以cd就是對應ftp站的操作。

(3) 從ftp站上,把某一資料夾連同子資料完整地全部抓下來。
mirror 欲下載的目錄

(4) 從本機端,把某一資料夾連同子資料完整地全部傳上去。
mirror -R 欲上傳的目錄

(5) 從ftp站上,把某一資料夾連同子資料完整地全部抓下來,並且,若本地端有遠端沒有的檔案,則把這些多餘的檔案刪除。
mirror -e   欲下載的目錄

Lftp的完整指令,可以查linux的man page,這邊有,不過是英文的。

cpanel主機下,設定不同的帳戶可以共用資料夾

收到了客戶的要求,希望在他所租用的獨立主機下的二個account,A和B,有共用的資料夾。也就是說:

/home/A/public_html/share
/home/B/public_html/share
這兩個資料夾,是指到同一個位置。

本來我以為,只要用ln -s來建softlink,就可以把問題解決了。結果卻失敗了,softlink所在的那個帳戶,用ftp登入後,看不到share這個資料夾。這是為什麼呢?原因是在這邊,它寫說,symbolic link只能指向「正確的」的地方。使用者的ftp帳戶基本上是一個被chroot的環境,所以當然不能去看到別的使用者的檔案。

A symbolic link is a pointer to the “right” file. But if that original file is outside the jail then you can’t access it. This is the goal of a jail. Otherwise a normal user could create a symbolic link in the jail to/etc/passwd and just read it. What a security risk!

So jailed is jailed. Probably a hard link will do the job, as this is a “copy without duplicating the used size”. And for the FTP server it is like a normal file (with all the problems).

那麼,這樣的問題該如何處理呢?用 mount –bind來處理吧。這個是正確的作法。

mkdir /home/website/files/
mount –bind /home/shared/files /home/website/files/

像這樣子的作法,shared這個使用者ftp登入後,就看得到 website這個使用者的資料夾files了。因為 /home/shared/files 和 /home/website/files是同一個資料夾。

如何安裝perl的模組(module)

這幾天在debug時,發現原來bug的來源是因為有perl的模組沒有裝好,於是我們就來研究一下安裝perl module的方法吧。

(1) 先檢查,現在系統裝了那些perl的模組:
先打指令instmodsh,再打l,這樣就會列出系統中的perl modules了。

[root@proxy vhost]# instmodsh
Available commands are:
l – List all installed modules
m <module> – Select a module
q – Quit the program
cmd? l
Installed modules are:
Class::Loader
Crypt::Random
Digest::SHA
Digest::SHA::PurePerl
IPC::SysV
Math::Pari
Net::IP::Match::Regexp
Perl

(2) 來安裝模組吧:

A) 首先啟動 CPAN Shell:
# perl -MCPAN -e shell

B) 在CPAN Shell的環境下,安裝 perl module,以模組IPC::SharedMem為例子
# cpan> install IPC::SharedMem

參考資料:
(1) http://www.cyberciti.biz/faq/how-do-i-find-out-what-perl-modules-already-installed-on-my-system/
(2) http://www.cyberciti.biz/faq/how-do-i-install-a-perl-module/