天天看點

Web 伺服器-Apache詳解

文章目錄

    • 一、講在 Apache 之前
    • 二、Apache 詳解
      • 2.1 概述
      • 2.2 工作模式
        • 修改方式:
      • 2.3 相關檔案儲存位置
      • 2.4 配置檔案詳解
      • 2.5 Apache 實驗
        • 2.5.1 Apache 的目錄别名
        • 2.5.2 Apache 的使用者認證
        • 2.5.3 虛拟主機(重點)
          • 實驗準備:
          • 試驗步驟:
        • 2.5.4 域名跳轉
        • 2.5.5 Apache+openssl 實作 https(重點)
        • 2.5.6 Apache 日志切割
        • 2.5.7 不記錄指定檔案類型的日志
        • 2.5.8 Apache 配置靜态緩存
        • 2.5.8 Apache 禁止解析 PHP

一、講在 Apache 之前

  • HTML語言: 超文本标記語言,使用html語言編寫的文本叫超文本,“超文本”就是指頁面内可以包含圖檔、連結,甚至音樂、程式等非文字元素。
  • HTTP協定: 超文本傳輸協定HTTP使用統一資源辨別符(URL)來建立連接配接和傳輸資料。是一個基于TCP/IP通信協定來傳遞資料的協定,屬于應用層協定。
  • URL: 統一資源定位符,統一資源定位符是對可以從網際網路上得到的資源的位置和通路方法的一種簡潔的表示,是網際網路上标準資源的位址。

    格式:

    http://www.baidu.com:80/image/a.jpg

URI:統一資源标志符,URI與URL都是定位資源位置的,就是表示這個資源的位置資訊,就像經緯度一樣可以表示你在世界的哪個角落。URI是一種寬泛的含義更廣的定義,而URL則是URI的一個子集,就是說URL是URI的一部分。

二、Apache 詳解

Web 伺服器-Apache詳解

2.1 概述

  • Apache是世界使用排名第一的Web伺服器軟體

    。它可以運作在幾乎所有廣泛使用的計算機平台上,由于其跨平台和安全性被廣泛使用,是最流行的Web伺服器端軟體之一。它快速、可靠并且可通過簡單的API擴充,将Perl/Python/php等解釋器編譯到伺服器中。
  • Apache有多種産品,可以支援SSL技術,支援多個虛拟主機

    。Apache是以程序為基礎的結構,程序要比線程消耗更多的系統開支,不太适合于多處理器環境,是以,在一個Apache Web站點擴容時,通常是增加伺服器或擴充群集節點而不是增加處理器。到目前為止Apache仍然是世界上用的最多的Web伺服器,市場占有率達60%左右。

2.2 工作模式

Apache一共有3種穩定的MPM模式(MPM:多程序處理子產品),它們分别是

prefork、worker、event

  • prefork 工作模式

    Apache在啟動之初,就預先fork一些子程序,然後等待請求進來。之是以這樣做,是為了減少頻繁建立和銷毀程序的開銷。每個子程序隻有一個線程,在一個時間點内,隻能處理一個請求。

    優點:

    成熟穩定,相容所有新老子產品。同時,不需要擔心線程安全的問題。

    缺點:

    一個程序相對占用更多的系統資源,消耗更多的記憶體。而且,它并不擅長處理高并發請求。

Web 伺服器-Apache詳解
  • worker 工作模式

    使用了多程序和多線程的混合模式。它也預先fork了幾個子程序(數量比較少),然後每個子程序建立一些線程,同時包括一個監聽線程。每個請求過來,會被配置設定到1個線程來服務。線程比起程序會更輕量,因為線程通常會共享父程序的記憶體空間,是以,記憶體的占用會減少一些。在高并發的場景下,因為比起prefork有更多的可用線程,表現會更優秀一些。

    優點:

    占據更少的記憶體,高并發下表現更優秀。

    缺點:

    必須考慮線程安全的問題。

  • event 工作模式

    它和worker模式很像,最大的差別在于,它解決了keep-alive場景下,長期被占用的線程的資源浪費問題。event MPM中,會有一個專門的線程來管理這些keep-alive類型的線程,當有真實請求過來的時候,将請求傳遞給服務線程,執行完畢後,又允許它釋放。這樣增強了高并發場景下的請求處理能

    力。

    HTTP采用keepalive方式減少TCP連接配接數量,但是由于需要與伺服器線程或程序進行綁定,導緻一個繁忙的伺服器會消耗完所有的線程。Event MPM是解決這個問題的一種新模型,它把服務程序從連接配接中分離出來。在伺服器處理速度很快,同時具有非常高的點選率時,可用的線程數量就是關鍵的資源限制,此時Event MPM方式是最有效的,但不能在HTTPS通路下工作。

Web 伺服器-Apache詳解

檢視方式:

指定方式:

在編譯時,在選項中指定,

--with-mpm=工作模式

修改的話:在configure時,可以通過指定參數,将工作模式設定為worker模式或prefork模式。

使用指令:

./configure –with-mpm=worker

修改方式:

[[email protected] ~]$ vim /usr/local/apache2/etc/httpd.conf
Include conf/extra/httpd-mpm.conf (去掉該行前面的注釋符号"#")

[[email protected] ~]$ vim /usr/local/apache2/etc/extra/httpd-mpm.conf
<IfModule mpm_prefork_module>
    #伺服器啟動時建立的子程序數量
    StartServers          5 

    #空閑子程序的最小數量,預設5;如果目前空閑子程序數少于MinSpareServers ,那麼Apache将會産生新的子程序。此參數不要設的太大。
    MinSpareServers       5  

    #空閑子程序的最大數量,預設10;如果目前有超過MaxSpareServers數量的空閑子程序,那麼父程序會殺死多餘的子程序。此參數也不需要設定太大,如果你将其設定比 MinSpareServers 小,Apache會自動将其修改為MinSpareServers+1。
    MaxSpareServers      10

    #限定伺服器同一時間内用戶端最大接入的請求數量,預設是150;任何超過了該限制的請求都要進入等待隊列,一旦一個個連接配接被釋放,隊列中的請求才将得到服務。
    MaxClients          150

    #每個子程序在其生命周期内允許最大的請求數量,如果請求總數已經達到這個數值,子程序将會結束,如果設定為0,子程序将永遠不會結束。若該值設定為非0值,可以防止運作PHP導緻的記憶體洩露。
    MaxRequestsPerChild   0
</IfModule>


####################################################


<IfModule mpm_worker_module>
    #伺服器啟動時建立的子程序數量
    StartServers          2

    #限定伺服器同一時間内用戶端最大接入的請求數量,預設是150;任何超過了該限制的請求都要進入等待隊列,一旦一個個連接配接被釋放,隊列中的請求才将得到服務。
    MaxClients          150

    #空閑子程序的最小數量
    MinSpareThreads      25

    #空閑子程序的最大數量
    MaxSpareThreads      75 

    #每個子程序産生的線程數量
    ThreadsPerChild      25

    #每個子程序在其生命周期内允許最大的請求數量,如果請求總數已經達到這個數值,子程序将會結束,如果設定為0,子程序将永遠不會結束。将該值設定為非0值,可以防止運作PHP導緻的記憶體洩露。
    MaxRequestsPerChild   0
</IfModule>



####################################################

<IfModule mpm_worker_module>
    #伺服器啟動時建立的子程序數量
    StartServers             3

    #空閑子程序的最小數量
    MinSpareThreads         75

    #空閑子程序的最小數量
    MaxSpareThreads        250

    #每個子程序産生的線程數量
    ThreadsPerChild         25

    #限定伺服器同一時間内用戶端最大接入的請求數量,預設是150;任何超過了該限制的請求都要進入等待隊列,一旦一個個連接配接被釋放,隊列中的請求才将得到服務。
    MaxRequestWorkers      400

    #每個子程序在其生命周期内允許最大的請求數量,如果請求總數已經達到這個數值,子程序将會結束,如果設定為0,子程序将永遠不會結束。将該值設定為非0值,可以防止運作PHP導緻的記憶體洩露。
    MaxRequestsPerChild   0
</IfModule>
           

2.3 相關檔案儲存位置

配置檔案位置:

  源碼包安裝:

PREFIX/etc/httpd.conf(主配置檔案)

         

PREFIX/etc/extra/*.conf(子配置檔案)

  rpm包安裝:

/etc/httpd/conf/httpd.conf

網頁檔案位置:

  源碼包安裝:

PREFIX/htdocs/

  rpm包安裝:

/var/www/html/

日志檔案位置:

  源碼包安裝:

PREFIX/logs/

  rpm包安裝:

/var/log/httpd/

2.4 配置檔案詳解

注意:apache配置檔案嚴格區分大小寫

針對主機環境的基本配置參數

ServerRoot /usr/local/apache2    #apache主目錄
Listen :80                       #監聽端口
LoadModule php7                  #加載的相關子產品
User
Group                  #使用者群組
ServerAdmin            #管理者郵箱
ServerName             #伺服器名(沒有域名解析時,使用臨時解析。預設不開啟)
ErrorLog "logs/error_log"             #伺服器錯誤日志
CustomLog "logs/access_log" common    #通路記錄日志
DirectoryIndex index.html index.php   #預設網頁檔案名,優先級順序
Include etc/extra/httpd-vhosts.conf   #子配置檔案中内容也會加載生效
           

首頁目錄及權限

DocumentRoot "/usr/local/apache2/htdocs" 
#網頁檔案存放目錄(預設)
<Directory "/usr/local/apache2/htdocs">
	#定義指定目錄的權限
	Options Indexes FollowSymLinks
		None            #沒有任何額外權限
		All             #所有權限(除去MultiViews以外)
		Indexes         #浏覽權限(當此目錄下沒有預設網頁檔案時,顯示目錄内容)
		
		FollowSymLinks  #準許軟連接配接到其他目錄
		MultiViews      #準許檔案名泛比對(需要手動開啟子產品才有效negotiation)
	AllowOverride None
	#定義是否允許目錄下.htaccess檔案中的權限生效
		None           #.htaccess中權限不生效
		All            #檔案中所有權限都生效
		AuthConfig     #檔案中,隻有網頁認證的權限生效
	Require all granted(denied) #通路控制清單
</Directory>

<IfModule dir_module> #此标簽用來指定通路到指定目錄時自動加載哪個頁面檔案
 	DirectoryIndex index.php index.html #可以寫多個,但是有優先級之分
</IfModule>
           

2.5 Apache 實驗

實驗環境: 建議使用之前搭建好的 lamp 環境進行試驗測試

2.5.1 Apache 的目錄别名

當 apache 接受請求時,在預設情況下會将 DocumentRoot 目錄中的檔案送到用戶端,如果想将某一不在 DocumentRoot 目錄中的檔案共享到網站上,并希望将它們留在本來位置而不需要進行移動的話,處理這種情況可以通過建立别名的方式将 URL 指向特定的目錄

  1. 編輯主配置檔案
[[email protected] ~]$ vim /usr/local/apache2/etc/httpd.conf
 Include etc/extra/httpd-autoindex.conf    #去掉注釋,開啟調用子配置檔案
           
  1. 編輯子配置檔案
[[email protected] ~]$ vim /usr/local/apache2/etc/extra/httpd-autoindex.conf
 alias /a/ "/a/b/c/"
 #結構:别名           "真實目錄"                #真實目錄的結尾要有/,否則報錯
 
 <Directory "/a/b/c/">
		Options Indexes FollowSymLinks
		AllowOverride None
		Require all granted
 </Directory>
#可以根據模闆編寫一個自己需要的目錄别名

[[email protected] ~]$ mkdir -p /a/b/c/  && echo "www.a.com" > /a/b/c/a.html

[[email protected] ~]$ /usr/local/apache2/bin/apachectl -t  #檢查配置檔案是否有問題

[[email protected] ~]$ /usr/local/apache2/bin/apachectl restart  #重新開機服務
           

2.5.2 Apache 的使用者認證

有時候,我們需要給一些特殊的通路設定一個使用者認證機制,增加安全。比如我們的個人網站,一般都是有一個管理背景的,雖然管理背景本身就有密碼,但我們為了更加安全,可以再設定一層使用者身 份認證。

  1. 編輯配置檔案
[[email protected] ~]$ cd /usr/local/apache2/htdocs/
[[email protected] ~]$ mkdir admin  && echo "www.a.com" > admin/index.html

[[email protected] ~]$ vim /usr/local/apache2/etc/httpd.conf
#在需要進行登入認證的目錄标簽中加入如下配置:
<Directory "/usr/local/apache2/htdocs/admin"> #聲明被保護目錄
	Options Indexes FollowSymLinks
	AllowOverride All #開啟權限認證檔案.htaccess
	Require all granted
</Directory>
           
  1. 在指定目錄下建立權限檔案

切換到

/usr/local/apache2/htdocs/admin

,建立

.htaccess

檔案,并添加下面的内容

[[email protected] ~]$ ln -s /usr/local/apache2/bin/* /usr/local/bin/
[[email protected] ~]$ cd /usr/local/apache2/htdocs/admin
[[email protected] ~]$ vim .htaccess
AuthName "Welcome to apache" #提示資訊
AuthType basic       #加密類型

AuthUserFile /usr/local/apache2/htdocs/admin/apache.passwd
#密碼檔案,檔案名自定義。(使用絕對路徑)

require valid-user
#允許密碼檔案中所有使用者通路
           
  1. 建立密碼檔案,加入允許通路的使用者。(此使用者和系統使用者無關)
[[email protected] ~]$ /usr/local/apache2/bin/htpasswd -c /usr/local/apache2/htdocs/admin/apache.passwd test1
#-c 建立密碼檔案,隻有添加第一個使用者時,才能-c 
New password: 
Re-type new password: 
Adding password for user test1


[[email protected] ~]$ /usr/local/apache2/bin/htpasswd -m /usr/local/apache2/htdocs/admin/apache.passwd test2
#-m 再添加更多使用者時,使用-m 參數
New password: 
Re-type new password: 
Adding password for user test2

           

注意: htpasswd 該指令是 httpd 的指令,需要絕對路徑

  1. 重新開機 apache 服務
[[email protected] ~]$ /usr/local/apache2/bin/apachectl -t

[[email protected] ~]$ /usr/local/apache2/bin/apachectl restart
           

先檢查配置是否正确,然後通過浏覽器輸入要通路的資源時就會提示輸入密碼了。

2.5.3 虛拟主機(重點)

虛拟主機,也叫“網站空間”,就是把一台運作在網際網路上的實體伺服器劃分成多個“虛拟”伺服器。虛拟主機技術極大的促進了網絡技術的應用和普及。同時虛拟主機的租用服務也成了網絡時代的一種新型經濟形式。

虛拟主機的分類:

基于 IP 的虛拟主機:一台伺服器,多個 ip,搭建多個網站

基于端口的虛拟主機:一台伺服器,一個 ip,搭建多個網站,每個網絡使用不同端口通路

基于域名的虛拟主機:一台伺服器,一個 ip,搭建多個網站,每個網站使用不同域名通路

實驗準備:
  1. 域名解析:準備兩個域名

    www.sohu.com

    www.sina.com

    使用本地 hosts 檔案進行解析

[[email protected] ~]$ vim /etc/hosts
www.sohu.com
www.sina.com
           
  1. 網站首頁目錄規劃 在

    /htdocs/

    目錄下分别建立 sohu 和 sina 兩個目錄,并在建立目錄内建立 index.html 檔案(分别寫不一樣的内容)
[[email protected] ~]$ cd /usr/local/apache2/htdocs
[[email protected] ~]$ mkdir sina && echo "aaa" > sina/index.html
[[email protected] ~]$ mkdir sohu && echo "bbb" > sohu/index.html
           
試驗步驟:
  1. 修改主配置檔案開啟檔案關聯
[[email protected] ~]$ vim /usr/local/apache2/etc/httpd.conf
 Include etc/extra/httpd-vhosts.conf  #此行取消注釋
           
  1. 編輯子配置檔案,編寫虛拟主機标簽
[[email protected] ~]$ vim /usr/local/apache2/etc/extra/httpd-vhosts.conf
 #添加下方内容,有幾個虛拟主機就寫幾組(添加之前先把原先存在的示例删除掉)
<Directory "/usr/local/apache2/htdocs/sina">
	Options Indexes FollowSymLinks
	AllowOverride None
	Require all granted
</Directory>
 
 #目錄權限标簽根據需要自行添加
<VirtualHost 192.168.88.10:80>   #虛拟主機标簽,可以寫*
	ServerAdmin [email protected].com   #管理者郵箱
	DocumentRoot "/usr/local/apache2/htdocs/sina"   #網站主目錄
	ServerName www.sina.com   #完整域名
	ErrorLog "logs/sina-error_log"   #錯誤日志
	CustomLog "logs/sina-access_log" common   #通路日志
</VirtualHost>

<VirtualHost *:80>
        ServerAdmin [email protected].com
        DocumentRoot "/usr/local/apache2/htdocs/sohu"
        ServerName www.sohu.com
        ErrorLog "logs/sohu-error_log"
        CustomLog "logs/sohu-access_log" common
</VirtualHost>

           
  1. 重新開機服務,驗證結果
[[email protected] ~]$ apachectl restart
           

Windows 下: 浏覽器下輸入兩個不同的域名驗證網頁内容(提前修改 windows 的 hosts 檔案)

C:\Windows\System32\drivers\etc

Linux 下: 通過 elinks/curl 指令驗證:elinks/curl URL 位址(提前修改 windows 的 hosts 檔案)

2.5.4 域名跳轉

一個站點難免會有多個域名,而多個域名總得有一個主次,比如我的網站可以用兩個域名通路:www.sina.com 和 www.sohu.cn 但大家發現不管我用哪個域名通路,最終都會跳轉到 www.sina.com 上來。這個行為就叫做域名跳轉,

狀态碼:301 是永久跳轉,302 是臨時跳轉

,網站上一定要設定為 301,這樣對搜尋引擎是比較友好的。

實驗條件:

  1. 虛拟主機能正常通路
  2. 打開主配置檔案開啟重寫子產品
[[email protected] ~]$ vim /usr/local/apache2/etc/httpd.conf
LoadModule rewrite_module modules/mod_rewrite.so #取消注釋
           

實驗步驟:

  1. 修改虛拟主機配置檔案
[[email protected] ~]$ vim /usr/local/apache2/etc/extra/httpd-vhosts.conf 
<Directory "/usr/local/apache2/htdocs/sohu">
	Options Indexes FollowSymLinks
	AllowOverride All
	Require all granted
</Directory>
           
  1. 建立規則比對檔案
[[email protected] ~]$ vim /usr/local/apache2/htdocs/sohu/.htaccess
#在指定的網站目錄下建立檔案,并添加以下内容
RewriteEngine on
# 開啟rewrite功能
RewriteCond %{HTTP_HOST} ^www.sohu.com
# 把以www.sina.com 開頭的内容指派給HTTP_HOST變量
RewriteRule ^(.*)$ http://www.sina.com/$1 [R=permanent,L]
# ^(.*)$ 指代用戶端要通路的資源
# $1 把 .* 所指代的内容指派到$1變量中
# R=permanent 永久重定向 = 301
# L 指定該規則為最後一條生效的規則,以後的不再生效
           
  1. 重新開機伺服器并測試
[[email protected] ~]$ apachectl -t
[[email protected] ~]$ apachectl restart
           

通過上述測試,發現無論是 sina 或 sohu 最終都是通路到 www.sina.com 域名上來則試驗成功

2.5.5 Apache+openssl 實作 https(重點)

HTTPS(全稱:Hypertext Transfer Protocol Secure,超文本傳輸安全協定),是以安全為目标的 HTTP通道,簡單講是 HTTP 的安全版。即 HTTP 下加入 SSL 層,用于安全的 HTTP 資料傳輸。這個系統被内置于浏覽器中,提供了身份驗證與加密通訊方法。現在它被廣泛用于網際網路上安全敏感的通訊,例如交易支付方面。

  1. 準備工作

    檢查 Apache 是否支援 SSL,檢查相應子產品是否安裝,若安裝則将子產品啟用子產品存放目錄:

    /usr/local/apache2/modules

檢查子產品是否啟用

[[email protected] ~]$ apachectl -M 
           
  1. CA 證書申請

    生産環境需要去證書廠商購買

[[email protected] ~]$ cd /usr/local/apache2/
[[email protected] ~]$ mkdir cert && cd cert

[[email protected] ~]$ openssl genrsa -out ca.key 2048
#建立伺服器私鑰,生成 RSA 密鑰

[[email protected] ~]$ openssl req -new -key ca.key -out demo.csr
#需要依次輸入國家,地區,城市,組織,組織機關,Email 等資訊。最重要的是有一個 common name,可以寫你的名字或者域名。如果為了 https 申請,這個必須和域名吻合,否則會引發浏覽器警報。生成的 csr 檔案交給 CA 簽名後形成服務端自己的證書

[[email protected] ~]$ openssl x509 -req -days 365 -sha256 -in demo.csr -signkey ca.key -out demo.crt
#使用 CA 伺服器簽發證書,設定證書的有效期等資訊

           

注意 1:生成完秘鑰和證書檔案後,将檔案存放在 Apache 的安裝目錄下的 cert 目錄下

注意 2:在生産環境中必須要在 https證書廠商注冊(否則浏覽器不識别)

  1. 配置檔案修改

    調用 ssl 子產品,并啟用 ssl 獨立配置檔案

[[email protected] ~]$ vim /usr/local/apache2/etc/httpd.conf
LoadModule ssl_module modules/mod_ssl.so #取消注釋
Include etc/extra/httpd-ssl.conf #取消注釋
           

修改

extra/httpd-ssl.conf

配置檔案,調用證書等檔案

[[email protected] ~]$ vim /usr/local/apache2/etc/extra/httpd-ssl.conf
#原本的注釋掉

#添加 SSL 協定支援協定,去掉不安全的協定
SSLProtocol all -SSLv2 -SSLv3
 
#修改加密套件如下
SSLCipherSuite HIGH:!RC4:!MD5:!aNULL:!eNULL:!NULL:!DH:!EDH:!EXP:+MEDIUM
SSLHonorCipherOrder on
 
#證書公鑰配置(簽字的)
SSLCertificateFile cert/demo.crt
 
#證書私鑰配置
SSLCertificateKeyFile cert/ca.key
           

修改主配置檔案,添加虛拟主機

[[email protected] ~]$ vim /usr/local/apache2/etc/httpd.conf
<VirtualHost _default_:443>
	# DocumentRoot 目錄位置要和 httpd.conf 裡面的一緻
	DocumentRoot "/usr/local/apache2/htdocs"
	ServerName localhost:443
	SSLCertificateFile cert/demo.crt
	SSLCertificateKeyFile cert/ca.key
	SSLCertificateChainFile cert/demo.crt
</VirtualHost>
           
  1. 結果驗證
[[email protected] ~]$ apachectl -t #檢查配置檔案文法
[[email protected] ~]$ apachectl restart  #重新開機 apache,并測試是否可以使用 https 通路
           

報錯提示: AH00526: Syntax error on line 78 of /usr/local/apache2/etc/extra/httpd-ssl.conf:SSLSessionCache: ‘shmcb’ session cache not supported (known names: ). Maybe you need to load the appropriate socache module (mod_socache_shmcb?).

解決方案: 要麼不調用此子產品,要麼讓調用的子產品加載上

[[email protected] ~]$ vim /usr/local/apache2/etc/httpd.conf
LoadModule socache_shmcb_module modules/mod_socache_shmcb.so  
#取消注釋即可
           
  1. 強制跳轉 https:

    有些時候為了安全,網站不允許使用 http 通路,僅允許使用 https 通路,目的是為了更加安全在 http 部分的目錄權限标簽中添加一下内容

[[email protected] ~]$ vim /usr/local/apache2/etc/httpd.conf
<Directory "/usr/local/apache2/htdocs">
    ...
	RewriteEngine on #開啟轉發規則
	RewriteCond %{SERVER_PORT} !^443$ #檢查通路端口隻要目标不是443的
	RewriteRule ^(.*)?$ https://%{SERVER_NAME}/$1 [R=301,L] #全都使用https重新通路
</Directory>
           

在做後面實驗時為了更加友善了解,我們可以先把 https 關閉掉

需要關閉:

跳轉&虛拟主機&ssl 配置檔案調用

[[email protected] ~]$ vim /usr/local/apache2/etc/httpd.conf

#跳轉
#RewriteEngine on
#RewriteCond %{SERVER_PORT} !^443$
#RewriteRule ^(.*)?$ https://%{SERVER_NAME}/$1 [R=301,L]

#虛拟主機
#<VirtualHost _default_:443>
# 		#DocumentRoot 目錄位置要和 httpd.conf 裡面的一緻
#       DocumentRoot "/usr/local/apache2/htdocs"
#       ServerName localhost:443
#       SSLCertificateFile cert/demo.crt
#       SSLCertificateKeyFile cert/ca.key
#       SSLCertificateChainFile cert/demo.crt
#</VirtualHost>


#配置檔案調用
#Include etc/extra/httpd-ssl.conf
#Include etc/extra/httpd-vhosts.conf

           

2.5.6 Apache 日志切割

我們每通路一次網站,那麼就會記錄若幹條日志。如果日志不去管理,時間長了日志檔案會越來越大,如何避免産生大的日志檔案?其實 apache 有相關的配置,使日志按照我們的需求進行歸檔,比如每天一個新日志,或者每小時一個新的日志。

  1. 首先簡單設定日志的路徑名稱
[[email protected] ~]$ vim /usr/local/apache2/etc/httpd.conf
#編輯添加内容如下:
ErrorLog "logs/error.log"
CustomLog "logs/access.log" combined

#指定了日志存放在/usr/local/apache2/logs 目錄下分别為 error.log 和 access.log,combined 為日志顯示的格式,日志格式可以參考配置檔案 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
           

2.設定 apache 日志分割

[[email protected] ~]$ vim /usr/local/apache2/etc/httpd.conf
ErrorLog "|/usr/local/apache2/bin/rotatelogs -l /usr/local/apache2/logs/error_%Y%m%d.log 86400"

CustomLog "|/usr/local/apache2/bin/rotatelogs -l /usr/local/apache2/logs/access_%Y%m%d.log 86400" combined

#注意 1:以上僅為兩條指令(一條錯誤日志,一條通路日志),路徑太長寫不開 
#注意 2:若開啟了 https,則需要修改 http-ssl.conf 配置檔案中的日志記錄條目 

[[email protected] ~]$ apachectl -t
[[email protected] ~]$ apachectl restart
           

ErrorLog 是錯誤日志,CustomLog 是通路日志。|就是管道符,意思是把産生的日志交給 rotatelog這個工具,而這個工具就是 apache 自帶的切割日志的工具。-l 的作用是校準時區為 UTC,也就是中原標準時間。86400,機關是秒,正好是一天,那麼日志會每天切割一次。而最後面的 combined 為日志的格式,在 httpd.conf 中有定義

2.5.7 不記錄指定檔案類型的日志

如果一個網站通路量特别大,那麼通路日志就會很多,但有一些通路日志我們其實是可以忽略掉的,比如網站的一些圖檔,還有 js、css 等靜态對象。而這些檔案的通路往往是巨量的,而且即使記錄這些日志也沒有什麼用,那麼如何忽略不記錄這些日志呢?

配置日志不記錄圖檔的通路

[[email protected] ~]$ vim /usr/local/apache2/etc/httpd.conf
<Directory "/usr/local/apache2/htdocs">
	#相關配置為:
	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

</Directory>

CustomLog "|/usr/local/apache2/bin/rotatelogs -l /usr/local/apache2/logs/access_%Y%m%d.log 86400" common env=!image-request



[[email protected] ~]$ apachectl -t
[[email protected] ~]$ apachectl restart
           

說明: 在原來的

通路日志

配置基礎上,增加了一些 image-request 的定義,比如把 gif、jpg、bmp、swf、js、css 等結尾的全标記為 image-request,然後在配置日志後加一個标記 env=!image-request,表示取反。

2.5.8 Apache 配置靜态緩存

所說的靜态檔案指的是圖檔、js、css 等檔案,使用者通路一個站點,其實大多數元素都是圖檔、js、css 等,這些靜态檔案其實是會被用戶端的浏覽器緩存到本地電腦上的,目的就是為了下次再請求時不再去伺服器上下載下傳,這樣就加快了速度,提高了使用者體驗。但這些靜态檔案總不能一直緩存,它總有一些時效性,那麼就得設定這個過期時間。

  1. 配置靜态緩存
[[email protected] ~]$ vim /usr/local/apache2/etc/httpd.conf
LoadModule expires_module modules/mod_expires.so  #取消注釋

<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 hours"
	 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>



           

或者使用 mod_headers 子產品實作:該子產品預設啟用

[[email protected] ~]$ vim /usr/local/apache2/etc/httpd.conf
#直接添加即可
<IfModule mod_headers.c>
	 # htm,html,txt 類的檔案緩存一個小時
	 <filesmatch "\.(html|htm|txt)$">
	 header set cache-control "max-age=3600"
	 </filesmatch>
	 
	 # css, js, swf 類的檔案緩存一個星期
	 <filesmatch "\.(css|js|swf)$">
	 header set cache-control "max-age=604800"
	 </filesmatch>
	 
	 # jpg,gif,jpeg,png,ico,flv,pdf 等檔案緩存一年
	 <filesmatch "\.(ico|gif|jpg|jpeg|png|flv|pdf)$">
	 header set cache-control "max-age=29030400"
	 </filesmatch>
</IfModule>
           

說明: 這裡的時間機關可以 days、hours 甚至是 min,兩種不同的方法,上面使用的是 mod_expires,而下面用的是 mod_headers,要想使用這些子產品,必須要事先已經支援。如何檢視是否支援,使用指令:

[[email protected] ~]$ apachectl -t
[[email protected] ~]$ apachectl restart
           

驗證:

[[email protected] ~]$ curl -x192.168.88.10:80 'http://192.168.88.10/image/a.jpg' -I
HTTP/1.1 200 OK
Date: Wed, 26 Oct 2016 03:51:26 GMT
Server: Apache/2.2.31 (Unix) PHP/5.5.38
Last-Modified: Tue, 31 May 2016 03:08:36 GMT
ETag: "46891b-16b-5341ab0597500"
Accept-Ranges: bytes
Content-Length: 363
Cache-Control: max-age=86400  #緩存
Expires: Thu, 27 Oct 2016 03:51:26 GMT
Content-Type: image/jpg
           

2.5.8 Apache 禁止解析 PHP

某個目錄下禁止解析 PHP,這個很有作用,我們做網站安全的時候,這個用的很多,比如某些目錄可以上傳檔案,為了避免上傳的檔案有木馬,是以我們禁止這個目錄下面的通路解析 PHP。

配置禁止解析 php

[[email protected] ~]$ mkdir /usr/local/apache2/htdocs/data && echo "<?php echo 'hello';" > /usr/local/apache2/htdocs/data/a.php
[[email protected] ~]$ vim /usr/local/apache2/etc/httpd.conf
#直接添加即可
<Directory /usr/local/apache2/htdocs/data>
	 php_admin_flag engine off 
	 <filesmatch "(.*)php">
		 Order deny,allow
		 Deny from all 
	 </filesmatch>
</Directory>