前文咱們聊了下httpd的一些基礎設置,聊了下httpd的配置文件格式,長鏈接、mpm的配置以及訪問控制基於文件路徑和URL管控,回顧請參考http://www.javashuo.com/article/p-mfwxfiqq-dv.html;今天咱們繼續來聊一聊餘下的一些經常使用配置;html
一、定義路徑別名:定義路徑別名須要用到alias指令語法格式是alias /URL/ 「PATH/TO/SOMEDIR/」;什麼意思呢?一般狀況用戶訪問/images/這個目錄,對應文件系統路徑應該是documentroot指令指定的路徑下的images;若是使用了路徑別名,用戶訪問/images這個URI就不必定是documentroot指令指定的路徑下的images了;它至關於把文件系統上的一個路徑映射成URL路徑;該指令能夠用在server配置塊中,虛擬主機,和directory中;node
示例:web
提示:以上示例表示把文件系統路徑「/usr/local/apache/icons/」 映射成URL路徑「/icons/」,同時明確受權容許全部人訪問「/usr/local/apache/icons/」目錄;也就是說用戶訪問/icons/目錄就至關於訪問文件系統路徑「/usr/local/apache/icons/」目錄;數據庫
提示:這裏須要注意一點的是若是咱們映射的URL路徑是以「/」結尾,那麼對應文件系統路徑也必須是「/」結尾,以上面的示例若是咱們訪問的URL是/icons將提示咱們訪問不到,以下圖apache
提示:其實很好理解,上圖的URL會去找documentroot指令指定的文件系統路徑中找icons文件,若是可以找到就把對應文件內容響應給用戶,若是是在documentroot指令指定的文件系統路徑下icons是目錄的話,咱們訪問/icons就會被/icons/匹配,從而訪問到別名路徑上去;由於咱們訪問目錄默認會把目錄下的文件給以索引的方式羅列出來,因此咱們訪問某個目錄,其URL最後會填上一個「/」,這樣一來就會被對應的別名路徑匹配;centos
二、設定默認字符集:AddDefaultCharset charset 此指令表示添加默認字符集,能夠用在server配置塊中、虛擬主機、directory、和.htaccess中;默認是off的瀏覽器
三、日誌設定;web服務日誌類型有兩種類型,一種是訪問日誌,記錄用戶訪問站點的日誌,另外一中類型就是錯誤日誌,記錄服務端程序出錯等日誌;安全
errorlog:此指令表示定義錯誤日誌存放路徑及名稱,該指令能夠用在server配置段中,表示記錄中心主機錯誤日誌,一樣也能夠放在各虛擬主機中,表示記錄各虛擬主機的錯誤日誌;其語法格式爲:errorlog file-path |syslog [:[facility] [:tag]] ;從語法格式看咱們就知道錯誤日誌除了能夠在本地指定文件來記錄外還能夠將其發送給syslog;bash
示例:服務器
提示:以上配置表示把錯誤日誌存放在logs/error_log文件中,這裏的相對路徑是相對於serverroot指定的路徑;
loglevel :此指令表示指定錯誤日誌級別,咱們知道日誌是有級別的,這個指令的做用就是告訴服務器,什麼級別或該級別以上的日誌信息記錄到錯誤日誌中;
示例:
提示:以上表示記錄日誌級別爲warn以及以上級別的日誌;
訪問日誌:logformat:此指令表示指定訪問日誌格式,並給該格式取一名字,在後續的使用中能夠經過customlog指令來調用該名字便可把訪問日誌格式記錄成咱們想要的格式;日誌格式中有不少httpd內建的宏,每一個宏都有不一樣的意義,咱們定義訪問日誌格式也是經過組合這些宏來定義的;常見的宏以及對應的意思以下
%h:客戶端IP地址;
%l:Remote User, 一般爲一個減號(「-」);該用戶指identd方式認證的用戶;
%u:Remote user (from auth; may be bogus if return status (%s) is 401);非爲登陸訪問時,其爲一個減號;該用戶指authenticated認證的用戶;
%t:服務器收到請求時的時間;
%r:First line of request,即表示請求報文的首行;記錄了這次請求的「方法」,「URL」以及協議版本;
%>s:響應狀態碼;記錄最後一次響應狀態碼,若是沒有">"號就表示記錄第一次狀態碼信息;若是在重定向中這種狀態碼就不是很準確了;
%b:響應報文的大小,單位是字節;不包括響應報文的http首部;
%{Referer}i:請求報文中首部「referer」的值;即從哪一個頁面中的超連接跳轉至當前頁面的;
%{User-Agent}i:請求報文中首部「User-Agent」的值;即發出請求的應用程序;
更多宏指令說明,請參考官方文檔http://httpd.apache.org/docs/2.4/mod/mod_log_config.html#logformat
示例:
提示:以上配置表示定義了兩個格式的日誌格式,分別叫combined 和common
customlog:此指令表示指定訪問日誌路徑及名稱以及日誌格式名稱
示例:
提示:以上配置表示指定訪問日誌爲logs/access_log,而且使用combined的格式記錄訪問日誌;一樣的這裏的日誌路徑也是相對於serverroot指定的路徑;咱們定義的訪問日誌格式究竟是什麼樣呢?以下:
四、基於用戶的訪問控制
首先咱們來了解下幾個概念;
認證質詢:客戶端訪問服務端時,若是咱們對客戶端訪問的資源提早配置了須要認證纔可訪問,這時客戶端訪問服務端對應資源時,服務端會向客戶端響應一個狀態碼爲401,響應首部叫www-authenticate,明確的拒絕客戶端訪問,並告訴客戶端,訪問此資源須要認證提供用戶名和密碼;這個過程叫認證質詢,意思就是告訴客戶端訪問的資源須要提供用戶名和密碼;以下
認證:當客戶端收到服務端的認證質詢響應後,此時瀏覽器上會有一個對話框,提示用戶輸入用戶名和密碼,用戶把對應的用戶名和密碼輸入到對話框中,點擊肯定,此時客戶端的用戶名和密碼會經過authorization請求首部發送給服務端,服務端拿到客戶端的用戶名和密碼,就會去比對客戶端提供的用戶名和密碼是否正確,若是正確,則服務端把對應資源內容響應給客戶端;這樣的一個過程叫認證的過程,簡單點說就是客戶端提供用戶名和密碼,服務端進行驗證是否正確,正確就響應對應資源內容,不正確就不響應;以下圖所示
安全域:所謂安全域就是用戶訪問的資源路徑,咱們須要明確的經過名稱對其進行表示,以便明確告知用戶認證的緣由;
瞭解了以上三個概念,咱們不難理解,要想認證,首先得須要要用戶名和密碼,這個用戶名和密碼怎麼存放?咱們知道登陸Linux系統時會提示咱們輸入用戶名和密碼,登陸成功後咱們就能夠正常的輸入命令操做Linux系統了,在Linux裏咱們把登陸系統的用戶名和密碼信息存放在/etc/passwd和/etc/shadow文件中;但httpd認證的帳號和密碼怎麼存放的呢?其實存放帳號密碼的工具備不少,咱們能夠存放在數據庫中,也能夠借鑑Linux系統帳號密碼的存放方式,把用戶名和密碼存放在文件中,只不過存放在數據庫中,咱們還須要考慮httpd怎麼去數據庫找對應的用戶名和密碼;一般狀況下咱們在登陸某寶的網站,也是須要帳號和密碼的,這裏的帳號和密碼不是經過這種方式驗證的,像咱們說的認證質詢是http協議內部實現的訪問控制機制,咱們在登陸某寶網站提供的用戶名和密碼認證的方式和這裏說的認證不是一回事;一般狀況下若是帳號和密碼的數量比較大時,咱們一般會把帳號密碼信息存放在數據庫裏;若是用戶名和密碼的數量極少,咱們用數據庫存放帳號和密碼就顯得不那麼高效了;
在httpd程序中,提供了一個工具就能夠用來建立存放用戶名和密碼的文件的工具,它叫htpasswd;咱們來了解下它的使用法吧;
[root@test_node1-centos7 conf]# htpasswd --help Usage: htpasswd [-cimBdpsDv] [-C cost] passwordfile username htpasswd -b[cmBdpsDv] [-C cost] passwordfile username password htpasswd -n[imBdps] [-C cost] username htpasswd -nb[mBdps] [-C cost] username password -c Create a new file. -n Don't update file; display results on stdout. -b Use the password from the command line rather than prompting for it. -i Read password from stdin without verification (for script usage). -m Force MD5 encryption of the password (default). -B Force bcrypt encryption of the password (very secure). -C Set the computing time used for the bcrypt algorithm (higher is more secure but slower, default: 5, valid: 4 to 31). -d Force CRYPT encryption of the password (8 chars max, insecure). -s Force SHA encryption of the password (insecure). -p Do not encrypt the password (plaintext, insecure). -D Delete the specified user. -v Verify password for the specified user. On other systems than Windows and NetWare the '-p' flag will probably not work. The SHA algorithm does not use a salt and is less secure than the MD5 algorithm. [root@test_node1-centos7 conf]#
提示:-c表示第一次建立存放用戶名和密碼的文件,-m表示使用md5方式加密存放密碼(默認加密方式),-s表示使用sha方式加密密碼,-B表示強制使用bcrypt方式加密密碼,-p表示不加密密碼,明文存放;-D表示刪除一個用戶和密碼;-b表示使用模式,直接在命令行指定用戶名和密碼,直接建立,不須要手動輸入密碼;-i表示從標準輸入獲取密碼一般用於腳本中;
瞭解了htpasswd工具的選項後,咱們再來講說認證方式,在httpd中基於用戶的認證有兩種,basic明文認證和digest消息摘要認證,一般basic認證是不安全的,很容易泄露用戶名和密碼,可是digest認證相對是比較安全的,可是須要客戶端支持才行;瞭解了以上httpd的認證過程後,咱們來看看httpd是怎麼配置認證的;
authtype:此指令表示指定認證類型;
authname 「string」:此指令表示告訴用戶爲何認證,一般用於提示用戶輸入用戶名和密碼;
authuserfile:指定存放用戶名和密碼的文件路徑已經文件名稱;
require user:指定容許認證的用戶,沒有被指定的用戶是不可以被認證的,即使authuserfile文件中存放的有對應用戶名和密碼;
以上指令只能用於directory或.htaccess中使用,一般用於定義安全域;
示例:
建立虛擬用戶用於httpdbasic認證
[root@test_node1-centos7 conf]# htpasswd -c /etc/httpd/conf.d/.htpasswd tom New password: Re-type new password: Adding password for user tom [root@test_node1-centos7 conf]# htpasswd /etc/httpd/conf.d/.htpasswd jerry New password: Re-type new password: Adding password for user jerry [root@test_node1-centos7 conf]# cat /etc/httpd/conf.d/.htpasswd tom:$apr1$xLIN6FgB$tQbKDzRRMyx/ahUGHhtN10 jerry:$apr1$5gjGaRfC$hK0MOgR6/dYpU5HBDH1nC/ [root@test_node1-centos7 conf]#
提示:咱們建立了/etc/httpd/conf.d/.htpasswd文件來存放用戶名和密碼;並建立了兩個虛擬用戶tom和jerry
提示:以上配置表示用戶訪問根路徑須要用戶認證,認證用戶是tom,認證類型是basic
提示:能夠看到咱們用tom用戶數能夠正常登陸的,咱們用jerry用戶是否能夠登陸呢?以下
提示:能夠看到沒有寫在require user 裏的用戶是不能登陸的,即使是authuserfile裏有的用戶名和密碼;
require valid-user:此指令表示容許authuserfile中的全部用戶登陸訪問
提示:以上配置表示容許/etc/httpd/conf.d/.htpasswd文件中的全部用戶能夠登陸訪問
提示:能夠看到authuserfile裏的用戶均可以登陸訪問
以上是基於用戶賬號進行認證的配置實例演示,接下來咱們在來講說基於組帳號認證
authgroupfile:此指令表示指定組文件,這個文件的格式是組名:用戶名1 用戶名2……
require group :此指令表示指定容許認證的組名
示例:
首先建立一個authguoupfile
[root@test_node1-centos7 conf.d]# htpasswd /etc/httpd/conf.d/.htpasswd xiaoming New password: Re-type new password: Adding password for user xiaoming [root@test_node1-centos7 conf.d]# htpasswd /etc/httpd/conf.d/.htpasswd xiaohong New password: Re-type new password: Adding password for user xiaohong [root@test_node1-centos7 conf.d]# cat /etc/httpd/conf.d/.htpasswd tom:$apr1$xLIN6FgB$tQbKDzRRMyx/ahUGHhtN10 jerry:$apr1$5gjGaRfC$hK0MOgR6/dYpU5HBDH1nC/ xiaoming:$apr1$xA1lDL.b$frhycSz3Ainlm4kktPn5A1 xiaohong:$apr1$HhAZCYJE$C/75gZ0k9x/5cw47Udooz1 [root@test_node1-centos7 conf.d]# cat > /etc/httpd/conf.d/.htgroup <<EOF > group1:xiaohong xiaoming > group2:tom jerry > EOF [root@test_node1-centos7 conf.d]# cat /etc/httpd/conf.d/.htgroup group1:xiaohong xiaoming group2:tom jerry [root@test_node1-centos7 conf.d]#
提示:以上新增了兩個用戶小明和小紅,而後在/etc/httpd/conf.d/建立了一個authgroupfile 名爲.htgroup,並在組文件中明肯定義了兩個組group1裏面有兩個成員xiaoming和xiaohong ;group2中定義了兩個成員tom和jerry,接下來咱們配置只容許group1裏的用戶訪問;
提示:以上配置表示group1組裏的成員容許認證訪問
提示:能夠看到group1裏的xiaoming和xiaohong用戶都是能夠正常的認證訪問;那麼對應的group2裏的成員是否能夠訪問呢?
提示:能夠看到沒有被容許的組成員是不可以認證訪問的