一. 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 配置
- 編輯配置文件
conf/extra/httpd-vhosts.conf
- 在本地host文件修改
- 添加本地測試文件
- 重啓 Apache
[root@node10009 apache24]# ./bin/apachectl -k restart
[root@node10009 apache24]# ss -tan | grep 80
LISTEN 0 128 :::80 :::*
[root@node10009 apache24]#
- 測試
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 配置
- 添加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)
- 修改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>
- 重啓 httpd
[root@node10009 apache24]# ./bin/apachectl -k restart
[root@node10009 apache24]# ss -tln | grep 80
LISTEN 0 128 :::80 :::*
- 測試
2.3 基於 端口的虛擬主機
基於端口的虛擬主機 和基於ip的虛擬主機一樣, 只是修改了配置文件上的端口號, 並且需要在主配置文件上添加需要監聽的端口號
- 修改主配置文件
- 添加需要監聽的端口
vim conf/httpd.conf
#Listen 12.34.56.78:80
Listen 80
Listen 8080
Listen 8081
- 修改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>
- 重啓服務
[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 :::*
- 測試
二. Apache 身份認證
1. 概述
- 身份認證是驗證用戶是否具有權限進入指定目錄獲取信息 的過程控制.
- 前提條件:
- 該配置需要在主服務配置文件中(通常是在 <Directory> 部分) 或者每個目錄的單獨配置文件(.htaccess文件)中.
- 添加
AllowOverride AuthCofnig
配置項,
2. 配置
- 創建用戶密碼文件
[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]#
- 設置配置文件
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/範圍 的用戶可以訪問
-
重啓服務
-
測試
三. Apache 重定向
1. rewrite 模塊介紹
- mod_rewrite 模塊提供了基於正則的動態修改傳入URL 請求的方法, 允許將任意URL 映射到 另一個URL.
- 支持無限數量的規則 和規每個規則的附加條件, 提供靈活強大的 URL 操作機制, URL操作依賴於各種測試: 服務器變量, 環境變量, HTTP 標頭, 時間戳, 外部數據庫查找 以及各種其他程序處理.
2. 域名跳轉設置
- 修改配置文件中 老的站點 跳轉到新的站點
<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>
- 測試
[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. 訪問日誌
- 服務器訪問日誌記錄服務處理的所有請求, 記錄內容根據
CustomLog
和LogFormat
指令控制. - 通用日誌記錄格式:
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中之一:-
- HTTP請求頭字段, 如:Host, Uset-Agent, Referer, Accept-Language, 正則表達式可用於指定一組請求標頭
-
- 請求以下方面
- Remote_Host 發出請求的客戶端的主機名
- Remote_Addr 發出請求的客戶端IP 地址
- Server_Addr 收到請求的服務的IP 地址
- Request_method 收到請求的方法(GET,POST, ..)
- Request_Protocol 用於請求的協議的名稱和版本(如 "HTTP/0.9", "HTTP/1.1")
- Request_URI HTTP 請求行上請求的資源,
-
- 與請求現骨幹的列表的環境變量的名稱, 允許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 配置實例
- 未添加圖片日誌過濾
- 添加配置
<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>
- 重啓測試
[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