Apache2.4配置(全)

Apache2.4配置(全)

1、apache開機自啟動

[[email protected] ~]# cp `which apachectl` /etc/init.d/httpd
[[email protected] ~]# vim /etc/init.d/httpd 在#!/bin/bash下加入:(前面需要'#')
# chkconfig: 2345 85 15
# description: httpd2.4...
[[email protected] ~]# chkconfig --add /etc/init.d/httpd
[[email protected] ~]# chkconfig --list httpd
httpd    0:off  1:off   2:on    3:on    4:on    5:on    6:off
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

2、配置多個虛擬主機:基於域名、IP、PORT

很多時候你想在一臺機器上跑多個網站,比如一個跑discuz、一個跑wordpress、一個跑其他網站...
這時候你就要需要開啟apache的虛擬主機配置了。
前面幾篇實際上有介紹過這個了,這裡還是重新講下吧:
第一步:編輯httpd.conf將vhost的註釋去掉(去掉'#')
# Include conf/extra/httpd-vhosts.conf
第二步:開始配置虛擬主機
[[email protected] ~]# vim /usr/local/apache2/conf/extra/httpd-vhosts.conf
# 基於域名的
<VirtualHost *:80>
DocumentRoot "/data/www" # 指定你的web根目錄
ServerName www.csr.com # 配置多個的時候改這裡即可
</VirtualHost>
# 基於IP的
<VirtualHost 192.168.137.22:80>
DocumentRoot "/data/www1"
ServerName www.csr.com
</VirtualHost>
# 基於PORT的,只是這個還必須編輯httpd.conf加入:Listen 8080
<VirtualHost *:8080>
DocumentRoot "/data/www2"
ServerName www.csr.com
</VirtualHost>
對於http,預設埠是80,如果是基於埠的,使用者每次請求還需要輸入port,而且很多使用者甚至不懂的怎麼做,所以這種方法不常用; 
基於ip的,現如今ip地址緊缺,使用基於ip也並不是什麼好方法; 
所以最常用的就是這個基於域名的虛擬主機了(申請一個域名相對與ip來說一般還是便宜很多的)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27

3、配置域名跳轉

因為各種原因,你換了個域名;但你的老顧客並不知道或者並不想記你的新域名,這時候就可以通過域名跳轉將其跳轉到你的新域名了。
[[email protected] ~]# vim /usr/local/apache2/conf/extra/httpd-vhosts.conf
<VirtualHost *:80>
DocumentRoot "/data/www"
ServerName www.csrnew.com # 新域名
ServerAlias www.csr.com # 別名(老域名)
# 方法一:開啟rewrite,但會降低效率
# mod_rewrite應該是最後手段,除非沒有其他方法,否則不要輕易使用它(這句來自Apache2.4官方文件翻譯的)
# 首先還得開啟rewrite_module模組
[[email protected] ~]# vim /usr/local/apache2/conf/httpd.conf 去掉註釋
#LoadModule rewrite_module modules/mod_rewrite.so
[[email protected] ~]# apachectl graceful
# 檢查是否已經載入
[[email protected] ~]# apachectl -M |grep -i 'rewrite'
rewrite_module (shared)
# 然後編輯vhost開始使用mod_rewrite模組
#   <IfModule mod_rewrite.c> 
#       RewriteEngine on # 開啟rewrite引擎
#       RewriteCond %{HTTP_HOST} ^www.csr.com$ [OR]   
#       RewriteCond %{HTTP_HOST} ^csr.com$ [OR]     
#       RewriteCond %{HTTP_HOST} ^csrnew.com$     
#       RewriteRule ^/(.*)$ http://www.csrnew.com/$1 [R=301,L] 
#   </IfModule>
# 方法二:簡單高效,不需要開啟rewrite模組
<If "(%{HTTP_HOST} == 'www.csr.com') || (%{HTTP_HOST} == 'csr.com') || (%{HTTP_HOST} == 'csrnew.com')">
Redirect permanent / http://www.csrnew.com/ # 301重定向
</If>
# 後面繼續判斷,比如其他人用www.nocsr.com域名繫結你的IP,加上這個他就訪問不到了(403 Forbidden)
# 自己測試的時候改hosts繫結IP即可,看看是不是403 Forbidden
<ElseIf "!(%{HTTP_HOST} == 'www.csrnew.com') && !(%{HTTP_HOST} == 'localhost')">
Require all denied
</ElseIf>
</VirtualHost>
# 使用curl測試,也可以在windows上開啟瀏覽器->開啟審查元素(按F12也可以開啟)->Network檢視,如圖1
# curl -I 只請求http首部(使用HEAD方法) -x 使用HTTP代理proxy,結果見圖2
[[email protected] ~]# curl -x127.0.0.1:80 www.test.com/static/image/common/logo.png -I
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41

csr

csr

4、遮蔽惡意USER_AGENG

有時候可能會有一些惡意的USER_AGENG會一直爬你的網站,這時你需要遮蔽他們。
(或者你不想讓某些蜘蛛爬你的網站,同樣可以使用USER_AGENG遮蔽他們)
[[email protected] ~]# vim /usr/local/apache2/conf/extra/httpd-vhosts.conf
# 方法一:使用mod_rewrite模組,並不推薦這個方法,除非你真的不懂其他方法了
#   不加[OR]預設是表示AND,只允許匹配Firefox、Too Bot/1.0的訪問,其他的一律拒絕,i忽略大小寫,可以用m##代替//
#   <IfModule mod_rewrite.c>
#        RewriteEngine on
#        RewriteCond expr "!(%{HTTP_USER_AGENT} =~ /Firefox/i)"  [NC]
#        RewriteCond expr "!(%{HTTP_USER_AGENT} =~ m#Too Bot/1.0#i)"  [NC]
#        RewriteRule  .*  -  [F]
#    </IfModule>
# 方法二:只允許匹配chrome,google的user_agent訪問,其他的一律拒絕
#   <If "!(%{HTTP_USER_AGENT} =~ /google/i) && !(%{HTTP_USER_AGENT} =~ /chrome/i)">
#       Require all denied
#   </If>
# 開始測試,結果見下圖
[[email protected] ~]# apachectl -t 
Syntax OK 
[[email protected]~]# apachectl graceful
[[email protected] ~]# curl -x127.0.0.1:80 -A "baidu/1.0" www.test.com -I
[[email protected] ~]# curl -x127.0.0.1:80 -A "chrome/1.0" www.test.com -I
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25

csr

5、配置使用者認證

對於一些重要內容,需要加一些安全措施,使用者認證就可以在一定程度上保證它的安全。
[[email protected] ~]# vim /usr/local/apache2/conf/extra/httpd-vhosts.conf
# FilesMatch後面的檔案是相對路徑,而Files、Directory則使用絕對路徑
# (比如這裡Directory則為:"/data/www/admin.php")
<FilesMatch "admin.php">
AllowOverride AuthConfig
AuthName "csr: test Authentication."
AuthType Basic
AuthUserFile /data/.htpasswd # 基於使用者的
# AuthGroupFile /data/.htgpasswd    # 基於組的
# Require user csr      # 只允許csr使用者認證
Require valid-user  允許有效使用者認證
# Require group group-csr   允許group-csr組認證
</FilesMatch>
[[email protected] ~]# apachectl -t 
Syntax OK 
[[email protected]~]# apachectl graceful
# /usr/local/apache2/bin/htpasswd:用於建立使用者認證的賬戶和密碼
# htpasswd第一次建立使用者要用到-c 引數 第2次就不能加-c了,否則會覆蓋前面已建立好的使用者
[[email protected] ~]# /usr/local/apache2/bin/htpasswd -c /data/.htpasswd  test
# 提示輸入密碼然後完成
# 結果如圖:
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26

csr

6、訪問控制

訪問控制,很基礎但非常重要,很多安全設定都是靠他實現的:
比如某些企業只允許本區域網內的主機對某一特定目錄的某類檔案進行訪問,外來的則全部禁止:
<Directory /path/>
<FilesMatch ". \.(txt|doc)$">
Require all denied
Require ip 192.168.0.0/16
</FilesMatch>
</Directory>
Apache2.4以下版本的訪問控制方法有點奇特,規則是這樣的:
-- 首先看Order後面是那個再前面
-- 如果deny(allow)在前,那麼看deny(allow) from,按順序看完再看allow(deny)的
例一、禁止5.5.5.5和6.6.6.6的:
Order allow deny 也可以這樣: Order allow deny
Deny from 5.5.5.5           Allow from all
Deny from 6.6.6.6           Deny from 6.6.6.6
Allow from all              Deny from 5.5.5.5
例二、只允許5.5.5.5和6.6.6.6的:
Order deny allow 也可以這樣: Order deny allow
Allow from 5.5.5.5          Deny from all
Allow from 6.6.6.6          Allow from 6.6.6.6
Deny from all               Allow from 5.5.5.5
Apache2.4開始,取消這種奇怪的規則,改成更通俗易懂的:
#   Require all denied   全部禁止
#   Require all granted  全部允許 
#   Require host www.csr.com  
#   Require ip 192.168.1 192.168.2 
#   Require ip 192.168.1/24 
...
其他的等用到了再介紹吧
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33

7、配置防盜鏈

有時候,你的網站莫名其妙的訪問量變大,不要高興的太早,有可能是被別人盜鏈了...
舉個例子:比如我搭的這個discuz論壇,有人發了一個貼,裡面全是些xxx圖片視訊;
然後將他網站上訪問圖片的地址重定向到我的discuz上,這樣他的伺服器就可以空閒出來了;
也就是說別人訪問他網站的圖片視訊,消耗的確是你伺服器的資源;
網路上訪問xxx圖片視訊的人很多,這樣就很有可能導致你的discuz負載超核掛了;
解決這個問題的方法是配置下防盜鏈,讓外來的盜不了鏈;
(不過最本質的方法還是自己定期刪除些違法的內容,沒有這些違法內容別人也不會去盜鏈)
# 對視訊圖片壓縮包等比較耗資源的做下防盜鏈
SetEnvIfNoCase Referer "^http://www.csr.com" local_ref
SetEnvIfNoCase Referer "^http://csr.com" local_ref
<filesmatch "\.(mp3|mp4|zip|rar|jpg|gif|png)"> 
# 2.4版本以下的
方法一:
Order Deny,Allow 
Allow from env=local_ref 
Deny from all
方法二:
Order Allow,Deny 
Allow from env=local_ref
2.4版本以上,方法如下:
Require all denied
Require env local_ref
</filesmatch> 
# graceful下apache然後結果如下圖:
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28

csr

8、配置靜態檔案快取

配置靜態快取可以減少瀏覽器下載同一資源的次數,同時也可以減輕伺服器的壓力和節省頻寬;
比如說瀏覽器請求一個csr.html,該html裡面包含一張csr.png圖片;
沒有配置靜態快取則每次請求都要重新載入下csr.png圖片;
而配置了靜態快取則在有效期內不會再請求該圖片。
# 首先要開啟mod_expires模組(取消前面的註釋'#')
[[email protected] ~]# vim /usr/local/apache2/conf/httpd.conf
LoadModule expires_module modules/mod_expires.so
[[email protected] ~]# apachectl -t 
Syntax OK 
# 檢查模組是否正確開啟
[[email protected] ~]# apachectl graceful
[[email protected] ~]# apachectl -M |grep expires_module
expires_module (shared)
# 開始配置靜態快取
[[email protected] ~]# vim /usr/local/apache2/conf/extra/httpd-vhosts.conf
<IfModule mod_expires.c>
ExpiresActive on
ExpiresByType image/gif  "access plus 1 days"
ExpiresByType image/jpeg "access plus 24 hours"
ExpiresByType image/png "access plus 24 hours"
ExpiresByType text/css "now plus 2 hour"
ExpiresByType application/x-javascript "now plus 2 hours"
ExpiresByType application/x-shockwave-flash "now plus 2 hours"
ExpiresDefault "now plus 0 min"
</IfModule>
# 開啟瀏覽器,檢視結果是否正確(304表示快取了),快取時間是否與配置的一致
# 這裡不能使用curl測試了,因為curl命令並不支援快取功能,所以看不到304的
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30

csr

csr

9、配置偽靜態

對於某些更新頻繁的網站來說,使用靜態則不利與更新,而使用動態又不利於網路蜘蛛爬你的網站,於是,就產生了偽靜態技術。
偽靜態只是使用rewrite模組改變了URL,實際上還是動態頁面;
例如:你請求www.csr.com/a.html,伺服器提取出uri,然後使用rewrite模組重寫為a.php,再呼叫a.php將結果返回瀏覽器。
從這裡的分析可以看出,偽靜態實際上比動態還要耗資源,因為對每個請求,都必須使用rewrite重寫URL。
# 這裡不能再使用前面的方法了,因為expr中只有匹配沒有替換,所以,重寫URL的話就只能使用rewrite模組了
# 既然要使用rewrite模組,那麼就要先開啟才行:
[[email protected] ~]# vim /usr/local/apache2/conf/httpd.conf
LoadModule rewrite_module modules/mod_rewrite.so
[[email protected] ~]# apachectl -t 
Syntax OK 
[[email protected] ~]# apachectl graceful
[[email protected] ~]# apachectl -M |grep rewrite_module
rewrite_module (shared)
# discuz偽靜態配置
# 自己一個個重寫有點麻煩,這裡就直接使用aminglinux裡的discuz偽靜態配置了
# 規則很簡單,提取整個查詢字串,然後將...\.html的重寫成後面的形式
[[email protected] ~]# vim /usr/local/apache2/conf/extra/httpd-vhosts.conf
RewriteCond %{QUERY_STRING} ^(.*)$
RewriteRule ^/topic-(. )\.html$ /portal.php?mod=topic&topic=$1&%1
RewriteCond %{QUERY_STRING} ^(.*)$
RewriteRule ^/article-([0-9] )-([0-9] )\.html$ /portal.php?mod=view&aid=$1&page=$2&%1
RewriteCond %{QUERY_STRING} ^(.*)$
RewriteRule ^/forum-(\w )-([0-9] )\.html$ /forum.php?mod=forumdisplay&fid=$1&page=$2&%1
RewriteCond %{QUERY_STRING} ^(.*)$
RewriteRule ^/thread-([0-9] )-([0-9] )-([0-9] )\.html$ /forum.php?mod=viewthread&tid=$1&extra=page\%3D$3&page=$2&%1
RewriteCond %{QUERY_STRING} ^(.*)$
RewriteRule ^/group-([0-9] )-([0-9] )\.html$ /forum.php?mod=group&fid=$1&page=$2&%1
RewriteCond %{QUERY_STRING} ^(.*)$
RewriteRule ^/space-(username|uid)-(. )\.html$ /home.php?mod=space&$1=$2&%1
RewriteCond %{QUERY_STRING} ^(.*)$
RewriteRule ^/blog-([0-9] )-([0-9] )\.html$ /home.php?mod=space&uid=$1&do=blog&id=$2&%1
RewriteCond %{QUERY_STRING} ^(.*)$
RewriteRule ^/archiver/(fid|tid)-([0-9] )\.html$ /archiver/index.php?action=$1&value=$2&%1
RewriteCond %{QUERY_STRING} ^(.*)$
RewriteRule ^/([a-z] [a-z0-9_]*)-([a-z0-9_\-] )\.html$ /plugin.php?id=$1:$2&%1
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38

10、自定義訪問日誌 錯誤日誌格式

很多時候,apache預設的日誌格式並不滿足我們的需求,這時我們就需要自定義日誌的格式了。
例如:%h 記錄訪問者的IP,如果在web的前端有一層代理,那麼%h其實是代理機器的IP;
而%{X-FORWARDED-FOR}i 欄位則會記錄客戶端真實的IP。
1、自定義訪問日誌(範圍:全域性、vhost都可以)
# 在<IfModule log_config_module>模組里加入:(如下圖)
[[email protected] ~]# vim /usr/local/apache2/conf/httpd.conf
LogFormat "%h %{X-FORWARDED-FOR}i %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" csr
2、自定義錯誤日誌(範圍:全域性、vhost都可以)
# 在<IfModule log_config_module>模組里加入:(如下圖)
[[email protected] ~]# vim /usr/local/apache2/conf/httpd.conf
ErrorLogFormat "[%t] [%l] [pid %P] %F: %E: [client %a] %M"
根據個人的喜好可以配置成不同的格式,每個引數具體意義詳見Apache2.4官方文件,這裡再介紹內容就太多了。
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

csr

11、排除無意義的日誌

對於一般的請求圖片、css等日誌,是根本不需要記錄的,反而還會增加日誌的大小。
對於大訪問量的圖片網站,則更需要排除沒意義的日誌記錄。
# 使用上面的自定義日誌格式,同時不記錄字尾為gif、jpg等日誌
[[email protected] ~]# vim /usr/local/apache2/conf/extra/httpd-vhosts.conf
SetEnvIf Request_URI ".*\.gif$" image-request
SetEnvIf Request_URI ".*\.jpg$" image-request
SetEnvIf Request_URI ".*\.png$" image-request
SetEnvIf Request_URI ".*\.bmp$" image-request
SetEnvIf Request_URI ".*\.swf$" image-request
SetEnvIf Request_URI ".*\.js$" image-request
SetEnvIf Request_URI ".*\.css$" image-request
SetEnvIf Request_URI ".*\.ico$" image-request
CustomLog "/tmp/1.log" csr env=!image-request
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

12、日誌切割

隨著時間的增加,伺服器產生的日誌檔案會越來越大,如果不對日誌進行分割;
那麼刪除日誌只能整個刪除,這樣會丟失很多寶貴的資訊。
而且分割日誌對以後檢視日誌也更加方便了,刪除的時候也可以選擇保留最近一段時間的日誌。
# 日誌分割,需要用到apache自帶的rotatelogs工具
/usr/local/apache2/bin/rotatelogs 
rotatelogs --help   檢視幫助資訊可以讓我們瞭解怎麼分割日誌
# 以天為單位進行分割,-l指定使用本地時間,86400單位為秒=1天
# 配置時結合上面的“不記錄沒意義日誌”,重複了這裡就不加上了
[[email protected] bin]# vim /usr/local/apache2/conf/extra/httpd-vhosts.conf
CustomLog "|/usr/local/apache2/bin/rotatelogs -l /tmp/access_%Y%m%d.log 86400" csr env=!image-request
ErrorLog "|/usr/local/apache2/bin/rotatelogs -l /tmp/discuz_error_%Y%m%d.log 86400"
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

13、錯誤日誌級別-差異記錄

有時候網站有問題了,檢視錯誤日誌卻沒有發現上面異常,很可能是你定義的日誌級別太高導致沒有記錄到;
這時就可以將級別(LogLevel)調成debug然後進行除錯。
# LogLevel:作用範圍:全域性、vhost、Directory
# 也就是說可以細到對每個目錄進行差異記錄,這很有用!
# 比如你可以在總的httpd.conf裡設定為error,然後在某些很重要的目錄設定級別為debug;
# 這樣記錄日誌的時候就可以記錄更多重要目錄的資訊而不會把其他目錄也記錄下來了。
# 例如全域性設定為error,而passwd目錄(裡面存著很多人的銀行卡密碼)設定為debug
[[email protected] bin]# vim /usr/local/apache2/conf/httpd.conf
...
LogLevel error
...
<Directory "/data/zhifubao/passwd/">
LogLevel debug
</Directory>
# 下面列出LogLevel的所有級別(來自Apache2.4官方文件)
Level   Description     Example
emerg   Emergencies - system is unusable.   "Child cannot open lock file. Exiting"
alert   Action must be taken immediately.   "getpwuid: couldn't determine user name from uid"
crit    Critical Conditions.    "socket: Failed to get a socket, exiting child"
error   Error conditions.   "Premature end of script headers"
warn    Warning conditions. "child process 1234 did not exit, sending another SIGHUP"
notice  Normal but significant condition.   "httpd: caught SIGBUS, attempting to dump core in ..."
info    Informational.  "Server seems busy, (you may need to increase StartServers, or Min/MaxSpareServers)..."
debug   Debug-level messages    "Opening config file ..."
trace1  Trace messages  "proxy: FTP: control connection complete"
trace2  Trace messages  "proxy: CONNECT: sending the CONNECT request to the remote proxy"
trace3  Trace messages  "openssl: Handshake: start"
trace4  Trace messages  "read from buffered SSL brigade, mode 0, 17 bytes"
trace5  Trace messages  "map lookup FAILED: map=rewritemap key=keyname"
trace6  Trace messages  "cache lookup FAILED, forcing new map lookup"
trace7  Trace messages, dumping large amounts of data   "| 0000: 02 23 44 30 13 40 ac 34 df 3d bf 9a 19 49 39 15 |"
trace8  Trace messages, dumping large amounts of data   "| 0000: 02 23 44 30 13 40 ac 34 df 3d bf 9a 19 49 39 15 |"
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35

14、開啟server-info、server-status

對於伺服器的狀態和配置資訊,Apache也提供了一個方法:通過server-info、server-status檢視;
通過檢視這兩個我們可以很方便的瞭解到Apache當前的詳細狀態與配置資訊,很好用,不過必須加上訪問控制,否則就可能讓外來人看到你的配置資訊了。
這也很簡單,根據前面所講的只允許本區域網內的主機檢視,更細緻點,只允許特定幾臺主機檢視,這樣就不用擔心會洩露了。
# ...老是直接教怎麼做卻沒有告訴你們方法學了可能也是白學,拿這個為例:
1、首先server-info、server-status的資訊在httpd-info.conf裡有介紹,檢視該檔案
[[email protected] bin]# vim /usr/local/apache2/conf/extra/httpd-info.conf
2、裡面有這樣的三行:
# Required modules: mod_authz_core, mod_authz_host,
#                   mod_info (for the server-info handler),
#                   mod_status (for the server-status handler)
說明他們依賴這些模組,要開啟則必須先載入這些模組...載入這些模組
(至於載入模組前面已經講過多次了,取消LoadModule前面的註釋然後grep檢查是否正確載入即可)
3、接著往下看:with the URL of http://servername/server-status
這個介紹了配置好後怎麼在瀏覽器裡開啟他們
4、繼續:發現它已經給了大致模版了,編輯vhost檔案將其加入,然後修改下訪問控制,例如status:
<Location /server-status>
SetHandler server-status
Require all denied
Require ip 127.0.0.1
Require ip x.x.x.x
...
</Location>
5、graceful下Apache,然後瀏覽器測試,發現提示not found
仔細想想httpd-info.conf配置檔案和虛擬主機配置一樣在./conf/extra/下,
這下面的配置檔案想要生效必須在httpd.conf裡取消Include ...的註釋;
6、於是,編輯httpd.conf,開啟httpd-info.conf配置檔案
# Real-time info on requests and configuration
# Include conf/extra/httpd-info.conf
7、再次測試,發現可以檢視了(結果見下圖)
8、從server-info、server-status可以看到很多有用的資訊
比如status可以看到等待連線的請求有多少個、cpu的使用率、空閒(忙碌)的執行緒數等等
而info中可以很方便的看到某一模組在哪些行被配置使用,點選模組還會跳轉到該模組下面...
具體的自己去試試吧
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42

csr
csr

15、 HTTP/1.1 狀態碼

--來自HTTP/1.1RFC文件
-1xx: 報告的 - 接收到請求,繼續程序.
-2xx 成功 - 步驟成功接收,被理解,並被接受
-3xx 重發 - 為了完成請求,必須採取進一步措施.
-4xx 客戶端出錯 - 請求包括錯的順序或不能完成.
-5xx 伺服器出錯 - 伺服器無法完成顯然有效的請求.
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

16、ErrorDocument Alias

1、自定義404 not found 頁面
# vim vhost.conf加入
ErrorDocument 404 "/csrtest/not_found.html"
# cat not_found.html
<html><title>404</title><body>...not found...</body></html>
這樣以後只要是404 not found就會顯示not_found.html的內容了
2、Alias URL路徑 檔案系統的絕對路徑
# Alias指令使文件可以被儲存在DocumentRoot以外的本地檔案系統中
# 下面的是將URL/csr2對映到系統的/data/www/csrtest下
# 例如請求www.csr110.xyz/csr2/1.php,apache則會讀取/data/www/csrtest/1.php的內容
#   Alias /csr2 /data/www/csrtest
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

大致Apache就先介紹到這裡吧,Apache實際上還有非常多的功能,有興趣的可以自己去看官方文件。

轉自:http://blog.csdn.net/u012291157/article/details/46492137