Linux 第76天 http配置文件內容解析
時間: 20181018
個人小站,歡迎訪問: www.winthcloud.top
目錄
httpd 常見配置
日誌設定
虛擬主機(重點)
mod_deflate模塊
https:http over ssl
總結
httpd 2.2常見配置
httpd配置文件的組成:
grep "Section" /etc/httpd/conf/httpd.conf
### Section 1: Global Environment
### Section 2: 'Main' server configuration
### Section 3: Virtual Hosts
配置格式:directive value
directive: 不區分字符大小寫
value: 爲路徑時,是否區分大小寫,取決於文件系統
ServerName 主機名
顯示服務器版本信息
ServerTokens Major|Minor|Min[imal]|Prod[uctOnly]|OS|Full
持久連接
Persistent Connection:連接建立,每個資源獲取完成後不會斷開連接,而是繼續
等待其它的請求完成,默認關閉持久連接
斷開條件:
1)數量限制:100
2)時間限制:以秒爲單位, httpd-2.4 支持毫秒級
副作用:對併發訪問量較大的服務器,持久連接會使有些請求得不到響應
折衷:使用較短的持久連接時間
設置:KeepAlive On|Off
KeepAliveTimeout 15
MaxKeepAliveRequests 100
測試:telnet WEB_SERVER_IP PORT
GET /URL HTTP/1.1
Host: WEB_SERVER_IP
MPM( Multi-Processing Module)多路處理模塊
prefork的默認配置:
<IfModule prefork.c>
StartServers 8
MinSpareServers 5
MaxSpareServers 20
ServerLimit 256 最多進程數,最大20000
MaxClients 256 最大併發
MaxRequestsPerChild 4000 子進程最多能處理的請求數量。在處理
MaxRequestsPerChild 個請求之後,子進程將會被父進程終止,這時候子進
程佔用的內存就會釋放(爲0時永遠不釋放)
</IfModule>
worker的默認配置:
<IfModule worker.c>
StartServers 4
MaxClients 300
MinSpareThreads 25
MaxSpareThreads 75
ThreadsPerChild 25
MaxRequestsPerChild 0 無限制
</IfModule>
定義'Main' server的文檔頁面路徑
DocumentRoot “/path”
文檔路徑映射:
DocumentRoot指向的路徑爲URL路徑的起始位置
示例:
DocumentRoot "/app/data“
http://HOST:PORT/test/index.html --> /app/data/test/index.html
定義站點主頁面
DirectoryIndex index.html index.html.var
站點訪問控制常見機制
可基於兩種機制指明對哪些資源進行何種訪問控制
訪問控制機制有兩種:客戶端來源地址,用戶賬號
文件系統路徑:
<Directory “/path">
...
</Directory>
<File “/path/file”>
...
</File>
<FileMatch "PATTERN">
...
</FileMatch>
<Directory>中“基於源地址”實現訪問控制
(1) Options:後跟1個或多個以空白字符分隔的選項列表
在選項前的+,- 表示增加或刪除指定選項
常見選項:
Indexes:指明的URL路徑下不存在與定義的主頁面資源相符的資源
文件時,返回索引列表給用戶
FollowSymLinks:允許訪問符號鏈接文件所指向的源文件
None:全部禁用
All: 全部允許
(2) AllowOverride
與訪問控制相關的哪些指令可以放在指定目錄下的.htaccess(由AccessFileName
指定)文件中,覆蓋之前的配置指令
只對<directory>語句有效
AllowOverride All: .htaccess中所有指令都有效
AllowOverride None: .htaccess 文件無效
AllowOverride AuthConfig Indexes 除了AuthConfig
和Indexes的其它指令都無法覆蓋
(3) order和allow、deny (http2.2配置)
放在directory, .htaccess中
order:定義生效次序;寫在後面的表示默認法則
Order allow,deny
Order deny,allow
Allow from和Deny from:定義客戶端地址
客戶端地址:
IP
網絡: 172.16
172.16.0.0
172.16.0.0/16
172.16.0.0/255.255.0.0
示例:
<files "*.txt">
order deny,allow
deny from 172.16. 100.100
allow from 172.16
</files>
<filematch “.*\.(conf|ini)$">
order allow,deny
deny from 172.16.100.100
allow from 172.16
</filematch>
基於IP的訪問控制(http2.4配置)
無明確授權的目錄,默認拒絕
允許所有主機訪問:Require all granted
拒絕所有主機訪問:Require all denied
控制特定的IP訪問:
Require ip IPADDR:授權指定來源的IP訪問
Require not ip IPADDR:拒絕特定的IP訪問
控制特定的主機訪問:
Require host HOSTNAME:授權特定主機訪問
Require not host HOSTNAME:拒絕HOSTNAME:
FQDN:特定主機
domin.tld:指定域名下的所有主機
不能有失敗,至少有一個成功匹配才成功,即失敗優先
<RequireAll>
Require all granted
Require not ip 172.16.1.1 拒絕特定IP
</RequireAll>
多個語句有一個成功,則成功,即成功優先
<RequireAny>
Require all denied
require ip 172.16.1.1 允許特定IP
</RequireAny>
URL路徑:
<Location "">
...
</Location>
<LocationMatch "">
...
</LocationMatch>
示例:
<FilesMatch "\.(gif|jpe?g|png)$">
<Files "?at.*"> 通配符
<Location /status>
<LocationMatch "/(extra|special)/data">
日誌設定
日誌類型:
訪問日誌
錯誤日誌
錯誤日誌:
ErrorLog logs/error_log
LogLevel warn
LogLevel 可選值: debug, info, notice, warn,error, crit, alert, emerg
訪問日誌:
定義日誌格式:LogFormat format strings
LogFormat "%h %l %u %{%Y-%m-%d %H:%M:%S}t \"%r\" %>s %b
\"%{Referer}i\" \"%{User-Agent}i\"" testlog (與上一行一行內容)
使用日誌格式:
CustomLog logs/access_log testlog
參考幫助:http://httpd.apache.org/docs/2.2/mod/mod_log_config.html#formats
%h 客戶端IP地址
%l 遠程用戶,啓用mod_ident纔有效,通常爲減號“-”
%u 驗證(basic,digest)遠程用戶,非登錄訪問時,爲一個減號“-”
%t 服務器收到請求時的時間
%r First line of request,即表示請求報文的首行;記錄了此次請求的“
方法”,“URL”以及協議版本
%>s 響應狀態碼
%b 響應報文的大小,單位是字節;不包括響應報文http首部
%{Referer}i 請求報文中首部“referer”的值;即從哪個頁面中的超鏈
接跳轉至當前頁面的
%{User-Agent}i 請求報文中首部“User-Agent”的值;即發出請求的
應用程序
設定默認字符集
AddDefaultCharset UTF-8 此爲默認值
中文字符集:GBK, GB2312, GB18030
定義路徑別名
格式:Alias /URL/ "/PATH/"
DocumentRoot "/www/htdocs"
http://www.winthcloud.com/download/bash.rpm
==>/www/htdocs/download/bash.rpm
Alias /download/ "/rpms/pub/"
http://www.winthcloud.com/download/bash.rpm
==>/rpms/pub/bash.rpm
http://www.winthcloud.com/images/logo.png
==>/www/htdocs/images/logo.png
基於用戶的訪問控制
認證質詢:WWW-Authenticate:響應碼爲401,拒絕客戶端請求,並說明要求
客戶端提供賬號和密碼
認證:Authorization:客戶端用戶填入賬號和密碼後再次發送請求報文;認證
通過時,則服務器發送響應的資源
認證方式兩種:
basic:明文
digest:消息摘要認證,兼容性差
安全域:需要用戶認證後方能訪問的路徑;應該通過名稱對其進行標識,以便
於告知用戶認證的原因
用戶的賬號和密碼
虛擬賬號:僅用於訪問某服務時用到的認證標識
存儲:文本文件,SQL數據庫,ldap目錄存儲,nis等
ServerSignature On | Off | EMail
當客戶請求的網頁並不存在時,服務器將產生錯誤文檔,缺省情況下由於打開了
ServerSignature選項,錯誤文檔的最後一行將包含服務器的名字、Apache的版本
等信息
如果不對外顯示這些信息,就可以將這個參數設置爲Off
設置爲Email,將顯示ServerAdmin 的Email提示
status頁面
LoadModule status_module modules/mod_status.so
<Location /server-status>
SetHandler server-status
Order allow,deny
Allow from 172.16
</Location>
ExtendedStatus On 顯示擴展信息
虛擬主機(重點)
站點標識: socket
IP相同,但端口不同
IP不同,但端口均爲默認端口
FQDN不同: 請求報文中首部 Host: www.winthcloud.com
有三種實現方案:
基於ip:爲每個虛擬主機準備至少一個ip地址
基於port:爲每個虛擬主機使用至少一個獨立的port
基於FQDN:爲每個虛擬主機使用至少一個FQDN
注意:一般虛擬機不要與main主機混用;因此,要使用虛擬主機,一般先禁用main主機
禁用方法:註釋中心主機的DocumentRoot指令即可
虛擬主機的配置方法:
<VirtualHost IP:PORT>
ServerName FQDN
DocumentRoot “/path"
</VirtualHost>
建議:上述配置存放在獨立的配置文件中
其它可用指令:
ServerAlias:虛擬主機的別名;可多次使用
ErrorLog: 錯誤日誌
CustomLog:訪問日誌
<Directory “/path"> </Directory>
Alias
基於IP的虛擬主機示例:
<VirtualHost 172.16.100.6:80>
ServerName www.a.com
DocumentRoot "/www/a.com/htdocs"
</VirtualHost>
<VirtualHost 172.16.100.7:80>
ServerName www.b.net
DocumentRoot "/www/b.net/htdocs"
</VirtualHost>
<VirtualHost 172.16.100.8:80>
ServerName www.c.org
DocumentRoot "/www/c.org/htdocs"
</VirtualHost>
基於端口的虛擬主機:可和基於IP的虛擬主機混和使用
listen 808
listen 8080
<VirtualHost 172.16.100.6:80>
ServerName www.a.com
DocumentRoot "/www/a.com/htdocs"
</VirtualHost>
<VirtualHost 172.16.100.6:808>
ServerName www.b.net
DocumentRoot "/www/b.net/htdocs"
</VirtualHost>
<VirtualHost 172.16.100.6:8080>
ServerName www.c.org
DocumentRoot "/www/c.org/htdocs"
</VirtualHost>
基於FQDN的虛擬主機:
NameVirtualHost *:80 httpd2.4不需要此指令
<VirtualHost *:80>
ServerName www.a.com
DocumentRoot "/www/a.com/htdocs"
</VirtualHost>
<VirtualHost *:80>
ServerName www.b.net
DocumentRoot "/www/b.net/htdocs"
</VirtualHost>
<VirtualHost *:80>
ServerName www.c.org
DocumentRoot "/www/c.org/htdocs"
</VirtualHost>
mod_deflate模塊
使用mod_deflate模塊壓縮頁面優化傳輸速度
適用場景:
(1) 節約帶寬,額外消耗CPU;同時,可能有些較老瀏覽器不支持
(2) 壓縮適於壓縮的資源,例如文本文件
LoadModule deflate_module modules/mod_deflate.so
SetOutputFilter DEFLATE
# Restrict compression to these MIME types
AddOutputFilterByType DEFLATE text/plain
AddOutputFilterByType DEFLATE text/html
AddOutputFilterByType DEFLATE application/xhtml+xml
AddOutputFilterByType DEFLATE text/xml
AddOutputFilterByType DEFLATE application/xml
AddOutputFilterByType DEFLATE application/x-javascript
AddOutputFilterByType DEFLATE text/javascript
AddOutputFilterByType DEFLATE text/css
Level of compression (Highest 9 - Lowest 1)
DeflateCompressionLevel 9
排除特定舊版本的瀏覽器,不支持壓縮
Netscape 4.x 只壓縮text/html
BrowserMatch ^Mozilla/4 gzip-only-text/html
Netscape 4.06-08三個版本 不壓縮
BrowserMatch ^Mozilla/4\.0[678] no-gzip
Internet Explorer標識本身爲“Mozilla / 4”,但實際上是能夠處理請求的壓縮。
如果用戶代理首部匹配字符串“MSIE”(“B”爲單詞邊界”),就關閉之前定
義的限制
BrowserMatch \bMSI[E] !no-gzip !gzip-only-text/html
https:http over ssl
SSL會話的簡化過程
(1) 客戶端發送可供選擇的加密方式,並向服務器請求證書
(2) 服務器端發送證書以及選定的加密方式給客戶端
(3) 客戶端取得證書並進行證書驗證
如果信任給其發證書的CA
(a) 驗證證書來源的合法性;用CA的公鑰解密證書上數字簽名
(b) 驗證證書的內容的合法性:完整性驗證
(c) 檢查證書的有效期限
(d) 檢查證書是否被吊銷
(e) 證書中擁有者的名字,與訪問的目標主機要一致
(4) 客戶端生成臨時會話密鑰(對稱密鑰),並使用服務器端的公鑰加密此數據發
送給服務器,完成密鑰交換
(5) 服務用此密鑰加密用戶請求的資源,響應給客戶端
注意:SSL是基於IP地址實現,單IP的主機僅可以使用一個https虛擬主機
https實現
(1) 爲服務器申請數字證書
測試:通過私建CA發證書
(a) 創建私有CA
(b) 在服務器創建證書籤署請求
(c) CA簽證
(2) 配置httpd支持使用ssl,及使用的證書
yum -y install mod_ssl
配置文件:/etc/httpd/conf.d/ssl.conf
DocumentRoot
ServerName
SSLCertificateFile
SSLCertificateKeyFile
(3) 測試基於https訪問相應的主機
openssl s_client [-connect host:port] [-cert filename]
[-CApath directory] [-CAfile filename]
重定向
Redirect [status] URL-path URL
status狀態:
Permanent: 返回永久重定向狀態碼 301
Temp:返回臨時重定向狀態碼302. 此爲默認值
示例:
Redirect temp / https://www.winthcloud.com/
http重定向https
將http請求轉發至https的URL
HSTS
HSTS:HTTP Strict Transport Security
服務器端配置支持HSTS後,會在給瀏覽器返回的HTTP首部中攜帶
HSTS字段。瀏覽器獲取到該信息後,會將所有HTTP訪問請求在
內部做307跳轉到HTTPS。而無需任何網絡過程
HSTS preload list
是Chrome瀏覽器中的HSTS預載入列表,在該列表中的網站,使用
Chrome瀏覽器訪問時,會自動轉換成HTTPS。Firefox、Safari、
Edge瀏覽器也會採用這個列表
實現HSTS示例:
vim /etc/httpd/conf/httpd.conf
Header always set Strict-Transport-Security "max-age=31536000"
RewriteEngine on
RewriteRule ^(/.*)$ https://%{HTTP_HOST}$1 [redirect=302]
總結
1. alias 用來定義將web地址後邊跟的路徑連接至服務器的真正文件系統路徑
2. redirect 將內部連接重定向至其它url並通知客戶端去新的url去取資源
3. 實現https時要不將80的虛擬主機重定向至https要不就將端口改爲443(推薦前一種)