Apache 服務配置

一. Apache 虛擬主機

1. 虛擬主機是什麼

虛擬主機是指在單一機器上運行多個網站, 虛擬主機可以基於IP, 基於主機名, 或者是端口號, 這些站點運行在同一個物理服務器上 用戶在訪問是不會感到異常的.

2. Apache 支持的虛擬主機

2.1 基於名稱和 基於IP 的虛擬主機選擇

  • apache 支持基於ip的虛擬主機配置, 如果需要配置多個主機, 則需要爲主機分配多個IP地址
  • 使用基於名稱的虛擬主機 通常更加簡單, 只需要配置DNS 服務器將每個主機名映射到正確的IP 地址上, 然後配置Apache HTTP Server 識別主機名, 基於名稱的主機可以減少對IP地址的需求.

2.2 基於域名的虛擬主機

  • 服務如何識別基於名稱的虛擬主機解析, 服務器會首先選擇匹配的 IP 的後, 才選擇合適的基於名稱的虛擬主機, 在所有 VirtualHost 指令中使用通配符(*) 作爲IP 地址使得基於IP 的映射.
  • 當強求達到, 服務器會根據 <VirtualHost> 根據請求使用IP地址 和端口找到最佳匹配參數, 如果多個虛擬主機包含最佳匹配地址和端口. Apache 會進一步匹配 ServerName 和 ServerAlias 指令, 請求中存在服務器名稱進行比較.

2.2.1 配置示例

<VirtualHost *:80>
    ServerName  www.hostname1.com
    ServerAlias hostname.com
    DocumentRoot  '/data/wwwroot/host1'
</VirtualHost>

<VirtualHost *:80>
    ServerName  www.hostname2.com
    DocumentRoot  '/data/wwwroot/host2'
</VirtualHost>

2.2.2 配置

  1. 編輯配置文件
  • conf/extra/httpd-vhosts.conf

  1. 在本地host文件修改

  1. 添加本地測試文件

  1. 重啓 Apache
[root@node10009 apache24]# ./bin/apachectl -k restart
[root@node10009 apache24]# ss -tan | grep 80
LISTEN     0      128         :::80                      :::*                  
[root@node10009 apache24]# 
  1. 測試

2.3 基於IP的虛擬主機

  • 基於IP 虛擬主機是一種根據接受請求的IP地址和端口應用你不同指令的方法, 最常見的是不同端口或接口上爲不同的站點提供服務.
  • 多數情況下基於 主機名的虛擬主機 更加方便,允許多個虛擬主機共享單個地址/端口

2.3.1 系統需求

  • 基於IP 時, 系統必須爲每個基於IP的虛擬主機提供 IP地址/端口組合.
  • 這裏可以通過一個網卡配置多個IP地址, 或者多個網卡上的多個IP地址.

2.3.2 設置Apache

  • apache 需要爲對虛擬主機的IP和端口進行監聽,

2.3.3 配置示例

<VirtualHost 192.168.10.9:80>
    ServerAdmin     [email protected]
    DocumentRoot    "/data/wwwroot/host1"
    ServerName      www.host1.com
</VirtualHost>

2.3.4 配置

  1. 添加ip地址
[root@node10009 apache24]# ip addr add 192.168.10.109/24 dev ens33
[root@node10009 apache24]# ip addr show ens33
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:0c:29:8f:4e:4a brd ff:ff:ff:ff:ff:ff
    inet 192.168.10.9/24 brd 192.168.10.255 scope global ens33
       valid_lft forever preferred_lft forever
    inet 192.168.10.109/24 scope global secondary ens33
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:fe8f:4e4a/64 scope link 
       valid_lft forever preferred_lft forever
  • 現在ens33 上有兩個ip地址(192.168.10.9, 192.168.10.109)
  1. 修改httpd配置文件
  • vim conf/extra/httpd-vhosts.conf
<VirtualHost 192.168.10.9:80>
    ServerAdmin [email protected]
    DocumentRoot    "/opt/case/wwwroot/host1"
    ServerName      localhost
    ErrorLog        "logs/dummy-host.example.com-error_log"
    CustomLog       "logs/dummy-host.example.com-access_log" common
</VirtualHost>
<VirtualHost 192.168.10.109:80>
    DocumentRoot     "/opt/case/wwwroot/host2"
    ServerName      localhost
    ErrorLog        "logs/dummy-host.example.com-error_log"
    CustomLog       "logs/dummy-host.example.com-access_log" common
</VirtualHost>
  1. 重啓 httpd
[root@node10009 apache24]# ./bin/apachectl -k restart 
[root@node10009 apache24]# ss -tln | grep 80
LISTEN     0      128         :::80                      :::*                  
  1. 測試

2.3 基於 端口的虛擬主機

基於端口的虛擬主機 和基於ip的虛擬主機一樣, 只是修改了配置文件上的端口號, 並且需要在主配置文件上添加需要監聽的端口號

  1. 修改主配置文件
  • 添加需要監聽的端口
  • vim conf/httpd.conf
#Listen 12.34.56.78:80
Listen 80
Listen 8080
Listen 8081
  1. 修改vhost 配置文件
  • vim conf/extra/httpd-vhosts.conf
<VirtualHost *:8080>
    ServerAdmin [email protected]
    DocumentRoot    "/opt/case/wwwroot/host1"
    ServerName      localhost
    ErrorLog        "logs/dummy-host.example.com-error_log"
    CustomLog       "logs/dummy-host.example.com-access_log" common
</VirtualHost>
<VirtualHost *:8081>
    DocumentRoot     "/opt/case/wwwroot/host2"
    ServerName      localhsot
    ErrorLog        "logs/dummy-host.example.com-error_log"
    CustomLog       "logs/dummy-host.example.com-access_log" common
</VirtualHost>
  1. 重啓服務
[root@node10009 apache24]# ./bin/apachectl -k restart 
[root@node10009 apache24]# ss -tln | grep 80
LISTEN     0      128         :::8080                    :::*                  
LISTEN     0      128         :::80                      :::*                  
LISTEN     0      128         :::8081                    :::*                  
  1. 測試

二. Apache 身份認證

1. 概述

  • 身份認證是驗證用戶是否具有權限進入指定目錄獲取信息 的過程控制.
  • 前提條件:
    • 該配置需要在主服務配置文件中(通常是在 <Directory> 部分) 或者每個目錄的單獨配置文件(.htaccess文件)中.
    • 添加 AllowOverride AuthCofnig 配置項,

2. 配置

  1. 創建用戶密碼文件
[root@node10009 apache24]# ./bin/htpasswd -cm /opt/app/apache24/passwd/.passwd fangfc
New password: 
Re-type new password: 
Adding password for user fangfc
[root@node10009 apache24]# cat passwd/.passwd 
fangfc:$apr1$1zq3VvB5$sihTm0kAoGghVYVSa.HFJ/
[root@node10009 apache24]#
  1. 設置配置文件
  • vim conf/extra/httpd-vhosts.conf
<VirtualHost *:80>
    DocumentRoot    "/opt/case/wwwroot/host1"
    ServerName      www.host1.cc
    <Directory "/opt/case/wwwroot/host1">
        AllowOverride AuthConfig
        AuthName    "host1 auth"
        AuthType    Basic
        AuthUserFile    "/opt/app/apache/passwd/.passwd"
        Require valid-user
    </Directory>
    ErrorLog        "logs/dummy-host.example.com-error_log"
    CustomLog       "logs/dummy-host.example.com-access_log" common
</VirtualHost>
  • 配置項
AllowOverride AuthConfig
    # 允許使用 .htaccess 配置文件覆蓋, 可以設置允許覆蓋的指令
        AuthConfig: 允許使用授權指令
        FileInfo:   允許使用控制文檔類型
        Indexes:    允許使用指令控制目錄索引
        Limit:      允許使用指令 控制主機訪問(allow, Deny, Order)
        Options:    允許使用指定的 配置性 

AuthName    "host1 auth"
    # 設置驗證域 的名稱, 這個域被提供給客戶端, 便於管理用戶和密碼.

AuthType    Basic
    # 設置驗證用戶身份的類型, 可用的身份類型是:
        None, Basic(mod_uath_basic 提供), Digest(mod_auth_digest 提供), Form(mod_auth_form 提供)

AuthUserFile    "/opt/app/apache/passwd/.passwd"
    # 用於設置 包含用戶身份和密碼的 列表文件的地址

Require valid user
    # 根據特定授權和指令, 來限制允許的用戶
        all granted:    無條件允許訪問
        all denied      無條件拒絕
        env env-var     設置一個給定的環境變量時才允許訪問
        method http-method [..]     允許給定的 HTTP 方法訪問
        user UserID     指定用戶纔可以訪問資源
        group GroupID   指定用戶組可以訪問資源
        valid-user      有效的用戶 允許訪問
        ip x.x.x.x      指定ip/範圍 的用戶可以訪問
  1. 重啓服務

  2. 測試

三. Apache 重定向

1. rewrite 模塊介紹

  • mod_rewrite 模塊提供了基於正則的動態修改傳入URL 請求的方法, 允許將任意URL 映射到 另一個URL.
  • 支持無限數量的規則 和規每個規則的附加條件, 提供靈活強大的 URL 操作機制, URL操作依賴於各種測試: 服務器變量, 環境變量, HTTP 標頭, 時間戳, 外部數據庫查找 以及各種其他程序處理.

2. 域名跳轉設置

  1. 修改配置文件中 老的站點 跳轉到新的站點
<VirtualHost *:80>
    DocumentRoot    "/opt/case/wwwroot/host1"
    ServerName      www.host1.cc
     <IfModule mod_rewrite.c>
         RewriteEngine   on
         RewriteRule     "^/(.*)$" http://www.host2.cc/$1 [R=301,L]
    </IfModule>
    ErrorLog        "logs/dummy-host.example.com-error_log"
    CustomLog       "logs/dummy-host.example.com-access_log" common
</VirtualHost>
<VirtualHost *:80>
    DocumentRoot     "/opt/case/wwwroot/host2"
    ServerName      www.host2.cc
    ServerAlias     host2.cc
</VirtualHost>
  • 配置解析
<IfModule mod_rewrite.c>
    # IfModule 是用於判斷是否存在模塊, 

    RewriteEngine   on
        # 是否啓用rewrite引擎

    RewriteRule     "^/(.*)$" http://www.host2.cc/$1 [R=301,L]
        # 定義Rewrite 規則, 可以定義多個, 
        語法是:  RewriteRule Pattern  Substitution  [Flags]
            Pattern:    是正則表達式, 用於定位位置
            Substitution    替換上面匹配到的 URL 的, 可以是 文件路徑, URL, 網址, -
            Flags:      特殊操作標誌位, 
</IfModule>
  1. 測試

[root@node10009 apache24]# curl host1.cc 
<!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://www.host2.cc/">here</a>.</p>
</body></html>
[root@node10009 apache24]# 

三. Apache 日誌配置

1. 概述

  • apache 提供全面且靈活的的日誌記錄功能.
  • apache 提供不同機制, 記錄方式, 記錄服務器上發生的事情, 從初始的請求到URL 映射過程, 到連接最後總解決方案, 包括流程中可能發生的錯誤, 除此, 第三方模塊也可以提供日誌記錄功能, 或者寫入日誌, CGI 程序也可以向服務器記錄錯誤日誌.

2. 錯誤日誌

  • 服務器錯誤日誌(其名稱和位置是由 ErrorLog 指令設置), 是最重要的日誌文件, 記錄了Apache httpd 診斷信息, 和錯誤信息.
  • 日誌記錄格式由 ErrorLogFormat 指令設置.可以自定義格式.

2.1 記錄格式 - ErrorLogFormat

  • 設置錯誤日誌記錄條目的格式

  • 示例: ErrorLogFormat "[%t] [%l] [pid %P] %F: %E: [clietn %a] %M"

  • 可選參數:

%%      百分號
%a      客戶端IP地址和 端口
%{c}a   底層對等IP地址和端口 (負載均衡會修改客戶端地址)
%A      本地IP地址和端口
%{name}e    環境變量名稱
%E      APR/OS 錯誤的狀態碼和字符串
%F      源文件和日誌調用 行號
%{name}i    請求頭名稱
%k      連接的保持活動的 請求數
$l      Loglevel 日誌等級
%L      請求日誌ID
%{c}L   連接日誌ID
%m      記錄消息的模塊
%M      實際的日誌消息
%{name}n    請求備註名稱
%P      當前進程ID
%T      當前線程ID
%t      當前時間
%v      服務器規範(ServerName)
$V      設置請求提供者的服務器名稱
\       非字符分隔符
%       字符分割福(無輸出)

2.2 記錄等級 -- LogLevel

  • 用戶控制ErrorLog 記錄日誌的等級,和詳細程度

  • 可選參數

emerg       緊急情況- 系統無法使用,  如: 子線程無法打開鎖定文件
alert       需要立即搶救      如: getwuid, 無法從uid 獲得用戶名
crit        關鍵報錯        如: 無法獲得套接字, 退出子線程
error       錯誤信息
warn        警告信息
notice      正常 但是重要的信息
info        普通消息
debug       調試信息

3. 訪問日誌

  • 服務器訪問日誌記錄服務處理的所有請求, 記錄內容根據 CustomLogLogFormat 指令控制.
  • 通用日誌記錄格式:
    • LogFormat "%h %l %u %t \"%r\" %>s %b" 示例:
日誌:
    192.168.10.1 - fangfc [04/Dec/2018:14:26:46 +0800] "GET / HTTP/1.1" 200 54
含義:
    192.168.10.1 (%h)
        向服務器發送請求的客戶端的iP地址, 

    - (%l)
        如果顯示是 - 表示字段米誒有信息, 

    fangfc (%u)
        http 身份驗證確定的用戶標識符, 

    [04/Dec/2018:14:26:46 +0800]    (%t)
        系統當前時間

    "GET / HTTP/1.1" ($r)
        客戶端的請求頭, 以及http 協議信息

    200 ($>s)
        服務器響應的狀態碼,

    54 (%b)
        返回內容的大小, 如果沒有內容則是 - 

3.1 設置訪問日誌 -- CustomLog

  • 設置日誌的文件名和格式, 指定了日誌格式, 並且可以選擇使用環境變量是請求特這稱爲條件.

  • 格式: CustomLog file|pipe format|nickname [env=[!]environment-variable|expr=expression]

  • 選項說明:

參1:
    file:   
        文件名
    pipe:
        管道符, 可以跟上程序路徑. 使用程序對日誌控制

參2:
    format|nickname
        有 LogFormat 指令設置的內容也是日誌格式部分中顯示的格式字符串

參3: 可選
    控制是否記錄特定請求.

3.2 日誌記錄格式 LogFormat

  • 用於控制日誌記錄格式,

  • 格式:

    • LogFormat format|nickname [nickname]
    • 參1: 記錄格式
    • 參2: 記錄格式的名稱, 以便後面使用
  • 記錄格式可選項:

%a      客戶端IP
%A      本地IP
%B      響應大小(不包含http頭)
%b      相應大小(不包含HTTP 頭), 以 CLF格式, 即沒有發送字節時, 顯示 - , 不顯示0
%D      服務請求需要的時間, 微秒單位
%{VARNAME}e     環境變量VARNAME內容
%f      文件名
%h      遠程主機名
%H      協議
%k      該鏈接的 keepalive 請求數,
%l      遠程日誌名稱(有 identd 提供)
%L      來自錯誤日誌的請求日誌ID, 查找匹配的錯誤日誌行, 查看那些請求導致錯誤
%m      請求方法
%{VARNAME}n      來自一個模塊 note VARNAME內容
$p      爲請求提供服務的 子進程 ID
%q      查詢字符串
%r      第一行請求
%R      生成響應的處理程序
%s      狀態, 對於內部重定向的請求, 原始請求的狀態, 使用 %>s 是最終狀態
%t      收到請求的時間
%T      服務請求需要的時間,
%u      遠程用戶, (需要驗證)
%U      請求的 URL 不抱哈任何查詢字符串
%v      服務器名
$X      響應完成時連接狀態
        X 表示完成前終止, + 發送響應後可以保持連接, - 發送響應後關閉連接
%I      收到字節數, 包括請求和標題, 不可爲0 
%O      發送字節數, 包含標題, 極少數情況下可以爲0
%S      傳輸的字節, 不可爲0

4. 設置請求屬性 -- SetEnvIf

  • 有時, 需要根據客戶請特徵從訪問日誌中排除某些條目, 需要通過環境變量 設置, 必須設置環境變量只是請求滿特定的請求條件, 通過 SetEnvIf 社會中 env .然後在從 CustomLog 中指定的日誌記錄方式進行排除.

  • SetEnvIf 指令根據請求屬性定義環境變量, 第一個參數中指定屬性, 是以下4中之一:

      1. HTTP請求頭字段, 如:Host, Uset-Agent, Referer, Accept-Language, 正則表達式可用於指定一組請求標頭
      1. 請求以下方面
      • Remote_Host 發出請求的客戶端的主機名
      • Remote_Addr 發出請求的客戶端IP 地址
      • Server_Addr 收到請求的服務的IP 地址
      • Request_method 收到請求的方法(GET,POST, ..)
      • Request_Protocol 用於請求的協議的名稱和版本(如 "HTTP/0.9", "HTTP/1.1")
      • Request_URI HTTP 請求行上請求的資源,
      1. 與請求現骨幹的列表的環境變量的名稱, 允許SetEnvIf 針對先前匹配結果測試,
  • 參2(正則表達式) 如果正則匹配成功則計算其餘參數.

4.1 示例

SetEnvIf  Request_URI  "\.gif$" img         # 設置img 格式圖片訪問的變量爲 img
SetEnvIf  Request_URI  "\.jpg$" img
SetEnvIf  Referer "www\.hostname\.com" host1 # 訪問 www.hostname.com 時, 設置變量爲 host1

4.2 配置實例

  1. 未添加圖片日誌過濾

  1. 添加配置
<VirtualHost *:80>
    DocumentRoot     "/opt/case/wwwroot/host2"
    ServerName      www.host2.cc
    ServerAlias     host2.cc
    <IfModule mod_setenvif.c>
        SetEnvIf    Request_URI     "\.gif$"    img 
        SetEnvIf    Request_URI     "\.png$"    img 
        SetEnvIf    Request_URI     "\.ico$"    img 
        SetEnvIf    Request_URI     "\.jpg$"    img 
    </IfModule>
    ErrorLog        "logs/dummy-host.example.com-error_log"
    CustomLog       "/opt/case/wwwroot/host2/logs/access.log" common env=!img
</VirtualHost>
  1. 重啓測試
[root@node10009 apache24]# ./bin/apachectl -t
Syntax OK
[root@node10009 apache24]# ./bin/apachectl -k restart

四. Apache 日誌切割

apache 服務提供了日誌切割工具,rotatelogs, 支持基於日誌時間 間隔或大小切割

1. rotatelogs 日誌工具

1.1 語法:

rotatelogs [-l] logfile [rotationtime [offset]] | [filesizeM]

1.2 選項解釋

-l: 
    使用本地時間切割, 而不是使用 GMT 作爲基準

logfile:
    記錄日誌的文件路徑, 可以使用 strftime 的格式創建文件名, strftime是 %Y%m%d 記錄年月日, 用於保留歷史日誌, 可以使用crontab做定期刪除過期日誌.

rotationtime:  
    日誌切割的 間隔時間, 單位是秒, 所以需要按天切割, 則是 86400 秒(60*60*24) 

filesize(B|K|M|G)
    按照日誌文件大小切割, 

offset:
    和 UTC 時間的偏移分鐘數, 例如中國是 +8小時地區, 則該參數應當爲 +480 

END

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