apache如何設置緩存


基本介紹

 

    httpd是一個比較經典的web服務器,也就是靜態資源服務器,主要用來服務於一些靜態的文件,例如css,js,html等文件,所謂的靜態文件,也就是不需要通過服務器進行運行的文件。

 

    在使用靜態服務器的時候,大部分的圖片或者js文件或者css文件的變化一般都是比較少的,從而我們可以設置緩存時間,從而實現用戶訪問的加速,從而提高用戶體驗

 

    由於httpd程序發展的時間過長,采用的是動態共享模塊,從而在使用的時候,需要加載相關的模塊來進行使用,在使用httpd進行緩存的時候,可以使用header模塊或者是expires模塊。

 

    在使用httpd的時候,生產環境一般使用的版本為2.2的版本,並且采用的mpm機制為worker模式,從而在進行編譯的時候,指定worker模式。

 

 

編譯httpd2.2

 

    在編譯的時候,可能出現依賴包錯誤,從而首先需要安裝相關的依賴包,pcre,zlib,openssl,arp,arp-util,第一個是perl的擴展正則表達式,第二個是提供壓縮的,也就是gzip和deflate壓縮,第三個和第四個主要是提供httpd的可移植的運行環境。

 

    當編譯的時候,出現如下錯誤(不能使用外部的apr和apr-util,表示不能使用操作系統自帶的rpm包,從而需要重新編譯安裝):

Configuring Apache Portable Runtime Utility library...

 

checking for APR-util... reconfig

configure: error: Cannot use an external APR with the bundled APR-util

 

    需要首先安裝apr和apr-util,這兩個包在httpd2.2的源碼中是自帶的,從而不需要專門下載,如下所示:

[root@mogilenode1 httpd-2.2.34]# cd srclib/

[root@mogilenode1 srclib]# cd apr

[root@mogilenode1 apr]# ./configure --prefix=/usr/local/apr2 (prefix表示安裝路徑)

[root@mogilenode1 apr]# make && make install

 

[root@mogilenode1 apr]# ls -l /usr/local/apr2/ (表示安裝成功)

total 16

drwxr-xr-x 2 root root 4096 Sep  7 16:37 bin

drwxr-xr-x 2 root root 4096 Sep  7 16:37 build-1

drwxr-xr-x 3 root root 4096 Sep  7 16:37 include

drwxr-xr-x 3 root root 4096 Sep  7 16:37 lib

 

    安裝apr-util如下:

 

[root@mogilenode1 srclib]# cd apr-util/

[root@mogilenode1 apr-util]# ./configure --prefix=/usr/local/apr-util2 --with-apr=/usr/local/apr2/ (apr-util依賴於apr,從而需要指定apr的安裝路徑)

[root@mogilenode1 apr-util]# make && make install

[root@mogilenode1 apr-util]# ls -l /usr/local/apr-util2/ (表示安裝成功)

total 12

drwxr-xr-x 2 root root 4096 Sep  7 16:41 bin

drwxr-xr-x 3 root root 4096 Sep  7 16:41 include

drwxr-xr-x 4 root root 4096 Sep  7 16:41 lib

 

    進行安裝httpd:

 

[root@mogilenode1 httpd-2.2.34]# ls -l include/ap_release.h (修改如下的內容,httpd的版本號,主要目的是為了防止根據相應的版本查找漏洞進行攻擊

-rw-r--r-- 1 1001 1001 3074 Sep  7 08:08 include/ap_release.h

 40 #define AP_SERVER_BASEVENDOR "KEL"

 41 #define AP_SERVER_BASEPROJECT "KEL"

 42 #define AP_SERVER_BASEPRODUCT "KEL"

 43 

 44 #define AP_SERVER_MAJORVERSION_NUMBER 2

 45 #define AP_SERVER_MINORVERSION_NUMBER 2

 46 #define AP_SERVER_PATCHLEVEL_NUMBER   2

 47 #define AP_SERVER_DEVBUILD_BOOLEAN    0


    編譯安裝httpd:

[root@mogilenode1 httpd-2.2.34]# ./configure --prefix=/usr/local/apache2 --with-apr=/usr/local/apr2/ --with-apr-util=/usr/local/apr-util2/ --enable-ssl --enable-rewrite --enable-expires --enable-headers --enable-so --with-mpm=worker --enable-deflate(在其中prefix表示httpd的安裝路徑,然后是apr的路徑和apr-util的路徑,啟用ssl,主要是可以使用https協議,開放443端口,啟用重寫功能,從而可以跳轉,啟用緩存控制,啟用http頭部信息,啟用動態模塊加載,指定mpm為worker模式,啟用壓縮功能)

[root@mogilenode1 httpd-2.2.34]# make && make install

[root@mogilenode1 bin]# /usr/local/apache2/bin/httpd (啟動服務,表示apache安裝成功)

httpd: Could not reliably determine the server's fully qualified domain name, using 192.168.249.236 for ServerName

[root@mogilenode1 bin]# ps -ef|grep httpd

root     29185     1  0 16:59 ?        00:00:00 /usr/local/apache2/bin/httpd

daemon   29186 29185  0 16:59 ?        00:00:00 /usr/local/apache2/bin/httpd

daemon   29187 29185  0 16:59 ?        00:00:00 /usr/local/apache2/bin/httpd

daemon   29188 29185  0 16:59 ?        00:00:00 /usr/local/apache2/bin/httpd

daemon   29189 29185  0 16:59 ?        00:00:00 /usr/local/apache2/bin/httpd

    

查看httpd的版本

 

    可以直接使用curl來進行查看httpd版本,如下所示:

 

    在其中使用了tengine的進行比較,可以看到在Tengine里面,不會顯示服務器的具體版本信息,並且,在我們自己的編譯之中,連openssl的版本都顯示出來了,從而暴露了太多的信息,從而可以編輯配置文件,從而來隱藏版本,如下:

 

[root@mogilenode1 conf]# ls -l /usr/local/apache2/conf/httpd.conf (編輯httpd的主配置文件,在其中取消以下的注視,從而開啟httpd長連接並且可以隱藏httpd版本)

-rw-r--r-- 1 root root 13913 Sep  7 17:06 /usr/local/apache2/conf/httpd.conf

 

413 # Various default settings

414 Include conf/extra/httpd-default.conf

 

[root@mogilenode1 conf]# ls -l /usr/local/apache2/conf/extra/httpd-default.conf 

-rw-r--r-- 1 root root 2344 Sep  7 16:56 /usr/local/apache2/conf/extra/httpd-default.conf

 55 ServerTokens Prod

 65 ServerSignature Off

    上面的兩步,一個是為了加載httpd-default.conf配置文件,修改的55行修改為Prod,主要是在httpd的響應頭中無法看到web服務器的版本信息,而65行,主要是當出現404等錯誤的時候,不會顯示服務器的IP地址等信息。

    可以看到經過修改之后,響應的頭部信息不會出現了服務器的具體信息,修改配置之后,需要重啟httpd程序。

[root@mogilenode1 extra]# /usr/local/apache2/bin/httpd -k graceful (重新加載配置文件,不會中斷httpd服務)

開啟httpd緩存控制功能

 

    在沒有開啟緩存控制功能的時候,查看緩存控制策略如下所示:

    

    進行httpd的配置,使用expires模塊,修改配置主配置文件httpd.conf,添加內容如下:

<IfModule mod_expires.c>

    ExpiresActive On

    ExpiresDefault "access plus 12 month"

    ExpiresByType text/html "access plus 3 month"

</IfModule>

    以上的表示,當存在緩存模塊的時候,那么這段配置就會生效,第一行表示啟用緩存控制,第二行表示默認情況下都緩存一年,第三行表示根據MIME格式進行划分,以上表示如果類型為html,那么就緩存三個月。再次查看頭部信息如下:

 

    可以從上面看到已經設置了過期時間,而且是一年,也就是說使用的是默認設置,在http的頭部信息Cache-Control和Expires字段中可以看到緩存的時間,在下面圖中也可以看到緩存時間。

    

    使用headers來進行設置緩存控制時間,如下配置(表示在頭部信息中直接添加一個首部控制信息):

<IfModule mod_headers.c>

    header set cache-control "max-age=36500"

</IfModule>


    查看結果如下:

 

 

   

使用緩存的優缺點

 

    在使用緩存的時候,優點就是主要是提高靜態資源的訪問速度,從而提高用戶的性能,提高用戶體驗;減少在傳輸的時候占用的帶寬,從而節省成本

 

    在使用緩存的時候,如果源文件的內容發生了改變,那么如何是好呢?一般的情況下可以使用修改文件的名稱來更新緩存,另外也可以使用條件式請求首部,就是每次會向服務器發送一個請求,你修改了嘛?主要就是使用的etag這個擴展信息,每次進行比對。

 

    當你在進行測試的時候,你會發現,只要文件內容發生了改變,那么就會變成新的內容,為什么呢?。。。你猜!!!!

 

    最后拋出一個圖,思索下,為啥!!!

 

 

公眾號:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM