Apache2.4配置總結(轉)

 

文章內容轉自- ->https://blog.csdn.net/u012291157/article/details/46492137

 

一、apache開機自啓動

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

  

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

不少時候你想在一臺機器上跑多個網站,好比一個跑discuz、一個跑wordpress、一個跑其餘網站...
這時候你就要須要開啓apache的虛擬主機配置了。

前面幾篇實際上有介紹過這個了,這裏仍是從新講下吧:
第一步:編輯httpd.conf將vhost的註釋去掉(去掉'#')
# Include conf/extra/httpd-vhosts.conf
第二步:開始配置虛擬主機
[root@csr ~]# 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來講通常仍是便宜不少的)

  

三、配置域名跳轉

由於各類緣由,你換了個域名;但你的老顧客並不知道或者並不想記你的新域名,這時候就能夠經過域名跳轉將其跳轉到你的新域名了。

[root@csr ~]# 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模塊
    [root@csr ~]# vim /usr/local/apache2/conf/httpd.conf 去掉註釋
    #LoadModule rewrite_module modules/mod_rewrite.so
    [root@csr ~]# apachectl graceful
    # 檢查是否已經加載
    [root@csr ~]# 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
[root@csr ~]# curl -x127.0.0.1:80 www.test.com/static/image/common/logo.png -I

  

 

 

四、屏蔽惡意USER_AGENG

有時候可能會有一些惡意的USER_AGENG會一直爬你的網站,這時你須要屏蔽他們。
(或者你不想讓某些蜘蛛爬你的網站,一樣可使用USER_AGENG屏蔽他們)

[root@csr ~]# 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>

# 開始測試,結果見下圖
[root@csr ~]# apachectl -t 
Syntax OK 
[root@csr~]# apachectl graceful
[root@csr ~]# curl -x127.0.0.1:80 -A "baidu/1.0" www.test.com -I
[root@csr ~]# curl -x127.0.0.1:80 -A "chrome/1.0" www.test.com -I

  

 

五、配置用戶認證

對於一些重要內容,須要加一些安全措施,用戶認證就能夠在必定程度上保證它的安全。

[root@csr ~]# 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>

[root@csr ~]# apachectl -t 
Syntax OK 
[root@csr~]# apachectl graceful

# /usr/local/apache2/bin/htpasswd:用於建立用戶認證的帳戶和密碼
# htpasswd第一次建立用戶要用到-c 參數 第2次就不能加-c了,不然會覆蓋前面已創建好的用戶
[root@csr ~]# /usr/local/apache2/bin/htpasswd -c /data/.htpasswd  test
# 提示輸入密碼而後完成

# 結果如圖:

  

 

六、訪問控制

訪問控制,很基礎但很是重要,不少安全設置都是靠他實現的:
好比某些企業只容許本局域網內的主機對某一特定目錄的某類文件進行訪問,外來的則所有禁止:
<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)的

例1、禁止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

例2、只容許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 
...
其餘的等用到了再介紹吧

  

七、配置防盜鏈

有時候,你的網站莫名其妙的訪問量變大,不要高興的太早,有多是被別人盜鏈了...
舉個例子:好比我搭的這個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而後結果以下圖:

八、配置靜態文件緩存

配置靜態緩存能夠減小瀏覽器下載同一資源的次數,同時也能夠減輕服務器的壓力和節省帶寬;
好比說瀏覽器請求一個csr.html,該html裏面包含一張csr.png圖片;
沒有配置靜態緩存則每次請求都要從新加載下csr.png圖片;
而配置了靜態緩存則在有效期內不會再請求該圖片。

# 首先要開啓mod_expires模塊(取消前面的註釋'#')
[root@csr ~]# vim /usr/local/apache2/conf/httpd.conf
LoadModule expires_module modules/mod_expires.so
[root@csr ~]# apachectl -t 
Syntax OK 
# 檢查模塊是否正確開啓
[root@csr ~]# apachectl graceful
[root@csr ~]# apachectl -M |grep expires_module
 expires_module (shared)

# 開始配置靜態緩存
[root@csr ~]# 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的

  

 

九、配置僞靜態

對於某些更新頻繁的網站來講,使用靜態則不利與更新,而使用動態又不利於網絡蜘蛛爬你的網站,因而,就產生了僞靜態技術。

僞靜態只是使用rewrite模塊改變了URL,實際上仍是動態頁面;
例如:你請求www.csr.com/a.html,服務器提取出uri,而後使用rewrite模塊重寫爲a.php,再調用a.php將結果返回瀏覽器。
從這裏的分析能夠看出,僞靜態實際上比動態還要耗資源,由於對每一個請求,都必須使用rewrite重寫URL。

# 這裏不能再使用前面的方法了,由於expr中只有匹配沒有替換,因此,重寫URL的話就只能使用rewrite模塊了
# 既然要使用rewrite模塊,那麼就要先開啓才行:
[root@csr ~]# vim /usr/local/apache2/conf/httpd.conf
LoadModule rewrite_module modules/mod_rewrite.so
[root@csr ~]# apachectl -t 
Syntax OK 
[root@csr ~]# apachectl graceful
[root@csr ~]# apachectl -M |grep rewrite_module
 rewrite_module (shared)

 # discuz僞靜態配置
 # 本身一個個重寫有點麻煩,這裏就直接使用aminglinux裏的discuz僞靜態配置了
 # 規則很簡單,提取整個查詢字符串,而後將...\.html的重寫成後面的形式
[root@csr ~]# 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

  

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

不少時候,apache默認的日誌格式並不知足咱們的需求,這時咱們就須要自定義日誌的格式了。

例如:%h 記錄訪問者的IP,若是在web的前端有一層代理,那麼%h實際上是代理機器的IP;
而%{X-FORWARDED-FOR}i 字段則會記錄客戶端真實的IP。

一、自定義訪問日誌(範圍:全局、vhost均可以)
# 在<IfModule log_config_module>模塊里加入:(以下圖)
 [root@csr ~]# 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

二、自定義錯誤日誌(範圍:全局、vhost均可以)
# 在<IfModule log_config_module>模塊里加入:(以下圖)
[root@csr ~]# vim /usr/local/apache2/conf/httpd.conf
ErrorLogFormat "[%t] [%l] [pid %P] %F: %E: [client %a] %M"

根據我的的喜愛能夠配置成不一樣的格式,每一個參數具體意義詳見Apache2.4官方文檔,這裏再介紹內容就太多了。

  

 

十一、排除無心義的日誌

對於通常的請求圖片、css等日誌,是根本不須要記錄的,反而還會增長日誌的大小。
對於大訪問量的圖片網站,則更須要排除沒意義的日誌記錄。

# 使用上面的自定義日誌格式,同時不記錄後綴爲gif、jpg等日誌
[root@csr ~]# 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

  

十二、日誌切割

隨着時間的增長,服務器產生的日誌文件會愈來愈大,若是不對日誌進行分割;
那麼刪除日誌只能整個刪除,這樣會丟失不少寶貴的信息。
並且分割日誌對之後查看日誌也更加方便了,刪除的時候也能夠選擇保留最近一段時間的日誌。

# 日誌分割,須要用到apache自帶的rotatelogs工具
/usr/local/apache2/bin/rotatelogs 
rotatelogs --help   查看幫助信息可讓咱們瞭解怎麼分割日誌

# 以天爲單位進行分割,-l指定使用本地時間,86400單位爲秒=1天
# 配置時結合上面的「不記錄沒意義日誌」,重複了這裏就不加上了
[root@csr 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三、錯誤日誌級別-差別記錄

有時候網站有問題了,查看錯誤日誌卻沒有發現上面異常,極可能是你定義的日誌級別過高致使沒有記錄到;
這時就能夠將級別(LogLevel)調成debug而後進行調試。

# LogLevel:做用範圍:全局、vhost、Directory
# 也就是說能夠細到對每一個目錄進行差別記錄,這頗有用!
# 好比你能夠在總的httpd.conf裏設置爲error,而後在某些很重要的目錄設置級別爲debug;
# 這樣記錄日誌的時候就能夠記錄更多重要目錄的信息而不會把其餘目錄也記錄下來了。

# 例如全局設置爲error,而passwd目錄(裏面存着不少人的銀行卡密碼)設置爲debug
[root@csr 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四、開啓server-info、server-status

對於服務器的狀態和配置信息,Apache也提供了一個方法:經過server-info、server-status查看;
經過查看這兩個咱們能夠很方便的瞭解到Apache當前的詳細狀態與配置信息,很好用,不過必須加上訪問控制,不然就可能讓外來人看到你的配置信息了。
這也很簡單,根據前面所講的只容許本局域網內的主機查看,更細緻點,只容許特定幾臺主機查看,這樣就不用擔憂會泄露了。

# ...總是直接教怎麼作卻沒有告訴大家方法學了可能也是白學,拿這個爲例:
一、首先server-info、server-status的信息在httpd-info.conf裏有介紹,查看該文件
[root@csr bin]# vim /usr/local/apache2/conf/extra/httpd-info.conf

二、裏面有這樣的三行:
# Required modules: mod_authz_core, mod_authz_host,
#                   mod_info (for the server-info handler),
#                   mod_status (for the server-status handler)
說明他們依賴這些模塊,要開啓則必須先加載這些模塊...加載這些模塊
(至於加載模塊前面已經講過屢次了,取消LoadModule前面的註釋而後grep檢查是否正確加載便可)

三、接着往下看:with the URL of http://servername/server-status
這個介紹了配置好後怎麼在瀏覽器裏打開他們

四、繼續:發現它已經給了大體模版了,編輯vhost文件將其加入,而後修改下訪問控制,例如status:
<Location /server-status>
    SetHandler server-status
    Require all denied
    Require ip 127.0.0.1
    Require ip x.x.x.x
    ...
</Location>

五、graceful下Apache,而後瀏覽器測試,發現提示not found
仔細想一想httpd-info.conf配置文件和虛擬主機配置同樣在./conf/extra/下,
這下面的配置文件想要生效必須在httpd.conf裏取消Include ...的註釋;

六、因而,編輯httpd.conf,開啓httpd-info.conf配置文件
# Real-time info on requests and configuration
# Include conf/extra/httpd-info.conf

七、再次測試,發現能夠查看了(結果見下圖)

八、從server-info、server-status能夠看到不少有用的信息
好比status能夠看到等待鏈接的請求有多少個、cpu的使用率、空閒(忙碌)的線程數等等
而info中能夠很方便的看到某一模塊在哪些行被配置使用,點擊模塊還會跳轉到該模塊下面...
具體的本身去試試吧

  

 

1五、 HTTP/1.1 狀態碼

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

  

1六、ErrorDocument+Alias

一、自定義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的內容了

二、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
相關文章
相關標籤/搜索