apache優化:設置錯誤頁面友好顯示,mo_deflate網站壓縮功能和mod_expires緩存功能

實驗環境如下

一臺centos7純淨,配置好yum源,IP爲192.168.1.11,關閉防火牆

一.源碼安裝httpd服務

安裝服務不是本次重點,這裏就安裝一下就可以
下面是apache的軟件包,上傳至服務器
鏈接:https://pan.baidu.com/s/1WI4th9jijqpCn5H7wMiWtQ
提取碼:whvt

1)安裝上apache服務

[root@apache ~]# tar -zxvf httpd-2.4.38.tar.gz
[root@apache ~]# yum -y install gcc gcc-c++ apr apr-devel cyrus-sasl-devel expat-devel libdb-devel openldap-devel apr-util-devel apr-util pcre-devel pcre openssl*

[root@apache ~]# cd httpd-2.4.38/
[root@apache httpd-2.4.38]# ./configure --prefix=/usr/local/httpd --enable-so --enable-rewrite --enable-charset-lite --enable-cgi --enable-ssl --enable-mpms-shared=all

[root@apache httpd-2.4.38]# make && make install

2)啓動腳本

[root@apache ~]# cp /usr/local/httpd/bin/apachectl /etc/init.d/apache
[root@apache ~]# vim /etc/init.d/apache
在第一行後添加兩行內容,如下#號也要寫上,注意格式要一致,空格都要一致,不然會報錯

#chkconfig: 2345 11 88
# despriction:httpd apache server

在這裏插入圖片描述
[root@apache ~]# chkconfig --add apache

3)修改一下ServerName並啓動服務

[root@apache ~]# vim /usr/local/httpd/conf/httpd.conf
我這裏主機名是apache,你們寫你們的主機名即可,然後保存退出即可
在這裏插入圖片描述
[root@apache ~]# /etc/init.d/apache start
[root@apache ~]# netstat -anpt | grep 80
tcp6 0 0 :::80 :::* LISTEN 50482/httpd

二.設置錯誤頁面

當用戶訪問出現錯誤的時候,默認服務器返回的錯誤信息很不友好,這裏以404錯誤爲例,設置錯誤顯示頁面

有兩種方式,分別介紹

第一種方式,原始網站

1.需要關閉虛擬主機功能,我這裏沒有開啓

必須關閉虛擬主機,不然一會訪問會報錯,一會再開啓
[root@apache ~]# vim /usr/local/httpd/conf/httpd.conf
找到大概180多行行,前面加上#號,我這裏原來沒開,就不重啓服務了
在這裏插入圖片描述

2.修改關於錯誤頁面配置

[root@apache ~]# vim /usr/local/httpd/conf/httpd.conf
大概在250多行,有Require all granted 這個上面,添加如下一句,我後面有打好的可以複製
在這裏插入圖片描述

ErrorDocument 404 /404error.html
3.創建剛剛配置文件中的指定的錯誤文件並重啓服務

[root@apache ~]# cd /usr/local/httpd/htdocs/
[root@apache htdocs]# echo "<h1>Open Source</h1>" > 404error.html
[root@apache htdocs]# /etc/init.d/apache restart

4.測試一下錯誤頁面

通過IP方式訪問,我IP是192.168.1.11 ,404錯誤是找不到資源,觸發很簡單,隨便在訪問時候,添加一個不存在的即可

如下訪問,acb我肯定沒有創建,它返回的是我剛剛錯誤文件中的內容
http://192.168.1.11/acb
在這裏插入圖片描述
正常網頁,也可正確訪問
http://192.168.1.11/
在這裏插入圖片描述

第二種:虛擬主機

1.打開虛擬主機功能

[root@apache htdocs]# vim /usr/local/httpd/conf/httpd.conf
在這裏插入圖片描述

2.配置虛擬主機配置文件

先添加一個臨時IP,做基於IP的虛擬主機
[root@apache htdocs]# ifconfig ens33:1 192.168.1.200
[root@apache htdocs]# ifconfig

ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.1.11  netmask 255.255.255.0  broadcast 192.168.1.255
        inet6 fe80::953c:64db:834f:b238  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:ea:b3:4d  txqueuelen 1000  (Ethernet)
        RX packets 19144  bytes 19655160 (18.7 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 6760  bytes 1389924 (1.3 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

ens33:1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.1.200  netmask 255.255.255.0  broadcast 192.168.1.255
        ether 00:0c:29:ea:b3:4d  txqueuelen 1000  (Ethernet)

[root@apache htdocs]# vim /usr/local/httpd/conf/extra/httpd-vhosts.conf
裏面默認有兩個例子,刪掉最後一個例子,然後另一個例子,改爲我下面這樣
注意看ErrorDocument 後面,意思是如果出現404錯誤,就跳轉到1.11的網站

<VirtualHost 192.168.1.200:80>
    ServerAdmin ajbn@root
    DocumentRoot "/www/htdocs"
    ServerName apache
    ErrorLog "logs/1.200-error_log"
    CustomLog "logs/1.200-access_log" common
     <Directory />
    ErrorDocument 404 http://192.168.1.11
    Require all granted
    </Directory>
</VirtualHost>
3.創建虛擬主機目錄,與默認主頁並重啓服務

[root@apache htdocs]# mkdir -p /www/{htdocs,logs}
[root@apache htdocs]# echo "<h1>W</h1>" > /www/htdocs/index.html
[root@apache htdocs]# /etc/init.d/apache restart

4.測試

先訪問正常的網頁 http://192.168.1.200/
在這裏插入圖片描述
輸入一個不存在的abc資源,模擬404錯誤,發現直接跳轉到了http://192.168.1.11/
如下
http://192.168.1.200/abc
在這裏插入圖片描述

這種直接跳轉的方式,也可以用在那個默認網站,不只是虛擬主機支持,相反虛擬主機也可用上面那種文件的方式

另外,現在默認網站的錯誤頁面也生效,但是一開始做默認網站的錯誤頁面時,必須關閉虛擬主機,不然會報錯

三.網站壓縮功能

如下圖就是一個例子,客戶端請求資源,服務器在給客戶端迴應的時候,將資源進行壓縮,將壓縮過的文件進行傳輸,到了客戶端,客戶端瀏覽器會自動解壓又成爲原來大小,

這樣優點是傳輸速度快,節省帶寬,缺點是會增加服務器的CPU資源消耗,因爲壓縮的過程需要使用CPU
在這裏插入圖片描述

1)mod_deflate模塊相關

壓縮功能由mod_deflate模塊實現,我們要開啓這個模塊

1.檢查 apache是否安裝mod_deflate模塊

[root@apache htdocs]# ln -s /usr/local/httpd/bin/* /usr/local/bin/
上面是做一下軟連接,一遍使用apache的命令
[root@apache htdocs]# apachectl -t -D DUMP_MODULES | grep deflate
這裏什麼都沒有輸出,是沒有安裝,如果輸出以下,就是已經安裝
deflate_module(static):編譯時已經安裝
deflate_modele(shared):後來用DSO方式安裝,一會我們就用此方式安裝

2.安裝並查看mod_deflate模塊

有兩種方式
第一種是./configure編譯的時候添加
一種是編譯的時候–prefix 加上–enable-deflate,我們沒有加,此方法用不了

第二種是DSO安裝方式
DSO模塊可以在實現動態擴展模塊,也是以編譯的方式進行,前提是apache服務在編譯的時候添加了 --enable-so 我們這裏已經加了 我們使用此方式安裝

[root@apache htdocs]# apxs -c -i -a /root/httpd-2.4.38/modules/filters/mod_deflate.c
這裏解釋一下
-c:進行編譯操作,類似make
-i:進行安裝,基於上面的編譯操作,類似make install
-a:自動去httpd.conf文件中添加的相關LoadModule行,如果有這行,則會自動去掉#號,啓動此模塊

後面的路徑是我們的軟件解壓目錄,在root下,這裏指定此目錄,就可以自動添加模塊了,就類似單獨編譯安裝這個功能一樣,會自動找到httpd的安裝目錄

如下,已經自動安裝上了,在modules目錄下
[root@apache htdocs]# ls /usr/local/httpd/modules/mod_deflate.so
/usr/local/httpd/modules/mod_deflate.so

3.配置httpd.conf主配值文件,並啓用對應模塊

我們安裝完後,需要在配置文件中啓用,相反如果在配置文件中啓動了功能,但不安裝對應軟件,也是不可以用的

找到如下行大概在106行左右,因爲剛剛上面apxs加了-a,已經被啓用,

LoadModule deflate_module     modules/mod_deflate.so

在此行上面,注意必須是上面,添加一行如下語句,更改完後不要退出,還有要更改

LoadFile /usr/lib64/libz.so

在這裏插入圖片描述
繼續往下滑,找到大概150多行,按照我圖下添加,我後面有打好的,你可以直接複製
在這裏插入圖片描述

<ifmodule mod_deflate.c>
   DeflateCompressionLevel 9
   SetOutputFilter DEFLATE
   DeflateFilterNote Input instream
   DeflateFilterNote Output outstream
   DeflateFilterNote Ratio ratio
   LogFormat '"%r" %{outstream}n/%{instream}n (%{ratio}n%%)' deflate
   CustomLog logs/deflate_log.log deflate
   AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css application/javascript
</ifmodule>

這裏解釋以下參數
DeflateCompressionLevel 9 :壓縮等級,最高9級,就是壓縮比例,越大壓縮的越小,但是越大越消耗CPU資源
DeflateFilterNote Input instream :聲名文件原來大小,在日誌中記錄
DeflateFilterNote Output outstream:聲明壓縮後大小,在日誌中記錄
LogFormat ‘"%r" %{outstream}n/%{instream}n (%{ratio}n%%)’ deflate :一種記錄的格式,可以記錄數據被壓縮前與壓縮後,和壓縮百分百,一會驗證的時候再看
CustomLog logs/deflate_log.log deflate :聲名日誌類型,和存放位置

AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css application/javascript :可以壓縮什麼類型的文件,如html,css等,上面寫的這些類型,,如果過不想壓縮對應文件,去掉對應的即可

後面可跟如下這些類型
application/xhtml+xml application/xml application/rss+xml application/atom_xml application/x-javascript application/x-httpd-php image/svg+xml image/gif image/png image/jpe image/swf image/jpeg image/bmp

另外如果是虛擬主機,要在<VirtualHost*:80></VirtualHost>配置段中,添加上面<ifmodule mod_deflate.c> </ifmodule> 中的內容即可

一般圖片,和視頻不會去壓縮,因爲本身就是壓縮格式,並且有些小的圖片壓了還會變大

4.重啓服務並創建測試文件

[root@apache ~]# /etc/init.d/apache restart
[root@apache ~]# cp /etc/shadow /usr/local/httpd/htdocs/pass.html
[root@apache ~]# chmod 644 /usr/local/httpd/htdocs/pass.html
複製過去,保留文件原有權限,shadow文件原本沒有讀取權限,給與權限即可

5.訪問測試並查看日誌

訪問時候,刷新多次,方便看效果
http://192.168.1.11/pass.html
在這裏插入圖片描述
回到服務端,查看效果
[root@apache ~]# cd /usr/local/httpd/logs/
[root@apache logs]# cat deflate_log.log
如下結構表示有三次訪問/pass.html,原來大小是727字節,壓縮後發出是292字節大小,注意單位是字節,壓縮率是40%
"GET /pass.html HTTP/1.1" 292/727 (40%)
"GET /pass.html HTTP/1.1" 292/727 (40%)
"GET /pass.html HTTP/1.1" 292/727 (40%)

四.緩存功能

由於技術的急速發展的網絡,現在複雜好看的網頁也多了起來,那與之對應代碼量與圖片視頻等,客戶端就會大量的請求,給與服務器的壓力也會很大

可以通過開啓緩存功能,讓特定類型的文件,在客戶端瀏覽器中緩存

當客戶端瀏覽器第一次訪問指定緩存資源時,客戶端瀏覽器會緩存到本地,下一次訪問同樣資源時,就直接從本地調用,而不是再次請求服務器

通過apache的mod_expires模塊實現

1)mod_expires模塊檢查並安裝

[root@apache htdocs]# apachectl -t -D DUMP_MODULES | grep expires
我這裏什麼都沒輸出,就是沒按照,其他情況如下

deflate_module(static):編譯時已經安裝
deflate_modele(shared):後來用DSO方式安裝,一會我們就用此方式安裝

安裝方式也是兩種,可以在apache編譯的時候添加 --enable-expires

第二種是DSO,和那個mod_deflate安裝方式一樣

安裝
[root@apache ~]# apxs -c -i -a /root/httpd-2.4.38/modules/metadata/mod_expires.c

查看
[root@apache ~]# ls /usr/local/httpd/modules/mod_expires.so
/usr/local/httpd/modules/mod_expires.so

2)修改配置文件並配置模塊
1.激活配置項

如果你是編譯apache就添加了這個模塊,需要將如下語句前面的#號去掉,我們是後安裝就,它會自動打開,就不用管
[root@apache ~]# vim /usr/local/httpd/conf/httpd.conf

LoadModule expires_module     modules/mod_expires.so
2.配置緩存

有三種配置方式
全局:對所有服務器上所有資源,和所有虛擬主機生效
目錄:針對指定目錄下的資源生效,其他不生效
虛擬主機:針對指定的虛擬主機生效,其他不生效

我們做全局的緩存,其他的類型後面也會介紹
[root@apache ~]# vim /usr/local/httpd/conf/httpd.conf
在上一個模塊配置信息下面,添加我用藍線圈起來帶的部分,我後面有打好的,可以複製
在這裏插入圖片描述

<IfModule mod_expires.c>
ExpiresActive on
    ExpiresDefault "access plus 12 month"
    ExpiresByType text/html "access plus 24 months"
    ExpiresByType text/css "access plus 12 months"
    ExpiresByType image/gif "access plus 12 months"
    ExpiresByType image/jpeg "access plus  12 months"
    ExpiresByType image/jpg "access plus 12 months"
    ExpiresByType image/png "access plus 12 months"
    EXpiresByType application/x-shockwave-flash "access plus 12 months"
    EXpiresByType application/x-javascript "access plus 12 months"
    ExpiresByType video/x-flv "access plus 12 months"
</IfModule>

解釋參數
ExpiresActive on:開啓緩存功能
ExpiresDefault “access plus 12 month” : 如果客戶端訪問下面ExpiresByType沒有寫類型的文件,緩存12個月
ExpiresByType text/html “access plus 24 months”:這個是設置html文件類型,緩存時間爲24個月,後面以此類推,只是不同的文件類型而已
單位得類型有如下幾種
years(年),months(月),weeks (周),days(天),hours (小時),minutes (分鐘),seconds(秒)

3 )重啓服務並驗證結果

[root@apache ~]# /etc/init.d/apache restart
上傳任意jpg格式一個圖片,在windows中改名爲test.jpg,上傳到服務器 /usr/local/httpd/htdocs/路徑下

驗證,按照我下圖一步一步驗證即可
在這裏插入圖片描述

4)針對指定目錄或虛擬主機

首先針對指定的目錄

如果只想被客戶機緩存指定目錄下資源
將上面<IfModule mod_expires.c></IfModule>內容,添加到指定的<Directory ></Directory>中,如下面這種

DocumentRoot "/www/html"
<Directory "/www/html">
<IfModule mod_expires.c>
    ExpiresActive on
    ExpiresDefault "access plus 12 month"
    ExpiresByType text/html "access plus 24 months"
    ExpiresByType text/css "access plus 12 months"
    ExpiresByType image/gif "access plus 12 months"
    ExpiresByType image/jpeg "access plus  12 months"
    ExpiresByType image/jpg "access plus 12 months"
    ExpiresByType image/png "access plus 12 months"
    EXpiresByType application/x-shockwave-flash "access plus 12 months"
    EXpiresByType application/x-javascript "access plus 12 months"
    ExpiresByType video/x-flv "access plus 12 months"
</IfModule>
</Directory>  

針對指定的虛擬主機

可以指定某一個虛擬主機上的資源被緩存,其他主機包括默認網站不會受影響
也是在虛擬主機配置文件中的<Directory /><Directory />中添加如下

<VirtualHost www.baidu.com:80>
...
<Directory />
Require all granted
<IfModule mod_expires.c>  
  ExpiresActive on
  ExpiresDefault "access plus 12 month"
  ExpiresByType text/html "access plus 12 months"
  ExpiresByType text/css "access plus 12 months"
  ExpiresByType image/gif "access plus 12 months"
  ExpiresByType image/jpeg "access plus  12 months"
  ExpiresByType image/jpg "access plus 12 months"
  ExpiresByType image/png "access plus 12 months"
  EXpiresByType application/x-shockwave-flash "access plus 12 months"
  EXpiresByType application/x-javascript "access plus 12 months"
  ExpiresByType video/x-flv "access plus 12 months"
</IfModule>
</Directory>
</VirtualHost>
5)網站緩存的問題

如果網站更新了,客戶端瀏覽器可能會讀取本地的緩存而不會同步更新,導致訪問是舊的資源
有以下兩種方法,改變
1.新更新的內容的文件名字,不和原來一樣,客戶端便會重新讀取並緩存
2.緩存時間設置爲特短,比如一天,第二天緩存就失效,便會從新讀取

實驗完畢

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章