HTTP 配置與編譯安裝
目錄
- HTTP 配置與編譯安裝
- HTTP 相關配置
- DSO
- 定義‘Main’ Server 的文檔頁面路徑
- 定義站點主頁面
- 站點訪問控制常見機制
- 基於源地址實現訪問控制
- 日誌設定
- 設定默認字符集
- 定義路徑別名
- 基於用戶的訪問控制
- 基於組賬號進行認證
- 共享用戶家目錄
- ServerSignature On | Off | EMail
- status
- HTTP 相關配置
HTTP 配置與編譯安裝
HTTP 相關配置
註意: 多個配置文件之間有沖突的話,排在後面的配置文件生效
DSO
加載動態模塊配置
/etc/httpd/conf/httpd.conf
配置指定實現模塊加載格式:
LoadModule
模塊文件路徑可使用相對路徑:相對於ServerRoot(默認/etc/httpd)
示例:
# 要加載的模塊名 模塊路徑
LoadModule auth_basic_module modules/mod_auth_basic.so
定義‘Main’ Server 的文檔頁面路徑
**DocumentRoot “/path”**
文檔路徑映射:DocumentRoot指向的路徑為URL路徑的起始位置
示例:
DocumentRoot "/app/data“
訪問該路徑: http://HOST:PORT/test/index.html
對應實際linux中的路徑為 --> /app/data/test/index.html
註意:SELinux和iptables的狀態
定義站點主頁面
DirectoryIndex index.html index.html.var
站點訪問控制常見機制
可基於兩種機制指明對哪些資源進行何種訪問控制訪問控制機制有兩種:客戶端來源地址,用戶賬號
在Apache2.2版本中,訪問控制是基於客戶端的主機名、IP地址以及客戶端請求中的其他特征,使用Order(排序), Allow(允許), Deny(拒絕),Satisfy(滿足)指令來實現。
在Apache2.4版本中,使用mod_authz_host這個新的模塊,來實現訪問控制,其他授權檢查也以同樣的方式來完成。舊的訪問控制語句應當被新的授權認證機制所取代,即便Apache已經提供了mod_access_compat這一新模塊來兼容舊語句。
註意,如果修改網站根目錄後,發現沒有權限,優先查看selinux和iptables是否關閉
Apache2.2
配置案例
#該路徑指定我們要訪問的路徑
<Directory "/data/website">
Order allow,deny #排序,先允許後拒絕
Allow from all #允許所有
</Directory>
allow from 192.168.30.6
deny from 192.168.30.0/24
當定義的域沖突的時候,在後面的那個權限生效,所以這裏是拒絕訪問,allow和deny的次序很重要
#這樣最終的結果是:禁止100.100.*.* 允許172.16.*.*
<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>
Apache2.4
基於IP的訪問控制:
無明確授權的目錄,默認拒絕
- 允許所有主機訪問: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:指定域名下的所有主機
<Directory "/data/website">
Require all granted #允許所有
</Directory>
#表示不允許訪問目錄下所有conf為後綴的文件
<Files "*.conf">
Require all denied
</Files>
<FilesMatch "\.(gif|jpe?g|png)$">
</FileMatch>
#URL 寫法,表示限制用戶在網址欄中輸入的url地址權限的控制 比如www.magedu.com/test/ 這個 /test/就屬於url
<Location /status>
Require all denied
</Location>
#表示在URL匹配路徑中使用表達式
<LocationMatch "/(extra|special)/data">
...
</LocationMatch>
不能有失敗,至少有一個成功匹配才成功,即失敗優先
<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>
基於源地址實現訪問控制
(1) Options:後跟1個或多個以空白字符分隔的選項列表在選項前的+,- 表示增加或刪除指定選項。這種方式就等於直接在Directory中填寫,並且生效。
常見選項:
- Indexes:指明的URL路徑下不存在與定義的主頁面資源相符的資源文件時,返回索引列表給用戶
- FollowSymLinks:允許訪問符號鏈接文件所指向的源文件
- None:全部禁用
- All: 全部允許
示例
#表示該路徑不存在主頁時,返回索引列表,並且允許訪問軟連接文件指向源文件
<Directory /web/docs>
Options +Indexes +FollowSymLinks
</Directory>
<Directory /web/docs/spec>
Options +FollowSymLinks
</Directory>
<Directory /web/docs/spec>
Options +Includes -Indexes
</Directory>
#該目錄下禁止軟連接功能
<Directory "/data/website">
Options -FollowSymLinks
Require all granted
</Directory>
(2) AllowOverride
與訪問控制相關的哪些指令可以放在指定目錄下的.htaccess(由AccessFileName指定)文件中,覆蓋之前的配置指令 只對
- AllowOverride All: 所有指令都有效
- AllowOverride None:.htaccess 文件無效
- AllowOverride AuthConfig Indexes 除了AuthConfig 和Indexes的其它指令都無法覆蓋
示例
documentroot "/data/website"
<Directory "/data/website/admin">
AllowOverride authconfig
</Directory>
那麽他就是讀取 admin 這個目錄下的 .htaccess 文件中的設置,然後根據AllowOverride 來應用
<Directory "/data/website">
AllowOverride options=FollowSymLinks
Require all granted
</Directory>
日誌設定
日誌類型:
- 訪問日誌 :記錄用戶的訪問情況
- 錯誤日誌 :記錄語句執行,http服務相關的錯誤,用戶的訪問錯誤記錄在訪問日誌中
錯誤日誌:
- ErrorLog logs/error_log
- LogLevel warn
- LogLevel 可選值:debug, info, notice, warn,errorcrit, alert, emerg
訪問日誌
定義日誌格式:LogFormat format strings
LogFormat "%h %l %u %t "%r" %>s %b "%{Referer}i" "%{User-Agent}i"" combined
使用日誌格式:
CustomLog logs/access_log combined
參考幫助:
http://httpd.apache.org/docs/2.2/mod/mod_log_config.html#formats
參數詳解
%h 客戶端IP地址
%l 遠程用戶,啟用mod_ident才有效,通常為減號“-”
%u 驗證(basic,digest)遠程用戶,非登錄訪問時,為一個減號“-”
Httpd 2.2常見配置
%t 服務器收到請求時的時間
%r First line of request,即表示請求報文的首行;記錄了此次請求的“方法”,“URL”以及協議版本
%>s 響應狀態碼
%b 響應報文的大小,單位是字節;不包括響應報文http首部
%{Referer}i 請求報文中首部“referer”的值;即從哪個頁面中的超鏈接跳轉至當前頁面的,但是這個參數檢測到的不一定是真實跳轉連接,是可以偽造的。我們可以通過分析這個值,來分析用戶是從哪些路徑來訪問我們的網址的
%{User-Agent}i 請求報文中首部“User-Agent”的值;即發出請求的應用程序
修改日誌文件日期格式
%{%F %T}t
修改完成後,要通過下面的 customlog 來調用 ,最後的參數為 這個logformat 最後的名字參數
設定默認字符集
優先設置,建議搭建完服務就確認好字符集,否則後期亂碼麻煩。
AddDefaultCharset UTF-8
中文字符集:GBK, GB2312, GB18030
定義路徑別名
定義路徑別名, 需要註意一點,定義的目錄路徑,是從linux上相對於根開始的絕對路徑,而不是相對於DocumentRoot的路徑。
格式: Alias /URL/ "/PATH/"
DocumentRoot "/www/htdocs"
http://www.magedu.com/download/bash.rpm
==>/www/htdocs/download/bash.rpm
Alias /download/ "/rpms/pub/"
http://www.magedu.com/download/bash.rpm
==>/rpms/pub/bash.rpm
http://www.magedu.com/images/logo.png
==>/www/htdocs/images/logo.png
基於用戶的訪問控制
認證質詢:WWW-Authenticate:響應碼為401,拒絕客戶端請求,並說明要求客戶端提供賬號和密碼
認證:Authorization:客戶端用戶填入賬號和密碼後再次發送請求報文;認證通過時,則服務器發送響應的資源
安全域:需要用戶認證後方能訪問的路徑;應該通過名稱對其進行標識,以便於告知用戶認證的原因
用戶的賬號和密碼
- 虛擬賬號:僅用於訪問某服務時用到的認證標識
- 存儲:文本文件,SQL數據庫,ldap目錄存儲,nis等
定義指定目錄認證方式 ,模式為 basic:明文,表示如果用戶訪問該路徑,需要輸入正確的賬戶密碼後,才能訪問,否則無法訪問。
#認證模式
AuthType Basic
#登錄時的提示語句
AuthName "String"
#指定用戶名密碼文件,使用命令htpasswd來創建該文件
AuthUserFile "/PATH/HTTPD_USER_PASSWD_FILE"
#指定使用該文件中的哪些用戶名是可以訪問的 每個用戶用空格隔開,並且不能有多余的空格!!!
Require user username1 username2 ...
#創建訪問用戶賬戶 該文件名稱路徑不限,只要配置中指定即可
htpasswd -s /etc/httpd/conf.d/.httpuser user1 user2 user3
定義安全域
<Directory “/path">
Options None
AllowOverride None
AuthType Basic
AuthName "String“
AuthUserFile "/PATH/HTTPD_USER_PASSWD_FILE"
Require user username1 username2 ...
</Directory>
允許賬號文件中的所有用戶登錄訪問:
Require valid-user
提供賬號和密碼存儲(文本文件),使用專用命令完成此類文件的創建及用戶管理
htpasswd [options] /PATH/HTTPD_PASSWD_FILE username
-c:自動創建文件,僅應該在文件不存在時使用
-p:明文密碼
-d:CRYPT格式加密,默認
-m:md5格式加密
-s: sha格式加密
-D:刪除指定用戶
基於組賬號進行認證
#首先創建認證配置文件
<Directory "/path">
AuthType Basic
AuthName "visit wang home"
AuthUserFile "/etc/httpd/conf.d/.httpuser"
AuthGroupFile "/etc/httpd/conf.d/.httpgroup"
Require group g1 g2 g3
</Directory >
cd /etc/httpd/conf.d
#創建認證文件 第一次創建的時候可以加c 後面都不要加c 否則會覆蓋所有的舊賬戶
htpasswd -c .httpuser httpwang
htpasswd .httpuser httpmage
htpasswd .httpuser httpzhang
vim .httpgroup
g1:httpwang,httpmage
g2:httpmage
g3:httpzhang,httpmage
共享用戶家目錄
實現用戶家目錄的http共享
基於模塊mod_userdir.so實現
SELinux: http_enable_homedirs
相關設置:
vim /etc/httpd/conf/httpd.conf
<IfModule mod_userdir.c>
#UserDir disabled
#指定共享目錄的名稱,只要在用戶的家目錄下創建該文件夾,之後這個家目錄賦予apache acl 權限,那麽http就可以訪問用戶家目錄。每個用戶的家目錄,都可以進行共享
UserDir public_html
</IfModule>
準備目錄
su – wang;mkdir ~/public_html
setfacl –m u:apache:x ~wang
訪問
http://localhost/~wang/index.html
ServerSignature On | Off | EMail
當客戶請求的網頁並不存在時,服務器將產生錯誤文檔,缺省情況下由於打開了 ServerSignature選項,錯誤文檔的最後一行將包含服務器的名字、Apache的版本等信息
如果不對外顯示這些信息,就可以將這個參數設置為Off,生產環境中建議修改為Off!!
設置為Email,將顯示ServerAdmin 的Email提示
status
顯示系統中的狀態信息 用於監控服務器狀態,這個頁面一定不要開放給任意用戶訪問,通常只允許運維進行查閱
配置方法
curl 192.168.1.30/status 這樣就可以顯示服務器當前狀態
<Location /status>
SetHandler server-status
#設置訪問權限,只允許指定網段可以訪問
Order allow,deny
Allow from 172.16
</Location>
HTTP 配置與編譯安裝