您好,登錄后才能下訂單哦!
如何深度優化Apache,相信很多沒有經驗的人對此束手無策,為此本文總結了問題出現的原因和解決方法,通過這篇文章希望你能解決這個問題。
gzip可以極大的加速網站,使用gzip功能有時壓縮比率高到80%以上,最少都有40%以上,所以說gzip功能是非常強大的,還是不錯的。
在Apache2之后的版本,模塊名不叫gzip,而叫mod_deflate
未使用gzip時,網頁中傳輸文件的過程,如圖:
使用gzip時,網頁中傳輸文件的過程,如圖:
本次博文案例環境,可以參考博文:Apache的安裝部署及工作模式詳解
如果要使用gzip(deflate)的功能,一定要打開兩個模塊:
LoadModule deflate_module modules/mod_deflate.so //模塊的作用:對傳輸到客戶端的代碼進行gzip壓縮 LoadModule headers_module modules/mod_headers.so //模塊的作用:告訴客戶端的瀏覽器,傳輸的文件使用了gzip壓縮。如果不開啟的話,則無法正常顯示網頁內容
[root@localhost ~]# apachectl -M | grep deflate //檢查mod_deflate模塊是否安裝,如果沒有任何返回信息則表示沒有安裝
安裝方法有兩種:
編譯時添加“--enable-deflate”選項即可安裝;
使用DSO方式進行安裝;
本身Apache已經安裝完成,所以這里就是用DSO方式進行安裝了
[root@localhost ~]# cd /usr/src/httpd-2.4.23/modules/filters/ //切換到Apache源碼包mod_deflate所在的目錄下 [root@localhost filters]# /usr/local/http-2.4.23/bin/apxs -c -i -a mod_deflate.c //使用apxs命令進行安裝
apxs命令參數的解釋:
-i:表示需要執行安裝操作,以安裝一個或多個動態共享對象到服務器的modules目錄中;
-a:表示會自動增加一個 LoadModule 行到 httpd.conf 文件中,以啟用此模塊,或者,如果 此行已經存在,則啟用之;
-c:表示需要執行編譯操作。
在安裝過程中會出現這樣的錯誤信息,如圖:
這樣的錯誤信息即表示缺少zlib-devel的安裝包,使用“yum -y install zlib-devel”即可,再次重新安裝mod_deflate模塊!
[root@localhost filters]# ll /usr/local/http-2.4.23/modules/mod_deflate.so -rwxr-xr-x. 1 root root 98160 11月 22 18:53 /usr/local/http-2.4.23/modules/mod_deflate.so //確認文件已經存在
檢查Apache主配置文件出現以下情況:
[root@localhost ~]# apachectl -t httpd: Syntax error on line 104 of /usr/local/http-2.4.23/conf/httpd.conf: Cannot load modules/mod_deflate.so into server: /usr/local/http-2.4.23/modules/mod_deflate.so: undefined symbol: inflate
解決方法:
需要在Apache主配置文件的 LoadModule deflate_module modules/mod_deflate.so 這行的上一行添加LoadFile /usr/local/zlib/lib/libz.so
即可,如圖:
[root@localhost ~]# apachectl -t Syntax OK //檢查其配置文件沒有錯誤 [root@localhost ~]# apachectl restart //重新啟動Apache服務
接下來修改Apache主配置文件,使其開啟gzip壓縮傳輸功能:
LoadModule deflate_module modules/mod_deflate.so //這個模塊的作用:對傳輸到客戶端的代碼進行gzip壓縮 LoadModule headers_module modules/mod_headers.so //這個模塊的作用:告訴客戶端的瀏覽器,傳輸的文件使用了gzip壓縮。如果不開啟的話,則無法正常顯示網頁內容 //查看Apache主配置文件必須保證這兩個模塊已經被啟用
在Apache主配置文件中(個人建議在末尾)添加如下內容:
<IfModule mod_deflate.c> //表示需要啟用mod_deflate模塊 DeflateCompressionLevel 9 //壓縮程度的等級 SetOutputFilter DEFLATE //設置輸出過濾器,對輸出啟用壓縮功能 AddOutputFilterByType DEFLATE text/* //設置對文件是文本格式的進行壓縮 SetEnvIfNoCase Reques t_URI .(?:gif|jpe?g|png)$ no-gzip dont-vary //設置不對后綴為 gif,jpg,jpeg,png 的圖片文件進行壓縮。?:表示不會捕獲 ( )里內容了 </IfModule> //以下內容是設置日志輸出 DeflateFilterNote Input input_info //聲明輸入流的 byte 數量 DeflateFilterNote Output output_info //聲明輸出流的 byte 數量 DeflateFilterNote Ratio ratio_info //聲明壓縮的百分比 LogFormat '"%r" %{output_info}n/%{input_info}n (%{ratio_info}n%%)' deflate //聲明日志格式 CustomLog logs/deflate_log.log deflate //指定日志的存放路徑
考慮到粘貼復制的問題,這里附上Apache文件中添加的內容(不帶注釋)
<IfModule mod_deflate.c> DeflateCompressionLevel 9 SetOutputFilter DEFLATE AddOutputFilterByType DEFLATE text/* SetEnvIfNoCase Request_URI .(?:gif|jpe?g|png)$ no-gzip dont-vary </IfModule> DeflateFilterNote Input input_info DeflateFilterNote Output output_info DeflateFilterNote Ratio ratio_info LogFormat '"%r" %{output_info}n/%{input_info}n (%{ratio_info}n%%)' deflate CustomLog logs/deflate_log.log deflate
修改完成之后,重新啟用Apache服務,并使用瀏覽器進行測試(使用F12開啟開發者模式,并使用F5進行刷新),如圖:
[root@localhost ~]# cat /usr/local/http-2.4.23/logs/deflate_log.log //查看deflate的日志(日志路徑在配置文件中已經定義) "GET / HTTP/1.1" -/- (-%) "GET /favicon.ico HTTP/1.1" -/- (-%) "GET / HTTP/1.1" -/- (-%) "GET / HTTP/1.1" 76/4725 (1%) "GET / HTTP/1.1" 76/4725 (1%) //可以看出壓縮比例達到了99% "-" -/- (-%)
注意:圖片是不需要被壓縮的,flash的swf文件也是不用壓縮的(這兩個東西壓縮之后會出現意想不到的效果)
Apache的緩存設置主要依賴于 mod_expires 模塊 ,啟用模塊后,可以減少20%~30%左右的重復請求,讓重復的用戶請求結果都緩存在本地。注意更新快的文件不要這么做。
mod_expires模塊控制服務器應答時的 Expires 頭內容和 Cache-Control 頭的 max-age 指令。有效期 (expiration date)可以設置為相對于源文件的最后修改時刻或者客戶端的訪問時刻。
未啟用 mod_expires模塊expire緩存的效果:
啟用mod_expires模塊expire緩存,方法如下:
LoadModule expires_module modules/mod_expires.so //查看Apache的主配置文件,必要要保證這個模塊被啟用
然后在Apache主配置文件末尾添加以下內容:
<IfModule mod_expires.c> //表示啟用expires模塊 ExpiresActive On //啟用expires功能 ExpiresByType text/html "access plus 2 minute" //設置后綴為html的文本文件保存時間為兩分鐘 ExpiresByType image/jpeg "access plus 1 mouth" //設置后綴為jpeg的圖片信息保存時間為一個月 ExpiresDefault "now plus 0 minute" //其他默認沒有被定義的不進行緩存 </IfModule>
不帶注釋的配置文件:
<IfModule mod_expires.c> ExpiresActive On ExpiresByType text/html "access plus 2 minute" ExpiresByType image/jpeg "access plus 1 mouth" ExpiresDefault "now plus 0 minute" </IfModule>
測試效果如下:
緩存機制的配置格式:
ExpiresByType type/encoding "<base> [plus] {<num><type>}" ExpiresDefault "<base> [plus] {<num><type>}"
1、其中<base>是下列之一:
access(相對于客戶端訪問的時間)
now(相當于access)
modification(相對于最后一次修改源文件后的緩存時間)
2、該plus關鍵字是可選的。num 應該是整數值,并且type是以下之一:
years
months
weeks
days
hours
minutes
seconds
也可以使用以下格式來定義緩存機制:
ExpiresByType image/jpeg A2592000 //表示圖片的緩存是1個月 ExpiresByType text/html M604800 //表示HTML文檔的有效期是最后修改時刻后的一星期 //"M"表示源文件的最后修改時刻,"A"表示客戶端對源文件的訪問時刻。后面的時間則以秒計 算。
具體介紹可以參考官方文檔
訪問Apache時,默認訪問的時Apache網頁根目錄下的index.html,如何這個文件不存在的話,就會出現以下情況:
為了防止出現以上情況需要修改Apache的配置文件:
重新啟動服務之后,就會出現這種情況:
不進行修改,默認的版本信息:
這樣輕易的出現在互聯網上,顯然是不安全的。可以通過以下操作進行優化處理,方法如下:
在Apache主配置文件中啟用 httpd-default.conf Include conf/extra/httpd-default.conf //去除之前的#號 [root@localhost ~]# vim /usr/local/http-2.4.23/conf/extra/httpd-default.conf //找到 ServerTokens Full ServerSignature On //修改為以下內容 ServerTokens Prod ServerSignature Off
重新啟動服務之后,再次進行查看:
如果需要徹底的改變版本之類的信息,那么需要在編譯之前,修改源碼包下 include 目錄下的 ap_release.h 。
[root@localhost ~]# vim /usr/src/httpd-2.4.23/include/ap_release.h //這是本人的解壓路徑,各位根據實際情況 //修改的內容如下: #define AP_SERVER_BASEVENDOR "Apache Software Foundation" //服務的供應商名稱 #define AP_SERVER_BASEPROJECT "Apache HTTP Server" //服務的項目名稱 #define AP_SERVER_BASEPRODUCT "Apache" //服務的產品名 #define AP_SERVER_MAJORVERSION_NUMBER 2 //主要版本號 #define AP_SERVER_MINORVERSION_NUMBER 4 //小版本號 #define AP_SERVER_PATCHLEVEL_NUMBER 23 //補丁級別 #define AP_SERVER_DEVBUILD_BOOLEAN 0 //上述行無需將行首的“#”號刪除
根據注釋修改成自己想要的,編譯安裝即可!
隨著網站的訪問量越來越大,產生的日志文件也就會越來越大,如果不對日志進行分隔處理,日志文件會越存越大,不易備份,而且只能一次性將Apache的日志全部刪除,這樣就會丟失很多對網站寶貴的信息,因此管理好這些海量的日志對網站來說十分重要。
對日志進行分隔處理可以通過以下兩種方法:
修改Apache的主配置文件,更改內容如下: //找到以下兩行,進行注釋: ErrorLog logs/error_log CustomLog logs/access_log common //然后最好在CustomLog "logs/access_log" common配置的下一行添加如下內容(以下內容不可以直接復制,請看下面的解釋): ErrorLog "|/usr/local/http-2.4.23/bin/rotatelogs -l logs/error_%Y-%m-%d.log 86400" CustomLog "|/usr/local/http-2.4.23/bin/rotatelogs -l logs/access_%Y-%m-%d.log 86400" combined //這里是要填寫rotatelogs工具的絕對路徑
在上面添加的內容中,86400為輪轉的時間,單位是秒(也就是一天生成一個日志文件)。
[root@localhost ~]# systemctl restart httpd //重啟Apache服務 [root@localhost ~]# ls /usr/local/http-2.4.23/logs/ access_2019-11-23.log access_log error_2019-11-23.log error_log httpd.pid //查看日志文件,第一次可能只會出現錯誤日志,訪問一下,訪問日志即可產生
這樣就已經實現了日志按天進行分割存放!
由于 apache 自帶的日志輪詢工具 rotatelogs,據說在進行日志切割時容易丟日志,因此我們通常使用 cronolog (也就是方法2)進行日志輪詢。
同樣也是在Apache的主配置文件中注釋掉以下兩行: ErrorLog "logs/error_log" CustomLog "logs/access_log" common
下載cronolog源碼包
[root@localhost ~]# tar zxf cronolog-1.6.2.tar.gz -C /usr/src [root@localhost ~]# cd /usr/src/cronolog-1.6.2/ [root@localhost cronolog-1.6.2]# ./configure && make && make install //解壓之后進行編譯安裝 [root@localhost ~]# vim /usr/local/http-2.4.23/conf/httpd.conf //編輯Apache的主配置文件 //將方法1中寫入的日志切割配置項刪除,寫入下面的兩行配置 CustomLog "|/usr/local/sbin/cronolog logs/access-%Y-%m-%d.log" combined ErrorLog "|/usr/local/sbin/cronolog logs/error-%Y-%m-%d.log" //同樣這里寫的也是cronolog工具的絕對路徑 為了更好的進行測試,建議將原本的日志文件進行刪除、移動操作 [root@localhost ~]# rm -rf /usr/local/http-2.4.23/logs/*log [root@localhost ~]# ls /usr/local/http-2.4.23/logs/ httpd.pid [root@localhost ~]# ls /usr/local/http-2.4.23/logs/ access-2019-11-23.log error-2019-11-23.log httpd.pid //測試訪問一下,訪問日志和錯誤日志即可產生
這樣就已經實現了日志按天進行分割存放!
如果 Apache 中有多個虛擬主機,最好每個虛擬主機中放置一個這樣的代碼,并將日志文件名改成不同的名字。
如果網站的訪問實在太大,也可以進行按小時分隔,方法如下:
基于第二種方法實現:
[root@localhost ~]# vim /usr/local/http-2.4.23/conf/httpd.conf //將原本的兩行配置內容修改如下: CustomLog "|/usr/local/sbin/cronolog logs/access-%Y-%m-%d.log.%H" combined ErrorLog "|/usr/local/sbin/cronolog logs/error-%Y-%m-%d.log.%H" //就是在原本的配置上添加了“%H”表示按小時進行分隔 [root@localhost ~]# systemctl restart httpd //重啟Apache服務
自行進行測試訪問,接下來查看日志文件,如圖:
生產環境下,常用方法:
按天輪詢: CustomLog "|/usr/local/sbin/cronolog logs/access_www_%Y%m%d.log" combined 按小時輪詢: CustomLog "|/usr/local/sbin/cronolog logs /access_www_ %Y%m%d%H.log" combined
注意: 這兩個管道日志文件程序還有一點不同之處是使用 cronolog 時如果日志是放在某個不存 在的路徑則會自動創建目錄,而使用 rotatelogs 時不能自動創建,這一點要特別注意 !
有時候會突然發現網站的訪問量越來越,千萬不要高興的太早,很有可能是被別人盜鏈了。打個比方說:你自己搭建了一個視頻網站,然后別人將他網站上的視頻的地址重定向到你的服務器上。這樣你的網站訪問量就會越來越大,消耗的資源也就越來越多!如何避免這種可能的發生,那么就需要使用防盜鏈。
首先要確認Apache的rewrite module模塊已經安裝,可用: [root@localhost ~]# apachectl -M | grep rewrite rewrite_module (shared)
接下來編寫Apache的主配置文件
[root@localhost ~]# vim /usr/local/http-2.4.23/conf/httpd.conf LoadModule rewrite_module modules/mod_rewrite.so //找到這一行,默認是注釋的,將#號刪除即可 …………………… <Directory "/usr/local/http-2.4.23/htdocs"> //以下內容必須寫在網站的根目錄下 RewriteEngine On RewriteCond %{HTTP_REFERER} !^$ RewriteCond %{HTTP_REFERER} !^http://192.168.1.1/.*$ [NC] RewriteRule .*\.(gif|jpg|swf)$ http://192.168.1.1/about/error.png [R,NC,L] </Directory>
添加的內容相關解釋:
RewriteEngine On //啟用rewrite(地址重定向)功能,必須填寫;
RewriteCond %{HTTP_REFERER} !^$ //允許用戶在瀏覽器直接測試訪問
RewriteCond %{HTTP_REFERER} !^http://192.168.1.1/.*$ [NC] //允許通過192.168.1.1的地址進行訪問
RewriteRule .*.(gif|jpg|swf)$ http://192.168.1.1/about/error.png [R,NC,L] //將不滿足以上策略的、后綴名為gif、jpg、swf的文件全部重定向到網頁根目錄的about目錄中的error.png,要相當注意,about目錄下的error.png文件存在,不然,警告信息和圖片將無法在對方網站上顯示。
詳細介紹如圖:
注意:測試時要清除瀏覽器緩存
下面進行測試:
實驗環境有192.168.1.1(A)網站服務器和192.168.1.2(B)網站服務器,配置如下:
A服務器:
[root@localhost ~]# apachectl -M | grep rewrite rewrite_module (shared) [root@localhost ~]# vim /usr/local/http-2.4.23/conf/httpd.conf LoadModule rewrite_module modules/mod_rewrite.so //找到這一行,默認是注釋的,將#號刪除即可 …………………… <Directory "/usr/local/http-2.4.23/htdocs"> //以下內容必須寫在網站的根目錄下 RewriteEngine On RewriteCond %{HTTP_REFERER} !^$ RewriteCond %{HTTP_REFERER} !^http://192.168.1.1/.*$ [NC] RewriteRule .*\.(gif|jpg|swf)$ http://192.168.1.1/about/error.png [R,NC,L] </Directory> [root@localhost ~]# ll /usr/local/http-2.4.23/htdocs/ 總用量 64 drwxr-xr-x. 2 root root 23 11月 25 14:45 about -rw-r--r--. 1 root root 60108 11月 24 10:02 access.jpg //確保文件存在 -rw-r--r--. 1 root root 45 6月 12 2007 index.html [root@localhost ~]# ll /usr/local/http-2.4.23/htdocs/about 總用量 236 -rw-r--r--. 1 root root 240595 11月 24 10:01 error.png //確保文件存在 [root@localhost ~]# apachectl restart //重新啟動httpd服務器
B服務器:
[root@localhost ~]# yum -y install httpd //為了方便 起見,使用yum的方式安裝httpd服務 [root@localhost ~]# vim /var/www/html/index.html <a href="http://192.168.1.1/access.jpg">鏈接</a> //手動安裝的httpd的主頁文件做一個超鏈接連接到A服務器的根目錄下的access.jpg //訪問時會出現一個鏈接的超鏈接
這樣當客戶端訪問B服務器時就會查看到error.png(訪問的本意是訪問access.jpg)
也可以讓客戶端的鏈接過來的時候訪問到錯誤頁面,方法如下:
修改A服務器的配置文件:
[root@localhost ~]# vim /usr/local/http-2.4.23/conf/httpd.conf …………………… //省略部分內容 RewriteEngine On RewriteCond %{HTTP_REFERER} !^$ RewriteCond %{HTTP_REFERER} !^http://192.168.1.1/.*$ [NC] #RewriteRule .*\.(gif|jpg|swf)$ http://192.168.1.1/about/error.png [R,NC,L] //將這條進行注釋 RewriteRule .*\.(gif|jpg|png)$ - [F] //(強制 URL 為被禁止的 forbidden),強制當前 URL 為被禁止的,即,立即反饋一 個 HTTP 響應代碼 403(被禁止的) [root@localhost ~]# systemctl restart httpd //重新啟動httpd服務
再次訪問就會出現這樣的情況:
注意清除瀏覽器緩存
這樣就證明了防盜鏈的作用!
也就是利用 SetEnvIfNoCase 和 access。 這個方法可以通過阻止某些機器人或蜘蛛爬蟲抓取你的網站來節省你的帶寬流量。 語法: SetEnvIfNoCase attribute regex [!]env-variable[=value] [[!]env-variable[=value]] ... SetEnvIfNoCase 當滿足某個條件時,為變量賦值,即根據客戶端請求屬性設置環境變量。 注:Referer :指明了請求當前資源原始資源的 URL,使用 referer 是可以防盜鏈 然后在找到自己網站對應的配置的地方(如在主配置文件中或虛擬主機
中),加入下列代碼:
SetEnvIfNoCase Referer "^$" local_ref SetEnvIfNoCase Referer"^http://www.benet.com/.*$" local_ref SetEnvIfNoCase Referer"^http://benet.com/.*$"local_ref <filesmatch"\.(mp3|mp4|zip|rar|jpg|gif|png)">
通過判斷referer變量的值,來判斷圖片或資源的引用是否合法,只有在根據配置符合設定需求范圍內的referer,這樣的網站內容,才能調用訪問指定的資源內容,從而實現了資源被網站盜鏈的目的。需要注意的是:是所有的用戶代理(瀏覽器)都會設置referer變量,而且有的還可以手工修改erferer,referer是可以被偽造的,上面的配置只是一種簡單的防護手段。應付一般的盜鏈足矣。
當網站被盜鏈,一般可以采取以下措施:
對本站的圖片、視頻、音頻等文件標上自己的站名品牌或者相關水印;
設置防火墻,從源頭IP進行控制
設置防盜鏈(根據referer機制)
網站被非法盜鏈使用,會導致網站帶寬成本加大以及服務器壓力加大,嚴重時會導致巨額的網站及正常用戶訪問受到影響。
看完上述內容,你們掌握如何深度優化Apache的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。