顯示具有 apache 標籤的文章。 顯示所有文章
顯示具有 apache 標籤的文章。 顯示所有文章

2009年5月20日 星期三

apache 的 rewrite

本篇文章節錄自Apache 重寫規則的常見應用 (rewrite)

主要記錄一下怎麼針對 *.host.com 去做 rewrite的動作


若今天要轉換www.username.domain.com的請求
到www.domain.com/username

對HTTP/1.1的請求包括一個Host: HTTP頭,我們能用下面的規則集重寫
http://www.username.domain.com/anypath 到 /home/username/anypath

Rewriteengine on
rewritecond %{HTTP_HOST} ^www\.[^.]+\.host\.com$
rewriterule ^(.+) %{HTTP_HOST}$1 [C]
rewriterule ^www\.([^.]+)\.host\.com(.*) /home/$1$2

這裡的 $1 $2 基本上就是對應前面的 ( ) 內的東西
例:$1 = username , $2 = /anypath

注:
rewritecond 條件重寫規則,當滿足上面定義的條件才會應用下面的重寫規則,
rewritecond 另有各種變量,請查閱相關文檔。

另外,可以開啟rewrite的log記錄來看一下是不是轉到莫名其妙的地方去了
可以查看:
http://w.yi.org/ftp/FAPM/apache/Apache2/zh/mod/mod_rewrite.html#rewriteloglevel
或直接加入下面二行

RewriteLog "/var/log/httpd/rewrite.log"
RewriteLogLevel 3


注意:
RewriteLogLevel指令設置重寫引擎日誌的詳細程度的級別。 默認級別0意味著不記錄,而9或更大的值意味著記錄所有的操作。

要關閉重寫引擎日誌,可以簡單地設此值為0,關閉所有的重寫操作記錄。

使用較高的Level值會使Apache服務器速度急劇下降! 重寫日誌使用大於2的Level值只用於調試!

本篇文章節錄自Apache 重寫規則的常見應用 (rewrite)

主要記錄一下怎麼針對 *.host.com 去做 rewrite的動作


若今天要轉換www.username.domain.com的請求
到www.domain.com/username

對HTTP/1.1的請求包括一個Host: HTTP頭,我們能用下面的規則集重寫
http://www.username.domain.com/anypath 到 /home/username/anypath

Rewriteengine on
rewritecond %{HTTP_HOST} ^www\.[^.]+\.host\.com$
rewriterule ^(.+) %{HTTP_HOST}$1 [C]
rewriterule ^www\.([^.]+)\.host\.com(.*) /home/$1$2

這裡的 $1 $2 基本上就是對應前面的 ( ) 內的東西
例:$1 = username , $2 = /anypath

注:
rewritecond 條件重寫規則,當滿足上面定義的條件才會應用下面的重寫規則,
rewritecond 另有各種變量,請查閱相關文檔。

另外,可以開啟rewrite的log記錄來看一下是不是轉到莫名其妙的地方去了
可以查看:
http://w.yi.org/ftp/FAPM/apache/Apache2/zh/mod/mod_rewrite.html#rewriteloglevel
或直接加入下面二行

RewriteLog "/var/log/httpd/rewrite.log"
RewriteLogLevel 3


注意:
RewriteLogLevel指令設置重寫引擎日誌的詳細程度的級別。 默認級別0意味著不記錄,而9或更大的值意味著記錄所有的操作。

要關閉重寫引擎日誌,可以簡單地設此值為0,關閉所有的重寫操作記錄。

使用較高的Level值會使Apache服務器速度急劇下降! 重寫日誌使用大於2的Level值只用於調試!

2009年5月4日 星期一

建立Mass Virtual Hosting

前面記了一篇virtual host快速設定法
裡面有提到Mass Virtual Hosting的做法,但覺得不是很清楚
於是再去找了 Hayes’s Blog 所寫的 Mass Virtual Hosting
這一篇就真的很詳細了....把內容直接做個記錄
方便往後自己要設定時,有整理過的資料可以參考

以前要新增一個 Virtual Host, 都必須寫類似以下這幾行的code在設定檔裡,
然後重啟 apache, 這樣對於架設大量 vhost 的 server 也太辛苦了

< Virtualhost 111.123.231.220 >
ServerName www.i-bbs.tw
DocumentRoot /var/www/
< /Virtualhost >

趁著伺服器下線研究了好幾個方案, 最後選擇了用 rewrite 的方法加上一些修改..

Step1 : edit /usr/local/etc/apache22/httpd.conf ,
把 mod_rewrite.so 這個 module 打開 , 然後在最低部加上



RewriteLog /var/log/rewrite_log # 自訂 log 的 path
RewriteLogLevel 0 # level 一定要設 0, 不然噴出來的 log 會擠爆硬碟 :p
RewriteEngine on
RewriteMap lowercase int:tolower
RewriteMap vhost txt:/etc/vhost.map # vhost.map 的 path
RewriteCond %{REQUEST_URI} !^/icons/
RewriteCond ${lowercase:%{SERVER_NAME}} ^(.+)$
RewriteCond ${vhost:%1} ^(/.*)$
RewriteRule ^/(.*)$ %1/$1 [L]

Step2 : edit /etc/vhost.map

#domain doc’s path
i-bbs.tw /usr/local/www/apache22/data/
www.i-bbs.tw /usr/local/www/apache22/data/www.i-bbs.tw
hayes.i-bbs.tw /usr/local/www/apache22/data/hayes.i-bbs.tw
mysql.i-bbs.tw /usr/local/www/apache22/data/phpMyAdmin

這裡有一個要注意的地方
由於我們要讓apache去讀取系統預設的/var/www以外的地方
所以得把selinux關掉(selinux的說明)
詳細做法-How to Disable SELinux
簡單來說...就是修改/etc/selinux/config 然後重開機就可以了
前面記了一篇virtual host快速設定法
裡面有提到Mass Virtual Hosting的做法,但覺得不是很清楚
於是再去找了 Hayes’s Blog 所寫的 Mass Virtual Hosting
這一篇就真的很詳細了....把內容直接做個記錄
方便往後自己要設定時,有整理過的資料可以參考

以前要新增一個 Virtual Host, 都必須寫類似以下這幾行的code在設定檔裡,
然後重啟 apache, 這樣對於架設大量 vhost 的 server 也太辛苦了

< Virtualhost 111.123.231.220 >
ServerName www.i-bbs.tw
DocumentRoot /var/www/
< /Virtualhost >

趁著伺服器下線研究了好幾個方案, 最後選擇了用 rewrite 的方法加上一些修改..

Step1 : edit /usr/local/etc/apache22/httpd.conf ,
把 mod_rewrite.so 這個 module 打開 , 然後在最低部加上



RewriteLog /var/log/rewrite_log # 自訂 log 的 path
RewriteLogLevel 0 # level 一定要設 0, 不然噴出來的 log 會擠爆硬碟 :p
RewriteEngine on
RewriteMap lowercase int:tolower
RewriteMap vhost txt:/etc/vhost.map # vhost.map 的 path
RewriteCond %{REQUEST_URI} !^/icons/
RewriteCond ${lowercase:%{SERVER_NAME}} ^(.+)$
RewriteCond ${vhost:%1} ^(/.*)$
RewriteRule ^/(.*)$ %1/$1 [L]

Step2 : edit /etc/vhost.map

#domain doc’s path
i-bbs.tw /usr/local/www/apache22/data/
www.i-bbs.tw /usr/local/www/apache22/data/www.i-bbs.tw
hayes.i-bbs.tw /usr/local/www/apache22/data/hayes.i-bbs.tw
mysql.i-bbs.tw /usr/local/www/apache22/data/phpMyAdmin

這裡有一個要注意的地方
由於我們要讓apache去讀取系統預設的/var/www以外的地方
所以得把selinux關掉(selinux的說明)
詳細做法-How to Disable SELinux
簡單來說...就是修改/etc/selinux/config 然後重開機就可以了

2009年2月5日 星期四

Apache 防止 Dos 攻擊套件

Denial of Service 可以稱為 “阻絕服務攻擊”。這個名稱也經常聽見,在很多地方都發生。
其實 Denial of Service 所傳送的請求和正常的是一樣,只是每分鐘傳送數以十計以上請求傳送至伺服器中。令伺服器每秒處理十分大量的工作。

受到這一種攻擊,輕則只有伺服器暫時停止服務。重則會把伺服器中的硬體破壞。有不少例子都是由於伺服器在同一時間處理十分大量的工作後,CPU 最後壞了。最近公司的其中一個網站受到這些不明來歷的 Denial of Service 攻擊,伺服器一直當機。
搜尋了不少網站,終於找到了一個方法。不過不知道是否可行的。所使用的是 mod_dosevasive。
雖然是第一次用,不過是否真的能夠防止就必須等到下一次受到攻擊使知道。
(雖然一裝好就有阻斷了很多IP,但是不是真的從此相安無事,就得等時間來驗證了)


1.首次下載 mod_dosevasive 1.1 版本。

2.然後解壓 mod_dosevasive_1.10.tar.gz

tar zxvf mod_dosevasive_1.10.tar.gz


3.把您的 httpd.conf 備份

4.開始安裝mod_dosevasive

Apache 1.3.x:
cd mod_dosevasive
apxs -cia mod_dosevasive.c


Apache 2.0.x:
cd mod_dosevasive
apxs -cia mod_dosevasive20.c


註:若沒安裝apxs,可執行yum provides <some_file_name>去搜尋需要的套件
例如:yum provides spxs

在這裡,要安裝的指令是yum install httpd-devel


5.修改您的 httpd.conf 加入
Apache 1.3.x:


DOSHashTableSize 3097
DOSPageCount 5
DOSSiteCount 100
DOSPageInterval 2
DOSSiteInterval 2
DOSBlockingPeriod 600


Apache 2.0.x:


DOSHashTableSize 3097
DOSPageCount 5
DOSSiteCount 100
DOSPageInterval 2
DOSSiteInterval 2
DOSBlockingPeriod 10
DOSBlockingPeriod 600



最後是在httpd.conf 當中的設定參數解釋:

DOSHashTableSize
 這是佔中您記憶體的大小。當數目越大處理越快,當您的伺服器是很多人流的,您必須加大這個數字。
DOSPageCount
 同一頁同一人時能夠在同一個時段中最多可請求幾次,超過會禁止。時段可以在 DOSPageInterval 中設定。
DOSSiteCount
 同一個網站同一人在伺服器中最多可佔有幾個 Object,超過會禁止。時段可以在 DOSSiteInterval 中設定。
DOSPageInterval
 DOSPageCount 中所計算的每一個時間區段,以秒計算。預設是 1 秒。
DOSSiteInterval
 DOSSiteCount 中所計算的每一個時間區段,以秒計算。預設是 1 秒。
DOSBlockingPeriod
 當發現疑似攻擊後暫停多久?預設是 10 秒。當發現後,使用者會接收到 403 (Forbidden) 的訊息。

以下三個參數要放在IfModule外面

DOSEmailNotify
設定接收攻擊信息的電郵地址。
例:DOSEmailNotify you@yourdomain.com

DOSSystemCommand
這是收到攻擊信息時所使用的指令。
例:DOSSystemCommand ”su - someuser -c \’/sbin/… %s …\’”
  /bin/mail -t %s (%s指的是DOSEmailNotify設定的email address)

DOSLogDir
記錄檔案設定。
例:DOSLogDir ”/var/lock/mod_dosevasive”

Denial of Service 可以稱為 “阻絕服務攻擊”。這個名稱也經常聽見,在很多地方都發生。
其實 Denial of Service 所傳送的請求和正常的是一樣,只是每分鐘傳送數以十計以上請求傳送至伺服器中。令伺服器每秒處理十分大量的工作。

受到這一種攻擊,輕則只有伺服器暫時停止服務。重則會把伺服器中的硬體破壞。有不少例子都是由於伺服器在同一時間處理十分大量的工作後,CPU 最後壞了。最近公司的其中一個網站受到這些不明來歷的 Denial of Service 攻擊,伺服器一直當機。
搜尋了不少網站,終於找到了一個方法。不過不知道是否可行的。所使用的是 mod_dosevasive。
雖然是第一次用,不過是否真的能夠防止就必須等到下一次受到攻擊使知道。
(雖然一裝好就有阻斷了很多IP,但是不是真的從此相安無事,就得等時間來驗證了)


1.首次下載 mod_dosevasive 1.1 版本。

2.然後解壓 mod_dosevasive_1.10.tar.gz

tar zxvf mod_dosevasive_1.10.tar.gz


3.把您的 httpd.conf 備份

4.開始安裝mod_dosevasive

Apache 1.3.x:
cd mod_dosevasive
apxs -cia mod_dosevasive.c


Apache 2.0.x:
cd mod_dosevasive
apxs -cia mod_dosevasive20.c


註:若沒安裝apxs,可執行yum provides <some_file_name>去搜尋需要的套件
例如:yum provides spxs

在這裡,要安裝的指令是yum install httpd-devel


5.修改您的 httpd.conf 加入
Apache 1.3.x:


DOSHashTableSize 3097
DOSPageCount 5
DOSSiteCount 100
DOSPageInterval 2
DOSSiteInterval 2
DOSBlockingPeriod 600


Apache 2.0.x:


DOSHashTableSize 3097
DOSPageCount 5
DOSSiteCount 100
DOSPageInterval 2
DOSSiteInterval 2
DOSBlockingPeriod 10
DOSBlockingPeriod 600



最後是在httpd.conf 當中的設定參數解釋:

DOSHashTableSize
 這是佔中您記憶體的大小。當數目越大處理越快,當您的伺服器是很多人流的,您必須加大這個數字。
DOSPageCount
 同一頁同一人時能夠在同一個時段中最多可請求幾次,超過會禁止。時段可以在 DOSPageInterval 中設定。
DOSSiteCount
 同一個網站同一人在伺服器中最多可佔有幾個 Object,超過會禁止。時段可以在 DOSSiteInterval 中設定。
DOSPageInterval
 DOSPageCount 中所計算的每一個時間區段,以秒計算。預設是 1 秒。
DOSSiteInterval
 DOSSiteCount 中所計算的每一個時間區段,以秒計算。預設是 1 秒。
DOSBlockingPeriod
 當發現疑似攻擊後暫停多久?預設是 10 秒。當發現後,使用者會接收到 403 (Forbidden) 的訊息。

以下三個參數要放在IfModule外面

DOSEmailNotify
設定接收攻擊信息的電郵地址。
例:DOSEmailNotify you@yourdomain.com

DOSSystemCommand
這是收到攻擊信息時所使用的指令。
例:DOSSystemCommand ”su - someuser -c \’/sbin/… %s …\’”
  /bin/mail -t %s (%s指的是DOSEmailNotify設定的email address)

DOSLogDir
記錄檔案設定。
例:DOSLogDir ”/var/lock/mod_dosevasive”

2008年12月16日 星期二

Apache的PreFork MPM功能

轉載自Apache的PreFork MPM功能


Apache, 用了很久, 但的確沒有好好研究過有關於 performance tuning 這塊. 事實上, 這個免費的 web server 功能真的十分強大, 尤其是可以載入的模組也多, 在使用上, 真的有許多沒有深入研究就學不到的內容.

首先我們來看有關於 MPM 的一些資料:
http://dz.adj.idv.tw/archiver/tid-214.html

在 MPM中, prefork 及 worker 是兩種不同的 multi-processing module, 在 apache 管方網站上分別有對這兩個 module 有深入的介紹:
http://httpd.apache.org/docs/2.0/mod/prefork.html
http://httpd.apache.org/docs/2.0/mod/prefork.html
這二者只能擇其一來使用, 一般來說, 雖然 prefork 比較佔用記憶體, 但相容性及穩定性較佳, 也是在 FreeBSD 下安裝 Apache 的預設 MPM module.

事實上, 預設的 prefork mpm 參數如下:

<ifmodule>
StartServers 5
MinSpareServers 5
MaxSpareServers 10
MaxClients 150
MaxRequestsPerChild 0
</ifmodule>



其中一項重要的參數 ServerLimit 並未設置, 預設是 256, 也就是最多僅使用了 256個 worker, 所以透過 /server-status 看到的 . 只會有 256 個, 而預設的 MaxClients 也只有 150 個, 代表著 256 個 worker 最多同時僅 150 上線工作. 這是預設的狀況.

接下來我們可以先來了解一下 prefork 這些參數的意義, 這些 xxxServers 雖然叫 Server, 但其實就是 /server-status 中所稱的 worker, 所以 StartServers 代表起始要發起的 worker, 而 MinSpareServers 及 MaxSpareServers 分別代表至少及至多個 spare (預備)的 worker, MaxClients 則是指最多同時服務的 worker, 最後的 MaxRequestsPerChild 指的是這些 worker (雖然參數是 Child)在服務多少個 Request 後就要 reset (可以達到減少若程式上有 leak 問題的發生).

所以在 prefork 的 MPM 設計下, 若要提高同時服務的上限時, 可以直接調整 MaxClients 即可, 但若是要超過 256 個時, 就要設定 ServerLimit, 將允許同時發起的 worker 數, 提高, 而 MaxClients 設置 <= ServerLimit, 例如下面是一個設置的例子:


<ifmodule>
ServerLimit 1024
StartServers 128
MinSpareServers 16
MaxSpareServers 64
MaxClients 1024
MaxRequestsPerChild 0
</ifmodule>

再進行 Apache 的停止, 啟動(注意, 一定是要停止, 啟動, 若是用 restart apache不會重新 allocation servers), 再觀察 /server-status 時, 就可以發現 apache 準備好 1024 個總 worker slot, 一開始起動 128 個 worker, 如此一來便能提高 web server 的效能及吞吐量了.

轉載自Apache的PreFork MPM功能


Apache, 用了很久, 但的確沒有好好研究過有關於 performance tuning 這塊. 事實上, 這個免費的 web server 功能真的十分強大, 尤其是可以載入的模組也多, 在使用上, 真的有許多沒有深入研究就學不到的內容.

首先我們來看有關於 MPM 的一些資料:
http://dz.adj.idv.tw/archiver/tid-214.html

在 MPM中, prefork 及 worker 是兩種不同的 multi-processing module, 在 apache 管方網站上分別有對這兩個 module 有深入的介紹:
http://httpd.apache.org/docs/2.0/mod/prefork.html
http://httpd.apache.org/docs/2.0/mod/prefork.html
這二者只能擇其一來使用, 一般來說, 雖然 prefork 比較佔用記憶體, 但相容性及穩定性較佳, 也是在 FreeBSD 下安裝 Apache 的預設 MPM module.

事實上, 預設的 prefork mpm 參數如下:

<ifmodule>
StartServers 5
MinSpareServers 5
MaxSpareServers 10
MaxClients 150
MaxRequestsPerChild 0
</ifmodule>



其中一項重要的參數 ServerLimit 並未設置, 預設是 256, 也就是最多僅使用了 256個 worker, 所以透過 /server-status 看到的 . 只會有 256 個, 而預設的 MaxClients 也只有 150 個, 代表著 256 個 worker 最多同時僅 150 上線工作. 這是預設的狀況.

接下來我們可以先來了解一下 prefork 這些參數的意義, 這些 xxxServers 雖然叫 Server, 但其實就是 /server-status 中所稱的 worker, 所以 StartServers 代表起始要發起的 worker, 而 MinSpareServers 及 MaxSpareServers 分別代表至少及至多個 spare (預備)的 worker, MaxClients 則是指最多同時服務的 worker, 最後的 MaxRequestsPerChild 指的是這些 worker (雖然參數是 Child)在服務多少個 Request 後就要 reset (可以達到減少若程式上有 leak 問題的發生).

所以在 prefork 的 MPM 設計下, 若要提高同時服務的上限時, 可以直接調整 MaxClients 即可, 但若是要超過 256 個時, 就要設定 ServerLimit, 將允許同時發起的 worker 數, 提高, 而 MaxClients 設置 <= ServerLimit, 例如下面是一個設置的例子:


<ifmodule>
ServerLimit 1024
StartServers 128
MinSpareServers 16
MaxSpareServers 64
MaxClients 1024
MaxRequestsPerChild 0
</ifmodule>

再進行 Apache 的停止, 啟動(注意, 一定是要停止, 啟動, 若是用 restart apache不會重新 allocation servers), 再觀察 /server-status 時, 就可以發現 apache 準備好 1024 個總 worker slot, 一開始起動 128 個 worker, 如此一來便能提高 web server 的效能及吞吐量了.

2008年1月23日 星期三

apache vhost 最快速設法

無法查看此摘要。請 按這裡查看文章。 無法查看此摘要。請 按這裡查看文章。