1. 程式人生 > >十八次課 2018-09-12

十八次課 2018-09-12

Apache預設虛擬主機

概念

一個伺服器主機可以執行多個網站,每個網站都是一個虛擬主機; 任何一個域名解析到這臺機器,都可以訪問的虛擬主機就是預設虛擬主機; 在dns還未生效時,通過修改hosts檔案,設定ip與域名的對映解析,來配置域名。

在這裡插入圖片描述

問題:為什麼我們在 建立一個php測試文字:vi /usr/local/apache2.4/htdocs/1.php

把定義的測試網頁放在 htdocs下,我們就能在瀏覽器訪問到1.php呢?

答:原因是: vim /usr/local/apache2.4/conf/httpd.conf配置檔案中: 在這裡插入圖片描述

則它 的域名就是上面定義的ServerName 在這裡插入圖片描述

這個就是apache的預設主機,當任意一個域名指向到機器的ip就可以訪問到我們機器的站點

window下hosts的使用

Hosts檔案是什麼

Hosts檔案主要作用是定義IP地址和主機名的對映關係,是一個對映IP地址和主機名的規定。可以用文字檔案開啟!當用戶在瀏覽器中輸入一個需要登入的網址時,系統會首先自動從Hosts檔案中尋找對應的IP地址,一旦找到,瀏覽器會立即開啟對應網頁,如果沒有找到,則瀏覽器會將網址提交DNS伺服器進行IP地址解析。這也是提高快速開啟網頁的方法!

host路徑

C:\Windows\System32\drivers\etc

在hosts檔案定義一個域名讓它解析到我們的ip

檢測是否域名正確的解析到所指向的ip

ping 域名 看看顯示是不是指向到我們的定義ip中 這個是臨時的讓 定義的域名訪問到我們ip伺服器上,僅是在DNS未啟用時有效

//在host檔案裡新增一行
39.107.91.237 	www.abc.com www.123.com
//開啟命令列ping www.abc.com 
ping www.abc.com
PING www.abc.com (39.107.91.237): 56 data bytes
64 bytes from 39.107.91.237: icmp_seq=0 ttl=49 time=24.158 ms
64 bytes from 39.107.91.237: icmp_seq=1 ttl=49 time=22.788 ms
64 bytes from 39.107.91.237: icmp_seq=2 ttl=49 time=22.147 ms
64 bytes from 39.107.91.237: icmp_seq=3 ttl=49 time=23.822 ms
64 bytes from 39.107.91.237: icmp_seq=4 ttl=49 time=22.784 ms
64 bytes from 39.107.91.237: icmp_seq=5 ttl=49 time=22.741 ms
64 bytes from 39.107.91.237: icmp_seq=6 ttl=49 time=22.865 ms

在這裡插入圖片描述

Linux下hosts

Linux下hosts檔案在/etc/hosts裡 在/etc/hosts裡新增一行同樣配置

39.107.91.237 	www.abc.com www.123.com

然後使用curl命令訪問

#  curl www.abc.com
didibibabo

預設虛擬主機配置(可以定義多個ServerName)

好處是我們的一臺伺服器可以跑多個域名,不用侷限所有域名都是解析到我們的同一個地方,一個配置檔案只能定義到一個ServerName

1.在httpd.conf配置檔案中啟用虛擬主機配置檔案

# vim /usr/local/apache2.4/conf/httpd.conf
//找到#Include conf/extra/httpd-vhosts.conf將#號去掉
Include conf/extra/httpd-vhosts.conf

2.開啟虛擬主機配置檔案

# vim /usr/local/apache2.4/conf/extra/httpd-vhosts.conf
//將下面配置寫入httpd-vhosts.conf檔案中
<VirtualHost *:80>
    DocumentRoot "/data/wwwroot/abc.com"
    ServerName abc.com
    ServerAlias www.abc.com www.123.com
    ErrorLog "logs/abc.com-error_log"
    CustomLog "logs/abc.com-access_log" common
</VirtualHost>

<VirtualHost *:80>
    DocumentRoot "/data/wwwroot/1111.com"
    ServerName 1111.com
    ServerAlias www.example.com
    ErrorLog "logs/1111.com-error_log"
    CustomLog "logs/1111.com-access_log" common
</VirtualHost>

說明

httpd-vhosts.conf配置檔案中第一個<VirtualHost>就是預設虛擬主機
當一個域名解析到httpd伺服器上,如果httpd伺服器開啟了虛擬主機功能。
而且httpd-vhosts.conf檔案中沒有配置使用該域名為ServerName或ServerAlias的虛擬主機
那麼這個訪問就會使用第一個虛擬主機的配置,這就是預設虛擬主機的作用。

一個 <VirtualHost> </VirtualHost> 標籤的範圍就是一個虛擬主機
<VirtualHost *:80> : *:80表示監聽80埠
ServerAdmin  管理員的郵箱,沒什麼實際用處
DocumentRoot 網站的根目錄,一般是網站主頁檔案所在的目錄
ServerName   網站的域名  只能設定一個。
ServerAlias  網站的域名別名,可以設定多個
ErrorLog     錯誤日誌檔案所在的路徑
CustomLog    訪問日誌檔案所在的路徑
common       固定格式,是指的日誌格式,這個需要在httpd.conf檔案中修改

3.建立虛擬主機的目錄和測試檔案

# mkdir -p /data/wwwroot/abc.com /data/wwwroot/123.com
# echo -e '<?php\n echo "www.test.com"\n?>' > /data/wwwroot/abc.com/index.php
# echo -e '<?php\n echo "www.1111.com"\n?>' > /data/wwwroot/1111.com/index.php

檢查配置是否有語法錯誤,然後過載httpd配置

# /usr/local/apache2.4/bin/apachectl -t
Syntax OK
# /usr/local/apache2.4/bin/apachectl graceful

測試 1. 在此使用瀏覽器和curl命令分別進行測試,如果使用瀏覽器測試可以在Windows電腦中的 C:\Windows\System32\drivers\etc 目錄下hosts檔案中加入重定向域名,使直接訪問Apache服務站點上,否則將無法測試,導致DNS直接解析到外網,從而訪問外網網站,導致測試失敗。 在這裡插入圖片描述

(出現此介面是因為使用的阿里雲伺服器,如果是虛擬機器則會顯示正常) 在這裡插入圖片描述 2.

# curl -x127.0.0.1:80 abc.com
www.test.com
# curl -x127.0.0.1:80 1111.com
www.1111.com
# curl -x39.107.91.237:80 abkjc.com  //注意abkjc.com,並沒有在httpd-vhost.conf配置檔案中有定義但是訪問到的卻是www.test.com的頁面。

www.test.com

Apache的使用者認證

當一些頁面涉及安全問題,或者有某些頁面有需要輸入使用者名稱和密碼才能訪問的需求時,可以開啟這個功能,雖然現在的網站後臺都需要使用管理員賬號密碼才能登陸,但是也不是十分的安全。

在這裡插入圖片描述

修改配置檔案,開啟使用者認證

使用者認證功能的配置可以在httpd.conf 檔案中配置,也可以在虛擬主機的配置檔案中實現,當然我們一般都是在虛擬主機的配置檔案中增加相應的配置來實現使用者認證的功能。

# vim /usr/local/apache2.4/conf/extra/httpd-vhosts.conf //把1111.com那個虛擬主機編輯成如下內容,一般不會在預設虛擬主機中使用使用者認證功能

<VirtualHost *:80>
    DocumentRoot "/data/wwwroot/1111.com"
    ServerName 1111.com
    ServerAlias www.example.com
    <Directory /data/wwwroot/1111.com>
        AllowOverride AuthConfig
        AuthName "1111.com user auth"
        AuthType Basic
        AuthUserFile /data/.htpasswd
        require valid-user
    </Directory>
    ErrorLog "logs/1111.com-error_log"
    CustomLog "logs/1111.com-access_log" common
</VirtualHost>
  • 配置檔案說明
  <Directory /data/wwwroot/1111.com>  //指定認證的目錄,另外也可以對指定的檔案進行認證。
        AllowOverride AuthConfig       //這個相當於開啟認證的開關
        AuthName "1111.com user auth"   //自定義認證的名字,作用不大
        AuthType Basic                 //認證的型別,一般為Basic,其他型別沒用過
        AuthUserFile /data/.htpasswd   //指定密碼檔案所在位置
        require valid-user             //指定需要認證的使用者為全部可用使用者,
                                       //valid-user就是.htpasswd所有已定義的使用者
    </Directory>                       //配置結束標籤

生成使用者和密碼

這裡需要使用apache的一個工具命令來建立用於認證的使用者名稱和密碼

//建立一個使用者test
# /usr/local/apache2.4/bin/htpasswd -cm /data/.htpasswd test  
//-c 表示建立  -m 指定MD5加密 指定所在位置  如果再次增加使用者可以不用-c選項,-c是首次建立檔案使用的
New password: 
Re-type new password: 
Adding password for user test
# cat /data/.htpasswd
test:$apr1$fY/5c0/C$F9qwre8ct6ukR6Vn7qaWT/

檢測並重新載入htppd配置檔案

# /usr/local/apache2.4/bin/apachectl -t
Syntax OK
# /usr/local/apache2.4/bin/apachectl graceful

測試

瀏覽器測試 在這裡插入圖片描述 命令列測試

# curl -x127.0.0.1:80 1111.com -i
HTTP/1.1 401 Unauthorized
Date: Sun, 07 Oct 2018 05:44:01 GMT
Server: Apache/2.4.34 (Unix) PHP/5.6.32
WWW-Authenticate: Basic realm="1111.com user auth"
Content-Length: 381
Content-Type: text/html; charset=iso-8859-1
//-I選項表示自獲取網頁的頭部資訊 ,返回的狀態碼 401 表示該網頁需要進行使用者認證才能訪問
//這時可以使用 -u選項指定使用者名稱和密碼,格式為 -uUserName:Password
# curl -x127.0.0.1:80 -utest:12345678 1111.com -i
HTTP/1.1 200 OK
Date: Sun, 07 Oct 2018 05:45:46 GMT
Server: Apache/2.4.34 (Unix) PHP/5.6.32
X-Powered-By: PHP/5.6.32
Content-Length: 12
Content-Type: text/html; charset=UTF-8
//狀態碼為200 表示可以正常訪問。
# curl -x127.0.0.1:80 -utest:12345678 1111.com
www.1111.com

htpasswd命令介紹

htpasswd命令是Apache的Web伺服器內建工具,用於建立和更新儲存使用者名稱、域和使用者基本認證的密碼檔案。

語法: htpasswd [option] [引數]
Options:
-c:=create,建立一個加密檔案
-n:不更新加密檔案,只將更新後的使用者名稱密碼顯示在螢幕上
-m:使用MD5演算法對密碼進行加密(預設)
-d:使用CRYPT演算法對密碼進行加密
-p:不對密碼進行加密,即明文密碼
-s:使用SHA演算法對密碼進行加密
-b:在命令列一併輸入使用者名稱和密碼,而不是根據提示輸入密碼
-D:刪除指定使用者

針對檔案的使用者認證

修改配置檔案

針對檔案的使用者認證和對目錄的使用者認證配置類似,只是一個標籤的不同。 將前面針對目錄的使用者認證配置內容,修改為下面的內容:

# vim /usr/local/apache2.4/conf/extra/httpd-vhosts.conf 

<VirtualHost *:80>
    DocumentRoot "/data/wwwroot/1111.com"
    ServerName 1111.com
    ServerAlias www.example.com
#    <Directory /data/wwwroot/1111.com>  //註釋Directory標籤
     <FilesMatch 123.php>  //改成FilesMatch標籤,針對123.php進行使用者認證。
        AllowOverride AuthConfig
        AuthName "1111.com user auth"
        AuthType Basic
        AuthUserFile /data/.htpasswd
        require valid-user
     </FilesMatch>
#    </Directory>
    ErrorLog "logs/1111.com-error_log"
    CustomLog "logs/1111.com-access_log" common
</VirtualHost>

建立測試檔案

# echo '<?php echo "1111.com/index.php " ?>' > /data/wwwroot/1111.com/123.php

過載配置檔案

# /usr/local/apache2.4/bin/apachectl -t
Syntax OK
# /usr/local/apache2.4/bin/apachectl graceful

測試

# curl -x127.0.0.1:80 1111.com
www.1111.com
# curl -x127.0.0.1:80 1111.com/123.php -I  //訪問1111.com/目錄下的123.php 報錯:401,需要使用者認證
HTTP/1.1 401 Unauthorized
Date: Sun, 07 Oct 2018 06:00:53 GMT
Server: Apache/2.4.34 (Unix) PHP/5.6.32
WWW-Authenticate: Basic realm="1111.com user auth"
Content-Type: text/html; charset=iso-8859-1

# curl -x127.0.0.1:80 1111.com/123.php -I -utest:12345678 //用指定使用者名稱&密碼訪問
HTTP/1.1 200 OK
Date: Sun, 07 Oct 2018 06:01:11 GMT
Server: Apache/2.4.34 (Unix) PHP/5.6.32
X-Powered-By: PHP/5.6.32
Content-Type: text/html; charset=UTF-8
# curl -x127.0.0.1:80 1111.com/123.php -utest:12345678
1111.com/index.php

域名跳轉

當一個網站需要使用一個新的域名時,但是使用者還只知道老的域名,這時就需要用到域名跳轉的功能了,可以將舊的域名跳轉到新的域名。

  • 302跳轉是暫時的跳轉,搜尋引擎會抓取新的內容而保留舊的網址。因為伺服器返回302程式碼,搜尋引擎認為新的網址只是暫時的。
  • 301重定向是永久的重定向,搜尋引擎在抓取新內容的同時也將舊的網址替換為重定向之後的網址。
  • SEO(Search Engine Optimization)搜尋引擎優化,在瞭解搜尋引擎自然排名機制的基礎上,對網站進行內部及外部的調整優化,改進網站在搜尋引擎中的關鍵詞自然排名,獲得更多流量,從而達成網站銷售及品牌建設的預期目標。

配置域名跳轉

# vim /usr/local/apache2.4/conf/extra/httpd-vhosts.conf 
//繼續修改1111.com的配置
<VirtualHost *:80>
    DocumentRoot "/data/wwwroot/1111.com"
    ServerName 1111.com
    ServerAlias www.example.com
#    <Directory /data/wwwroot/1111.com>  //可以將剛才的使用者認證的配置註釋
#     <FilesMatch 123.php>
#        AllowOverride AuthConfig
#        AuthName "1111.com user auth"
#        AuthType Basic
#        AuthUserFile /data/.htpasswd
#        require valid-user
#     </FilesMatch>
#    </Directory>
//新增如下的配置
     <IfModule mod_rewrite.c>  
        RewriteEngine on
        RewriteCond %{HTTP_HOST} !^1111.com$   
        RewriteRule ^/(.*)$ http://1111.com/$1 [R=301,L]
     </IfModule>
    ErrorLog "logs/1111.com-error_log"
    CustomLog "logs/1111.com-access_log" common
</VirtualHost>

  • 配置說明
<IfModule mod_rewrite.c>  //需要mod_rewrite模組支援

RewriteEngine on    //開啟rewrite功能,off表示關閉

RewriteCond %{HTTP_HOST} !^1111.com$  //定義rewrite的條件,當請求的域名不是1111.com時滿足條件。

RewriteRule ^/(.*)$ http://1111.com/$1 [R=301,L]  //定義rewrite規則,當滿足上面的條件時,這條規則才會執行,這條規則表示主將域名後的內容也同步跳轉到新域名。
^/(.*)$ 	正則匹配:匹配域名後面所有的內容
http://1111.com/$1	$1是前面第一個小括號匹配到的內容,如果有多個小括號可以一次類推
[R=301,L]	跳轉所使用的狀態碼,301是永久跳轉,使用301時搜尋引擎會給新的域名增加權重
[302]	使用302作為跳轉狀態碼。搜尋引擎不會增加或減少域名的權重。
</IfModule>

修改httpd.conf配置檔案,開啟rewrite模組

//在httpd.conf配置檔案找到下面的內容
# vim /usr/local/apache2.4/conf/httpd.conf

#LoadModule rewrite_module modules/mod_rewrite.so
//刪除該內容開頭的符號 ‘ # ’ 就可以開啟rewrite功能模組了

過載配置檔案

# /usr/local/apache2.4/bin/apachectl -t
Syntax OK
# /usr/local/apache2.4/bin/apachectl graceful

檢查是否正常載入rewrite模組

# /usr/local/apache2.4/bin/apachectl -M | grep rewrite
 rewrite_module (shared)

測試

# curl -x127.0.0.1:80 www.example.com -I
HTTP/1.1 301 Moved Permanently
Date: Sun, 07 Oct 2018 06:36:04 GMT
Server: Apache/2.4.34 (Unix) PHP/5.6.32
Location: http://1111.com/
Content-Type: text/html; charset=iso-8859-1
# curl -x127.0.0.1:80 www.example.com
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>301 Moved Permanently</title>
</head><body>
<h1>Moved Permanently</h1>
<p>The document has moved <a href="http://1111.com/">here</a>.</p>
</body></html>

狀態碼為301,即設定了域名永久跳轉

Apache訪問日誌

所在目錄

apache的日誌分為訪問日誌,和錯誤日誌兩種,訪問日誌和錯誤日誌預設都放在/usr/local/apache2.4/logs目錄的下

# ll /usr/local/apache2.4/logs/
total 292
-rw-r--r-- 1 root root   2685 Oct  7 14:41 1111.com-access_log
-rw-r--r-- 1 root root    205 Oct  7 13:27 1111.com-error_log
-rw-r--r-- 1 root root  58978 Oct  7 14:29 abc.com-access_log
-rw-r--r-- 1 root root 120231 Oct  7 14:00 abc.com-error_log
-rw-r--r-- 1 root root  32693 Sep 11 22:51 access_log
-rw-r--r-- 1 root root  50364 Oct  7 14:29 error_log
-rw-r--r-- 1 root root      5 Oct  7 14:29 httpd.pid

如果沒有定義日誌檔案的虛擬主機的訪問日誌都會放在access_log檔案中

# tail -5 /usr/local/apache2.4/logs/access_log 
111.50.68.198 - - [11/Sep/2018:22:03:40 +0800] "GET /1.php HTTP/1.1" 200 77024
111.50.68.198 - - [11/Sep/2018:22:03:41 +0800] "GET /favicon.ico HTTP/1.1" 404 209
180.242.42.87 - - [11/Sep/2018:22:32:05 +0800] "GET / HTTP/1.1" 200 45
177.94.109.15 - - [11/Sep/2018:22:44:33 +0800] "GET / HTTP/1.1" 200 45
103.53.19.22 - - [11/Sep/2018:22:51:39 +0800] "GET / HTTP/1.1" 200 45

日誌格式

apache 初始的日誌格式比較簡單,記錄不夠詳細。我們可以修改配置檔案來實現自定義的日誌格式

檢視httpd.conf配置檔案中的初始日式格式

#   grep 'LogFormat' /usr/local/apache2.4/conf/httpd.conf
    LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
    LogFormat "%h %l %u %t \"%r\" %>s %b" common
    LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %I %O" combinedio

其中最後的combined 和 common 為日誌格式的名字,在虛擬主機配置檔案中使用CustomLog指令來指定日誌格式,預設使用common模式,combined為更加詳細的Log格式。

日誌欄位說明

%h:為訪問網站的IP;
%l:為訪問遠端登入名,這個欄位基本上為"-";
%u:為使用者名稱,當使用使用者認證時,這個欄位為認證的使用者名稱;
%t:訪問時間;
%r:為請求的動作(比如用ctrl-I是就為HEADE);
%s:為請求的狀態,寫成%>s為最後的狀態碼;
%b:為傳輸資料大小;
%{Referer}i:為referer資訊(請求本次地址上一次的地址就為referer,比如在百度中搜索阿銘linux,然後通過百度的搜尋結果頁面點選然後到了阿名的論壇,那訪問阿銘的論壇的這次請求的referer就是baidu,當然那個地址肯定是很長的);
%{User-Agent}i:為瀏覽器標識,比如你用Firefox或者Chrome瀏覽器,則該欄位顯示內容不一樣,是帶有瀏覽器的標識的。

設定日誌格式

編輯配置檔案httpd-vhosts.conf 將abc.com的日誌格式設定為combined

//在abc.com虛擬主機的配置中修改為如下配置
# vim /usr/local/apache2.4/conf/extra/httpd-vhosts.conf 

 CustomLog "logs/abc.com-access_log" combined

過載apache 配置

# /usr/local/apache2.4/bin/apachectl -t
Syntax OK
# /usr/local/apache2.4/bin/apachectl graceful

檢視新記錄的訪問日誌

# curl -x127.0.0.1:80 abc.com
www.test.com
# tail -1 /usr/local/apache2.4/logs/abc.com-access_log 
127.0.0.1 - - [07/Oct/2018:15:00:34 +0800] "GET HTTP://abc.com/ HTTP/1.1" 200 12 "-" "curl/7.29.0"

訪問日誌不記錄靜態檔案

一個網站很多內容都是靜態的檔案,比如jpg,css,js,mp4,flv,等等 當用戶訪問這個網站的時候,就會記錄大量的訪問這些靜態檔案的訪問日誌。 這樣會造成儲存空間的浪費,我們可以修改配置檔案來實現不記錄這些檔案的訪問日誌。

修改配置檔案

//將虛擬主機abc.com的配置改為下面的配置
# vim /usr/local/apache2.4/conf/extra/httpd-vhosts.conf 

<VirtualHost *:80>
    DocumentRoot "/data/wwwroot/abc.com"
    ServerName abc.com
    ServerAlias www.abc.com www.123.com
    ErrorLog "logs/abc.com-error_log"
    CustomLog "logs/abc.com-access_log" combined
    //新增如下
    SetEnvIf Request_URI ".*\.gif$" img
    SetEnvIf Request_URI ".*\.jpg$" img
    SetEnvIf Request_URI ".*\.png$" img
    SetEnvIf Request_URI ".*\.bmp$" img
    SetEnvIf Request_URI ".*\.swf$" img
    SetEnvIf Request_URI ".*\.js$" img
    SetEnvIf Request_URI ".*\.css$" img
    CustomLog "logs/123.com-access_log" combined env=!img
</VirtualHost>
  • 配置說明
SetEnvIf Request_URI ".*\.gif$" img  
    #將訪問請求為 *.*\.gif& 這個格式的資源的時候,生成一個變數名 img
CustomLog "logs/123.com-access_log" combined env=!img  
    #表示當env不是img的時候才會記錄日誌。

過載apache配置檔案

# /usr/local/apache2.4/bin/apachectl -t
Syntax OK
# /usr/local/apache2.4/bin/apachectl graceful

測試

/data/wwwroot/abc.com目錄下建立一個檔案test.jpg

# touch /data/wwwroot/abc.com/test.jpg

使用curl命令測試訪問abc.com/test.jpg

# curl -x127.0.0.1:80 abc.com/test.jpg
# curl -x127.0.0.1:80 abc.com
www.test.com
# tail /usr/local/apache2.4/logs/123.com-access_log 
127.0.0.1 - - [07/Oct/2018:15:18:33 +0800] "GET HTTP://abc.com/ HTTP/1.1" 200 12 "-" "curl/7.29.0"

並沒有記錄訪問abc.com/test.jpg的訪問請求。

訪問日誌切割

果一個網站的訪問量很大,那麼日誌記錄總有一天會把整個磁碟佔滿,所以有必要讓它自動切割,並刪除老的日誌檔案

修改配置檔案

將虛擬主機abc.com的配置修改為如下的內容

# vim /usr/local/apache2.4/conf/extra/httpd-vhosts.conf 

<VirtualHost *:80>
    DocumentRoot "/data/wwwroot/abc.com"
    ServerName abc.com
    ServerAlias www.abc.com www.123.com
    ErrorLog "logs/abc.com-error_log"
    CustomLog "logs/abc.com-access_log" combined
    SetEnvIf Request_URI ".*\.gif$" img
    SetEnvIf Request_URI ".*\.jpg$" img
    SetEnvIf Request_URI ".*\.png$" img
    SetEnvIf Request_URI ".*\.bmp$" img
    SetEnvIf Request_URI ".*\.swf$" img
    SetEnvIf Request_URI ".*\.js$" img
    SetEnvIf Request_URI ".*\.css$" img
#   CustomLog "logs/123.com-access_log" combined env=!img
    CustomLog "|/usr/local/apache2.4/bin/rotatelogs -l logs/123.com-access_%Y%m%d.log 86400" combined env=!img
</VirtualHost>
  • 配置說明
/usr/local/apache2.4/bin/rotatelogs -l logs/123.com-access_%F.log 86400 
    ##這一部分就是日誌切割的配置了
    ##管道符: ' | ' : 可以在httpd的配置檔案中使用apache自帶的一些工具

/usr/local/apache2.4/bin/rotatelogs  -l
    ##這個是apache自帶的一個日誌切割工具rotatelogs
    ## -l 選項是表示使用本地系統的時區來區分時間, 否則預設以美國的UTC時區來區分時間,會有時差

logs/123.com-access_%F.log
    ##這個指定日誌的路徑和日誌檔名,
    ##%F是date命令的一個日期的格式,代表的是當天的年月日。例如:2018-06-29

86400,表示的是以多少秒來切割日誌檔案, 一般都是84600 等於一天

過載apache配置檔案

# /usr/local/apache2.4/bin/apachectl -t
Syntax OK
#  /usr/local/apache2.4/bin/apachectl graceful

測試

# curl -x127.0.0.1:80 abc.com
www.test.com
# curl -x127.0.0.1:80 abc.com/index.php
www.test.com
//檢視日誌存放目錄,其中 23.com-access_20181007.log就是剛才生成的日誌檔案了
# ll /usr/local/apache2.4/logs/
total 300
-rw-r--r-- 1 root root   2685 Oct  7 14:41 1111.com-access_log
-rw-r--r-- 1 root root    205 Oct  7 13:27 1111.com-error_log
-rw-r--r-- 1 root root    310 Oct  7 15:29 123.com-access_20181007.log
-rw-r--r-- 1 root root     99 Oct  7 15:18 123.com-access_log
-rw-r--r-- 1 root root  59779 Oct  7 15:29 abc.com-access_log
-rw-r--r-- 1 root root 120426 Oct  7 15:29 abc.com-error_log
-rw-r--r-- 1 root root  32693 Sep 11 22:51 access_log
-rw-r--r-- 1 root root  51672 Oct  7 15:27 error_log
-rw-r--r-- 1 root root      5 Oct  7 15:27 httpd.pid

在實際過程中,需要建立一個任務計劃,把一段時間的檔案進行拷貝或刪除,以保證磁碟容量永遠是足夠的。

靜態元素過期時間

瀏覽器訪問網站的圖片時會把靜態的檔案快取在本地電腦裡,這樣下次再訪問時就不用去遠端下載了,我們可以設定靜態檔案在客戶的電腦裡快取的有效時間,超過時間才會重新再向伺服器請求新的資源

修改配置檔案

在虛擬主機abc.com的配置中新增以下配置

<VirtualHost *:80>
    DocumentRoot "/data/wwwroot/abc.com"
    ServerName abc.com
    ServerAlias www.abc.com www.123.com
    ErrorLog "logs/abc.com-error_log"
    CustomLog "logs/abc.com-access_log" combined
    SetEnvIf Request_URI ".*\.gif$" img
    SetEnvIf Request_URI ".*\.jpg$" img
    SetEnvIf Request_URI ".*\.png$" img
    SetEnvIf Request_URI ".*\.bmp$" img
    SetEnvIf Request_URI ".*\.swf$" img
    SetEnvIf Request_URI ".*\.js$" img
    SetEnvIf Request_URI ".*\.css$" img
#   CustomLog "logs/123.com-access_log" combined env=!img
    CustomLog "|/usr/local/apache2.4/bin/rotatelogs -l logs/123.com-access_%Y%m%d.log 86400" combined env=!img
    //新增以下下配置
   <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/javascript "now plus 2 hours"
    ExpiresByType application/x-shockwave-flash "now plus 2 hours"
    ExpiresDefault "now plus 0 min"
   </IfModule>
</VirtualHost>
  • 配置說明
<IfModule mod_expires.c>                          //需要用到expires模組
    ExpiresActive on                                //開啟該功能的開關
    ExpiresByType image/gif  "access plus 1 days"   //gif格式的圖片快取時間為1天
    ExpiresByType image/jpeg "access plus 24 hours" //peg格式的圖片快取時間為24小時
    ExpiresByType image/png "access plus 24 hours"  //png格式的圖片快取時間24小時
    ExpiresByType text/css "now plus 2 hour"        //css格式的快取時間是2小時
    ExpiresByType application/x-javascript "now plus 2 hours" //js格式的檔案快取2個小時
    ExpiresByType application/javascript "now plus 2 hours"   //js格式的檔案快取2個小時
    ExpiresByType application/x-shockwave-flash "now plus 2 hours"  //flash格式的檔案快取2個小時
    ExpiresDefault "now plus 0 min"  //其他檔案不進行快取
</IfModule>

開啟expires_module 模組

# vim /usr/local/apache2.4/conf/httpd.conf

LoadModule expires_module modules/mod_expires.so //找到這一行,去掉前面的 ‘#’ 

# /usr/local/apache2.4/bin/apachectl -M | grep expires  //檢查是否開啟expires模組
 expires_module (shared)

過載配置檔案

# /usr/local/apache2.4/bin/apachectl -t
Syntax OK
# /usr/local/apache2.4/bin/apachectl graceful

測試 首先隨便下載一張圖片,移動到/data/wwwroot/abc.com目錄下

# curl -x127.0.0.1:80 abc.com/1.png -I
HTTP/1.1 200 OK
Date: Sun, 07 Oct 2018 07:46:12 GMT
Server: Apache/2.4.34 (Unix) PHP/5.6.32
Last-Modified: Sun, 07 Oct 2018 03:34:23 GMT
ETag: "6465-5779b2e3dedc0"
Accept-Ranges: bytes
Content-Length: 25701
Cache-Control: max-age=86400
Expires: Mon, 08 Oct 2018 07:46:12 GMT
Content-Type: image/png
//多了cache-control引數等

#拓展