1. 程式人生 > >WEB應用之httpd基礎入門(二)

WEB應用之httpd基礎入門(二)

  前文我們聊了下httpd的一些基礎設定,聊了下httpd的配置檔案格式,長連線、mpm的配置以及訪問控制基於檔案路徑和URL管控,回顧請參考https://www.cnblogs.com/qiuhom-1874/p/12551518.html;今天我們繼續來聊一聊餘下的一些常用配置;

  1、定義路徑別名:定義路徑別名需要用到alias指令語法格式是alias /URL/ “PATH/TO/SOMEDIR/”;什麼意思呢?通常情況使用者訪問/images/這個目錄,對應檔案系統路徑應該是documentroot指令指定的路徑下的images;如果使用了路徑別名,使用者訪問/images這個URI就不一定是documentroot指令指定的路徑下的images了;它相當於把檔案系統上的一個路徑對映成URL路徑;該指令可以用在server配置塊中,虛擬主機,和directory中;

  示例:

   提示:以上示例表示把檔案系統路徑“/usr/local/apache/icons/” 對映成URL路徑“/icons/”,同時明確授權允許所有人訪問“/usr/local/apache/icons/”目錄;也就是說使用者訪問/icons/目錄就相當於訪問檔案系統路徑“/usr/local/apache/icons/”目錄;

   提示:這裡需要注意一點的是如果我們對映的URL路徑是以“/”結尾,那麼對應檔案系統路徑也必須是“/”結尾,以上面的示例如果我們訪問的URL是/icons將提示我們訪問不到,如下圖

   提示:其實很好理解,上圖的URL會去找documentroot指令指定的檔案系統路徑中找icons檔案,如果能夠找到就把對應檔案內容響應給使用者,如果是在documentroot指令指定的檔案系統路徑下icons是目錄的話,我們訪問/icons就會被/icons/匹配,從而訪問到別名路徑上去;因為我們訪問目錄預設會把目錄下的檔案給以索引的方式羅列出來,所以我們訪問某個目錄,其URL最後會填上一個“/”,這樣一來就會被對應的別名路徑匹配;

  2、設定預設字符集:AddDefaultCharset  charset   此指令表示新增預設字符集,可以用在server配置塊中、虛擬主機、directory、和.htaccess中;預設是off的

  3、日誌設定;web服務日誌型別有兩種型別,一種是訪問日誌,記錄使用者訪問站點的日誌,另一中型別就是錯誤日誌,記錄服務端程式出錯等日誌;

  errorlog:此指令表示定義錯誤日誌存放路徑及名稱,該指令可以用在server配置段中,表示記錄中心主機錯誤日誌,同樣也可以放在各虛擬主機中,表示記錄各虛擬主機的錯誤日誌;其語法格式為:errorlog file-path |syslog [:[facility] [:tag]]   ;從語法格式看我們就知道錯誤日誌除了可以在本地指定檔案來記錄外還可以將其傳送給syslog;

  示例:

   提示:以上配置表示把錯誤日誌存放在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指定的路徑;我們定義的訪問日誌格式到底是什麼樣呢?如下:

   4、基於使用者的訪問控制

   首先我們來了解下幾個概念;

  認證質詢:客戶端訪問服務端時,如果我們對客戶端訪問的資源提前配置了需要認證才可訪問,這時客戶端訪問服務端對應資源時,服務端會向客戶端響應一個狀態碼為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裡的成員是否可以訪問呢?

 

   提示:可以看到沒有被允許的組成員是不能夠認證訪