2010年6月28日 星期一

「引用」Apache 設定筆記

出處: http://yes.dyndns.tv:84/dom/blog/apache2.htm

這邊也有更詳盡安裝教學...
apache 是個功能強大的 web server,所以它可設定調校的東西很多,一定要做個筆記紀錄下來,才不會日後想要某些功能卻不會設定。
本文環境: Linux debian 系統, apache2 版。 (apache1.3 是舊版有許多地方的設定不同不適用2版的設定方法)
以下內容,紅字部份皆為指令或是您需要修改的內容 ,藍字部份則為設定檔內容。

1.安 裝、2.設 定檔介紹、3.基 本設定、4.目 錄加密碼保護、5.IP 鎖定、6.Rewrite 功能、7.頻 寬限制、8.SSL 連線、9.Proxy 功能、10.啟 用Cache

1.安裝apache2

若你在一開始安裝未勾選apache,之後也可下指令來安裝
apt-get install apache2
↑這只是單純的安裝 apache 而已,若你需要 php 的支援,請用下面指令
apt-get install apache2 libapache2-mod-php5 php5-cli php5-common php5-cgi

2.設定檔介紹

先介紹一下 debian 內的 apache 設定檔,在 windows 平台上的 apache 設定檔,可能由 httpd.conf 就全都包了。
但 debian 將 httpd.conf 很多設定內容分離出來了。
/etc/apache2/apache2.conf    這是apache 的全域設定
/etc/apache2/httpd.conf    內容為空,傳統的設定檔,為相容於其它版本的設定
/etc/apache2/ports.conf    監聽 port 的設定
/etc/apache2/mods-available/    所有可用的模組( module)
/etc/apache2/mods-enabled/    已啟用的模組 (可用指令 a2enmod、a2dismod 來啟用、停用模組)
/etc/apache2/sites-available/    所有可用虛擬站台
/etc/apache2/sites-enabled/    己啟用的虛擬站台 (指令 a2ensite、a2dissite 可啟用、停用虛擬站台)
相關指令
啟動、停止、重啟 apache 等指令
/etc/init.d/apache2 start | stop | restart

apache 設定檔測試指令 (apache 設定檔的語法若寫錯,會使apache無法啟動,可用此指令測試)
apache2ctl configtest
/etc/rc.d/init.d/httpd start | stop | restart
↑以上是在Fedora、CentOS的指令,在debian不適用

開機就啟動的設定在
/etc/default/apache2
預設是開機啟動 (NO_START=0),不想開機啟動請改成 1



apache2.conf說明與注意事項:
(1).不是使用傳統的 httpd.conf 而以 /etc/apache2/apache2.conf 取代之。
(2).Listen 80 port位的設定也不同於一般版本的設定
在apache2.conf 此檔內有一行 Include /etc/apache2/ports.conf
vim /etc/apache2/ports.conf 加入你要監聽的port 位
(3).預設的使用者與群組
User ${APACHE_RUN_USER}
Group ${APACHE_RUN_GROUP}


apache 啟動的身份與群組,在 debian 內的身份與群組皆為 www-data

3.基本設定

系統裝好後,已有一基本站台,編輯設定檔內容
vim /etc/apache2/sites-available/default
==========================================

ServerAdmin webmaster@localhost

DocumentRoot /var/www/
#預設網站的根目錄

#重覆設定了可將它刪除

Options FollowSymLinks
AllowOverride None

#↓定義該目錄的權限

Options Indexes FollowSymLinks MultiViews
AllowOverride None
Order allow,deny
allow from all


#↓設定cgi-bin執行目錄,若你的站用不到 cgi 可將此段刪除或前面加 # 號停用
ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/

AllowOverride None
Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
Order allow,deny
Allow from all

# log 檔設定
ErrorLog /var/log/apache2/error.log
LogLevel warn
CustomLog /var/log/apache2/access.log combined

#說明檔,你應該用不著可以將它刪了吧
Alias /doc/ "/usr/share/doc/"

Options Indexes MultiViews FollowSymLinks
AllowOverride None
Order deny,allow
Deny from all
Allow from 127.0.0.0/255.0.0.0 ::1/128



==========================================
重啟 apache
/etc/init.d/apache2 restart

apache2ctl restart

4.目錄加密碼保護

要對目錄加密碼保護有兩種方法,一是直接設定在 apache 檔內。二是在該目錄底下設定一個 .htaccess 檔。底下主要介紹第二種方法。
a.編輯 apache 設定檔
vim /etc/apache2/apache2.conf
例如,我們有兩個目錄要加密碼保護,分別為 /awstats 和 /cacti
請在 apache 設定檔內加入底下內容
#底下為受密碼保護的目錄

    AllowOverride AuthConfig
    Order allow,deny
    Allow from all


    AllowOverride AuthConfig
    Order allow,deny
    Allow from all

那個紅字就是整個設定的重點
另外還要檢查 apache2.conf 設定檔內是否還有對同一目錄的設定,若有請把它加#號,否則密碼保護無法設定成功。
例如: /awstats 是對應到 /var/www/84/awstats/wwwroot 這目錄,但這目錄也有針對它的設定必須將其取消
否則密碼保護不會設定成功。
#
#    Options None
#    AllowOverride None
#    Order allow,deny
#    Allow from all
#


設完之後重啟 apache
/etc/init.d/apache2 restart


b.建密碼檔
建一密碼檔名為apache.passwd 存放在 /home/backup
htpasswd -c /home/backup/apache.passwd user1
接著輸入密碼 xxxxxxxx
在密碼檔內建第二個使用者 (不加 -c 參數了)
htpasswd /home/backup/apache.passwd user2

註:user1和user2為你自訂的使用者帳號,xxxxx為你自訂的密碼

改變檔案屬性
chown www /home/backup/apache.passwd
chgrp users /home/backup/apache.passwd


c.在要被保護的目錄下建.htaccess檔
先進到你要密碼保護的目錄底下
cd /var/www/84/awstats/wwwroot/
vim .htaccess
=====加入以下內容==================
AuthName     "This is Private directory"
Authtype     Basic
AuthUserFile
/home/backup/apache.passwd
require user
user1 user2
#require:後面接可以使用的帳號。
#如果要讓該密碼檔內的使用者都能夠登入,就改成『require valid-user』即可

===================================
改變檔案屬性
chown www .htaccess
chgrp users .htaccess
然後再把此檔copy到你要密碼保護的 另一個目錄底下去
cp .htaccess /usr/share/cacti/site

參考資料

5.IP鎖定

除了加密碼保護以外,我們也可以用鎖定IP的方式來增加安全性
例如:我有一站台目錄是指向 /var/www/syscp 這站台很重要,不能讓別人隨便進來,除了密碼保護外可能還不夠,那麼我們就可以鎖定只有哪些 IP 可以訪問這個站台。
vim /etc/apache2/sites-enabled/000-default
-----------------------------------------------

    Options Indexes FollowSymLinks MultiViews
    AllowOverride None
   
Order deny,allow
    deny from all
    allow from 192.168.0.0/24 220.130.30.39

------------------------------------------------
以上設定為鎖定 syscp 後台管理頁面,只允許192.168.0.0這個網段和這個 220.130.30.39 IP可以登入
注意: 這兩行的上下順序若是相反的
    deny from all
    allow from 192.168.0.0/24 220.130.30.39

變成底下這樣 (deny 在最後一行)
    allow from 192.168.0.0/24 220.130.30.39
    deny from all

這樣就等於是將整個關閉網站了,沒有任何人可以訪問了,因為 deny 在最後才被套用。

6.Rewrite功能

簡單介紹一下這功能,就是當點  abc.com/aa.htm 這網址進來時,可以設定讓它變成 cde.com/aa.htm 的效果
啟用 rewrite 模組
a2enmod rewrite
apache2ctl restart
rewrite 的規則可寫在 apache 設定檔內,也可寫在該目錄底下(.htaccess)。每一筆 rewrite 都會造成 apache 和 cpu 的負擔,所以 rewrite 的規則應儘量減少。
建議最好寫在該目錄底下才能減輕負載,在 user 存取該目錄時,rewrite 才會起作用。若將rewrite的規則寫在網站的根目錄,則 user 在存取站上的每一個檔案時都會去比對 rewrite 的規則,會對系統效能有所影響,這在看 rewrite 的 log 檔時可觀察到。
rewrite 規則得用正規表示法來寫
a.先介紹寫在 apache 設定檔內

RewriteLogLevel 1
#設定 rewrite log 檔的等級,預設為 0 不記錄。 設為 3 以上會降低 apache 效能

Rewritelog /var/log/apache2/80_rewrite.log
#設定 rewrite log 檔位置

RewriteEngine On
# ↑這裡若設為 off 則將 rewrite 的功能全關閉

RewriteRule /sound/(.*) http://192.168.0.1/test/sound/$1
#↑ /sound/ 底下所有的檔案全轉到後面那個網址去,最後面的那個 $1 是變數1,化表前面括號裡的東西  ( .*)  點星號代表任何檔案

RewriteRule /book/(.*) http://192.168.0.1/test/book/$1
RewriteRule ^/(.*).wmv$ http://192.168.0.1/test/$1.wmv
# ↑ 根目錄底下的 .wmv 檔全轉到後面那個網址去。  ^/ 為 斜線開頭的意思  .wmv$ 為 wmv結尾的意思。


Options Indexes
FollowSymLinks MultiViews
AllowOverride all
Order allow,deny
allow from all



b.寫在 .htaccess
好處是可以不用重啟 apache 和減輕系統的負載
vim /var/www/80/video/.htaccess
RewriteEngine On
RewriteRule (.*\.htm$) $1 [S=1]
#如果符合 *.htm 的檔案,就跳過底下第一條規則
RewriteRule (.*) http://192.168.0.1/80port/video/$1
#將所有的檔案都轉到另一個網址去下載



vim /var/www/80/flash/.htaccess
RewriteEngine On
RewriteRule (.*)\.flv$ http://192.168.0.1/80port/flash/$1.flv
#將所有的 *.flv 檔案都轉到另一個網址去下載

何時使用.htaccess中的重寫規則定義?
假如你對你的的網站內容所在的服務器沒有管理員權限,或者你的網站放在ISP的服務器上託管等等條件下,你無法改寫主配置文件,然而你可以對你的WEB站 點內容所在的目錄有寫權限,則你可以設置自己的.htaccess 文件達到同樣的目的。但你需要確定主配置文件中對你的網站所在的目錄定義了下面的內容:

Options Indexes FollowSymLinks
AllowOverride all


否則你的.htaccess不會工作。
參考資料:
設置圖片防盜連功能使 用漂亮的網址重 寫規則的常見應用

7.頻寬限制

安裝和啟用頻寬限制模組
apt-get install libapache2-mod-bw
a2enmod bw

vim /etc/apache2/sites-available/default
然後在你的虛擬站台裡加入以下參數
-------------------------------------------------

    DocumentRoot "/home/movie"
    ServerName xxx.com

    #頻寬限制
    BandWidthModule On
    ForceBandWidthModule On
    Bandwidth all 102400
    #102400 ==>100K 限制
    #MaxConnection all 10
    #限制連線數 10

       
        Options....
        ...etc
       


-------------------------------------------------
改完後記得重啟 apache
參考資料: 花栗鼠柑仔店AppleBoy
按 我展開mod_bw其它參數介紹的內容

 

8.SSL連線

debian 4 和 debian 5 的設定法有些不一樣。
debian 4 的設定法
a.安裝ssl-cert
apt-get install ssl-cert
由於 Etch (4.0) 版本未能提供慣用的 apache2-ssl-certificate 命令,因此若你的 Debian 版本是 Etch,你可以使用 make-ssl-cert 命令,安裝 ssl-cert 套件。
b.產生憑證
兩個方法,任選一種

make-ssl-cert /usr/share/ssl-cert/ssleay.cnf /etc/apache2/apache.pem
↑這會問你些問題,照回答即可,產生出來的憑證有效日期為一個月
openssl req $@ -new -x509 -days 365 -nodes -out /etc/apache2/apache.pem -keyout /etc/apache2/apache.pem
這會產生有效期限一年的RSA key,路徑可以自己決定。
接下來會有一段設定根憑證發行資訊的問題,適當的填一下就好了。
為了安全起見,請設定一下private key的權限:
# chmod 600 /etc/apache2/apache.pem
有的文章會叫你去安裝apache-ssl,不過這是apache 1.3的套件,並不適合

c.啟用 ssl module
a2enmod ssl
echo "Listen 443" >> /etc/apache2/ports.conf



然後在你的 443 虛擬站台內加上這兩行
SSLEngine on
SSLCertificateFile /etc/apache2/apache.pem

即可啟用 ssl 連線

========================================================================
範例:

NameVirtualHost *:443
NameVirtualHost *:80


ServerName earth.my.flat
DocumentRoot /var/www/
ErrorLog /var/log/apache2/error.log
CustomLog /var/log/apache2/access.log combined



ServerName earth.my.flat

DocumentRoot /var/www/
ErrorLog /var/log/apache2/error.log
CustomLog /var/log/apache2/access.log combined

SSLEngine on
SSLCertificateFile /etc/apache2/apache.pem



========================================================================
debian 5 設定方法
以下指令基於 debian 5,0 (lenny) 版環境測試成功。
啟用 ssl 模組
a2enmod ssl
啟用 ssl 虛擬站台
a2ensite default-ssl
安裝 ssl 套件
apt-get install openssl ssl-cert
重啟 apache
/etc/init.d/apache2 restart
測試
https://yourIP

補充說明:若你進入 https 網站後出現如下的錯誤訊息
SSL 收到含超出最大允許字串長度的記錄。
(錯誤碼: ssl_error_rx_record_too_long)

那表示你有可能是用 https://yourIP:port 這樣的網址進入,因為 https 預設是會導向443 port ,但你後面又指定了特殊的 port 會與 443 port 相衝突,解決方法就是把 port 移開,用  https://yourIP 這樣進入就可以了




參 考資料(英文)ssl_error_rx_record_too_long
產生一張SSL證書管理你的CA

Enable SSL on Apache 2.2 at debian





9.Proxy功能

啟用 proxy 模組
a2enmod proxy proxy_connect proxy_http
開放 proxy 權限
vim /etc/apache2/mods-available/proxy.conf
Deny from all 前標 # 號,並在其下一行加上這行文字 Allow from 127.0.0.1
這樣就能限制只有本機才能使用proxy,以提高安全性,然後在你的設定檔內加入底下這兩行
#人民報
ProxyPass /rmb http://www.renminbao.com/rmb/ smax=5 max=20

#明慧網
ProxyPass /mh http://minghui.org/mh/
ProxyPass /images http://minghui.org/images/
ProxyPass /pub http://minghui.org/pub/

#正見網
ProxyPass /zj http://zhengjian.org/zj/ smax=5 max=20
ProxyPass /news_images http://zhengjian.org/news_images/ smax=5 max=20


/etc/init.d/apache2 restart
然後用 http://192.168.0.150/rmb 就能看到別站的內容了

參考資料
Apache 的 Proxypass 指令詳解

若使用了 proxypass 之後,還要配合底下的 cache 才能減少本機向外部取資料的頻寬

10.啟用 cache

a2enmod cache
a2enmod disk_cache

vim /etc/apache2/mods-available/disk_cache.conf

CacheRoot /var/cache/apache2/mod_disk_cache
#cache 檔案的根目錄

CacheEnable disk /
#↑設定哪些目錄要做 cache
#CacheDirLevels 5
#↑定義緩存子目錄層數,缺省是1
CacheDirLength 5
#設置緩存子目錄名字的長度,缺省是1。即所有子目錄的名字都是由一個字母組成。
#↓每隔4小時檢查緩存區,如果已經超過CacheSize就刪除文件。缺省是4
#CacheGcInterval 4
#↑指定收垃圾 (Garbage Collection) 的動作間隔時間;單位是小時。不過根據 Apache2 文件,這個指令還 沒有被實作 。
#CacheDefaultExpire 86400
#cache保存時間(單位:秒) 預設為 3600 (1小時), 86400秒,為24小時
#CacheMaxExpire 154000
#cache保存最長時間(單位:秒)預設為 86400 秒(1天),若此期間都不曾被使用過,就會刪除,預設超過這時
CacheMaxFileSize 30000000
# byte, 3000 →3K, 3,000,000→3000K→3MB
#↑ 這裡設定的是,單一檔案cache的大小為 30MB

/etc/init.d/apache2 restart

參考資料:
IBM HTTP Server
apache的緩存mod_cache設置

修改httpd.conf這個文件
#一個連接的最大請求數量
MaxKeepAliveRequests 10000
#NT環境,只能配置這個參數來提供性能

#每個進程的線程數,最大1920。NT只啟動父子兩個進程,不能設置啟動多個進程
ThreadsPerChild 1900
每個子進程能夠處理的最大請求數
MaxRequestsPerChild 10000


LoadModule cache_module modules/mod_cache.so
LoadModule disk_cache_module modules/mod_disk_cache.so
LoadModule mem_cache_module modules/mod_mem_cache.so

CacheForceCompletion 100
CacheDefaultExpire 3600
CacheMaxExpire 86400
CacheLastModifiedFactor 0.1


CacheEnable disk C:/server/httpcache/diskcache
CacheRoot c:/server/httpcache/cacheroot
CacheSize 647680
CacheDirLength 4
CacheDirLevels 5
CacheGcInterval 4


CacheEnable mem C:/server/httpcache/memcache
MCacheSize 8192
MCacheMaxObjectCount 10000
MCacheMinObjectSize 1
MCacheMaxObjectSize 51200




####################################################
參考資料
mod_cache:
CacheEnable: 啟動 mod_cache,其後接兩個參數。第一個參數指定快取的種類,應設為 mem (記憶體快取) 或 disk (磁碟快取) 之其一;第二個參數指定使用快取的 URI 路徑,如果對整個網站 (或虛擬主機) 進行快取,簡單指定為根目錄(/) 即可。
CacheForceCompletion: 這個值指定當 HTTP request 被取消時,內容的產生動作要完成的百分比;預設是 60(%)。
CacheDefaultExpire: 指定快取的預設過期秒數;預設值是一小時 (3600)。
CacheMaxExpire: 指定快取最大的過期秒數;預設值是一天 (86400)。
CacheLastModifiedFactor: 用來從回應裡 Last Modified 資訊算出 expiredate。

計算方式是:
expire period (過期時距) = 最後更新後至今的時間間距 *CacheLastModifiedFactor

expire date = 目前時間 + expire period
不過無論如何,過期時間不能超過 CacheMaxExpire 的設定值。

mod_disk_cache:
CacheRoot: 指定磁碟快取所使用的目錄。
CacheSize: 以 KByte 為單位指定快取使用的磁碟空間大小。
CacheDirLength: 指定各目錄 (的鍵值) 存在於快取階層 (hierarchy) 中所使用的字元數。
CacheDirLevels: 指定快取的目錄層數; CacheDirLength 與此 CacheDirLevels設定值相乘不能超過 20。
CacheGcInterval: 指定收垃圾 (Garbage Collection) 的動作間隔時間;單位是小時。不過根據 Apache2 文件,這個指令還 沒有被實作 。
mod_mem_cache:
MCacheSize: 以 KByte 為單位指定快取使用的記憶體空間大小。
MCacheMaxObjectCount: 指定快取物件數目的最大值;預設值是 1009。
MCacheMaxObjectSize: 指定最大可快取物件的大小,單位是 Byte;預設值是10000 (Bytes)。
MCacheMinObjectSize: 指定最小可快取物件的大小,單位是 Byte;預設值是 0 (Bytes)。

【下列文章您可能也有興趣】

沒有留言: