1. 程式人生 > >Apache服務:使用 Apache 服務部署靜態網站

Apache服務:使用 Apache 服務部署靜態網站

1.安裝Apache服務

  第一步:安裝Apache服務程式   yum install httpd

      具體流程參考https://www.cnblogs.com/python-wen/p/10168452.html

  第二步:啟動 httpd 服務程式並將其加入到開機啟動項中,使其能夠跟隨系統開機而執行,從而持續為使用者提供 Web 服務。

      systemctl  restart  httpd

      systemctl  enable  httpd

  第三步:測試Apache服務安裝是否成功

      在瀏覽器中輸入本機的IP地址,測試Apache服務是否安裝成功,看到此頁面說明Apache服務已經成功安裝。

2.配置服務檔案引數

  httpd 服務程式的主要配置文 件及存放位置如表 10-1所示:

在httpd服務程式的主配置檔案中,存在三種類型的資訊:註釋行資訊、全域性配置、區域配置。

全域性配置引數就是一種全域性性的配置引數,可作用於對所有的子站點,既保證了子站點的正常訪問,也有效減少了頻繁寫入重複引數的工作量。區域配置引數則是單獨針對於每個獨立的子站點進行設定的。在httpd服務程式主配置檔案中,最為常用的引數如下表:

DocumentRoot引數用於定義網站資料的儲存路徑,其引數的預設值是把網站資料存放到/var/www/html目錄中;而當前網站普遍的首頁面名稱是index.html,因此可以向/var/www/html目錄中寫入一個檔案,替換掉httpd服務程式的預設首頁面,該操作會立即生效。

預設情況下,網站資料是儲存在/var/www/html目錄中,如果想把儲存網站資料的目錄修改為/home/wwwroot目錄,該怎麼操作呢?

  第一步:建立網站資料的儲存目錄,並建立首頁檔案。

  第二步:開啟 httpd 服務程式的主配置檔案,將約第 119 行用於定義網站資料儲存路徑的引數 DocumentRoot 修改為/home/wwwroot,同時還需要將約第 124 行用於定義目錄許可權的參 數 Directory 後面的路徑也修改為/home/wwwroot。配置檔案修改完畢後即可儲存並退出。

  第三步:重新啟動 httpd 服務程式並驗證效果,瀏覽器重新整理頁面後的內容如圖所示。為什麼看到了 httpd 服務程式的預設首頁面?按理來說,只有在網站的首頁面檔案不存 在或者使用者許可權不足時,才顯示 httpd 服務程式的預設首頁面。我們在嘗試訪問 http://127.0.0.1/index.html 頁面時,竟然發現頁面中顯示“Forbidden,You don't have permission to access /index.html on this server.”。而這一切正是 SELinux 在搗鬼。 

 

3.SELinux 安全子系統 

  SELinux(Security-Enhanced Linux)是美國國家安全域性在 Linux 開源社群的幫助下開發的 一個強制訪問控制(MAC,Mandatory Access Control)的安全子系統。RHEL 7 系統使用 SELinux 技術的目的是為了讓各個服務程序都受到約束,使其僅獲取到本應獲取的資源。 

  例如,您在自己的電腦上下載了一個美圖軟體,當您全神貫注地使用它給照片進行美顏 的時候,它卻在後臺默默監聽著瀏覽器中輸入的密碼資訊,而這顯然不應該是它應做的事情 (哪怕是訪問電腦中的圖片資源,都情有可原)。SELinux 安全子系統就是為了杜絕此類情況而 設計的,它能夠從多方面監控違法行為:對服務程式的功能進行限制(SELinux 域限制可以確 保服務程式做不了出格的事情);對檔案資源的訪問限制(SELinux 安全上下文確保檔案資源 只能被其所屬的服務程式進行訪問。 

SELinux 服務有三種配置模式:

  ➢ enforcing:強制啟用安全策略模式,將攔截服務的不合法請求。

  ➢ permissive:遇到服務越權訪問時,只發出警告而不強制攔截。

  ➢ disabled:對於越權的行為不警告也不攔截。

我這裡預設就是 enforcing的(可檢視該服務的主配置檔案 /etc/selinux/config)。

把SELinux當前的執行模式修改為禁用(通過命令 setenforce [0|1],0代表禁用、1代表啟用),該修改在重啟系統後失效,可以通過 getenforce 命令檢視 SELinux服務的執行狀態。

再次重新整理網頁,就會看到正常的網頁內容了,如圖所示。可見,問題確實是出在了 SELinux 服務上面。

【反思:前面的操作中到底是哪裡出問題了呢? 】httpd 服務程式的功能是允許使用者訪問網站內容,因此 SELinux 肯定會預設放行使用者對網站的請求操作。但是,我們將網站資料的預設儲存目錄修改為了/home/wwwroot,而這就產生 問題了。之前講到,/home 目錄是用來存放普通使用者的家目錄資料的,而現在,httpd 提供的網站服務卻要去獲取普通使用者家目錄中的資料了,這顯然違反了 SELinux 的監管原則。

 

現在,我們把 SELinux 服務恢復到強制啟用安全策略模式,然後分別檢視原始網站資料 的儲存目錄與當前網站資料的儲存目錄是否擁有不同的 SELinux 安全上下文值: 

在檔案上設定的 SELinux 安全上下文是由使用者段、角色段以及型別段等多個資訊項共同 組成的。其中,使用者段 system_u 代表系統程序的身份,角色段 object_r 代表檔案目錄的角色, 型別段 httpd_sys_content_t 代表網站服務的系統檔案。

針對當前這種情況,我們只需要使用 semanage 命令,將當前網站目錄/home/wwwroot 的 SELinux 安全上下文修改為跟原始網站目錄的一樣就可以了。

3.1 semanage 命令 

  semanage 命令用於管理 SELinux 的策略,格式為“semanage [選項] [檔案]”常用引數及作用: -l 查詢、-a 新增、-m 修改、-d 刪除。

  向新的網站資料目錄中新新增一條SELinux安全上下文,讓這個目錄以及裡面的所有檔案能夠被httpd服務程式所訪問到:

注意,執行上述設定之後,還無法立即訪問網站,還需要使用 restorecon 命令將設定好的 SELinux 安全上下文立即生效。在使用 restorecon 命令時,可以加上-Rv 引數對指定的目錄進 行遞迴操作,以及顯示 SELinux 安全上下文的修改過程。

最後,再次重新整理頁面,就可以正常 看到網頁內容了,結果如圖所示:

4.個人使用者主頁功能

  如果想在系統中為每位使用者建立一個獨立的網站,httpd 服務程式提供的個人使用者主頁功能完全可以以勝任這個工作。該功能可以讓系統內所有的使用者在自己的家目錄中管理個人的網站,而且訪問起來也非常容易。

  第一步:在 httpd 服務程式中,預設沒有開啟個人使用者主頁功能。為此,我們需要編輯下面的配置檔案,然後在第 17 行的 UserDir disabled 引數前面加上井號(#),表示讓 httpd 服務 程式開啟個人使用者主頁功能;同時再把第 24 行的 UserDir public_html 引數前面的井號(#)去 掉( UserDir 引數表示網站資料在使用者家目錄中的儲存目錄名稱,即 public_html 目錄。

   第二步:在使用者家目錄中建立用於儲存網站資料的目錄及首頁面檔案。另外,還需要把家目錄的許可權修改為 755,保證其他人也有許可權讀取裡面的內容。

  

  第三步:重新啟動 httpd 服務程式,在瀏覽器的位址列中輸入網址,其格式為“網址/~使用者名稱”(其中的波浪號是必需的,而且網址、波浪號、使用者名稱之間沒有空格),從理論上來講就 可以看到使用者的個人網站了。不出所料的是,系統顯示報錯頁面,如圖所示。這一定還 是 SELinux 惹的禍。 

  第四步:思考報錯原。httpd服務程式在提供個人使用者主頁功能時,該使用者的網站資料目錄本身就應該是存放到與這位使用者對應的家目錄中的,所以應該不需要修改家目錄的SELinux安全上下文。Linux域確保服務程式不能執行違規的操作,只能本本分分地為使用者提供服務。httpd服務中突然開啟的這項個人使用者主頁功能到底有沒有被SELinux域預設允許呢?

使用 getsebool 目錄查詢並過濾所有與 HTTP 協議相關的安全策略,off 為禁止狀態,on為允許。

通過名字大致猜測出相關的策略用途。httpd服務的個人使用者主頁功能的SELinux域安全策略應該是httpd_enable_homedirs。然後通過setsebool命令來修改SELinux策略中各條規則的布林值。-P 引數表示使修改立即生效且永久生效。

經過這次的修改,再重新整理網頁,已經可以正常打開了。

有時,網站的擁有者並不希望直接將網頁內容顯示出來,只想讓通過身份驗證的使用者訪客看到裡面的內容,這時就可以在網站中新增口令功能了。

  第一步:先使用htpasswd命令生成密碼資料庫。-c引數表示第一次生成;後面再分別新增密碼資料庫的存放檔案,以及驗證要用到的使用者名稱稱(該使用者不必是系統中已有的本地賬戶)。

  第二步:編輯個人使用者主頁功能的配置檔案。把第 31~35 行的引數資訊修改成下列內容,其中井號(#)開頭的內容為劉遄老師新增的註釋資訊,可將其忽略。隨後儲存並退出配 置檔案,重啟 httpd 服務程式即可生效。注意重啟時先將SELinux關閉,再重啟httpd,然後再開啟SELinux:(setenforce 0 #  systemctl restart httpd  #  setenforce 1)如果不這樣做,系統會報錯如下:

Job for httpd.service failed because the control process exited with error code. See "systemctl status httpd.service" and "journalctl -xe" for details.

 

此後,當用戶再想訪問某個使用者的個人網站時,就必須要輸入賬戶和密碼才能正常訪問 了。另外,驗證時使用的賬戶和密碼是用 htpasswd 命令生成的專門用於網站登入的口令密碼, 而不是系統中的使用者密碼,請不要搞錯了。如圖所示:

 

5.虛擬主機功能

  如果每臺執行Linux系統的伺服器上只能執行一個網站,那麼人氣低、流量小的草根站長就要被迫承擔著高昂的伺服器租賃費用了,這顯然也會造成硬體資源的浪費。Apache的虛擬主機功能是伺服器基於使用者請求的不同IP地址、主機域名或埠號,實現提供多個網站同時為外部提供訪問服務的技術。

5.1 基於IP地址

  如果一臺伺服器有多個IP地址,而且每個IP地址與伺服器上部署的每個網站一一對應,這樣當用戶請求訪問不同的IP地址時,會訪問到不同網站的頁面資源。而且,每個網站都有一個獨立的IP地址,對搜尋引擎優化也大有裨益。因此以這種方式提供虛擬網站主機功能最常見。

 當前實驗通過nmtui命令配置的 IP 如下:

  第一步:分別在/home/wwwroot 中建立用於儲存不同網站資料的 3 個目錄,並向其中分別寫入網站的首頁檔案。

  第二步:在 httpd 服務的配置檔案中大約 113 行處開始,分別追加寫入三個基於 IP 地址的虛擬主機網站引數,然後儲存並退出。記得需要重啟httpd服務,這些配置才生效。

  第三步:此時訪問網站,則會看到httpd服務程式的預設首頁面。仍是 SELinux 的問題。由於當前的/home/wwwroot目錄及裡面的網站資料目錄的SELinux安全上下文與網站服務不吻合,因此httpd服務程式無法獲取到這些網站資料目錄。需要手動把新的網站資料目錄的SELinux安全上下文設定正確,並使用restorecon命令讓新設定的SELinux安全上下文立即生效,這樣就可以看到網站的訪問效果了。

 

5.2 基於主機域名

  當伺服器無法為每個網站都分配一個獨立IP地址的時候,可以嘗試讓Apache自動識別使用者請求的域名,從而根據不同的域名請求來傳輸不同的內容。/etc/hosts是Linux系統中用於強制把某個主機域名解析到指定IP地址的配置檔案。簡單來說,只要這個檔案配置正確,即使網絡卡引數中沒有DNS資訊也依然能夠將域名解析為某個IP地址。

  第一步:手工定義 IP 地址與域名之間對應關係的配置檔案,儲存並退出後會立即生效。可以通過分別 ping 這些域名來驗證域名是否已經成功解析為IP地址。

  第二步:分別在/home/wwwroot 中建立用於儲存不同網站資料的三個目錄,並向其中分別寫入網站的首頁檔案。

  第三步:httpd 服務的配置檔案中大約 113 行處開始,分別追加寫入三個基於主機名的虛擬主機網站引數,然後儲存並退出。記得需要重啟 httpd 服務,這些配置才生效。

  第四步:因為當前的網站資料目錄還是在/home/wwwroot 目錄中,因此還是必須要正確設定網站資料目錄檔案的 SELinux 安全上下文。

5.3 基於埠號

  基於埠號的虛擬主機功能可以讓使用者通過指定的埠號來訪問伺服器上的網站資源。在使用Apache配置虛擬網站主機功能時,不僅要考慮httpd服務程式的配置因素,還需要考慮到SELinux服務對新開設埠的監控。一般來說,使用80、443、8080等埠號來提供網站訪問服務是比較合理的,如果使用其他埠號則會受到SELinux服務的限制。

  第一步:分別在/home/wwwroot中建立用於儲存不同網站資料的兩個目錄,並向其中分別寫入網站的首頁檔案。每個首頁檔案中應有明確區分不同網站內容的資訊,方便稍後能更直觀地檢查效果。

   第二步:在 httpd 服務配置檔案的第 43 行和第 44 行分別新增用於監聽 6111 和 6222埠的引數。

  第三步:在 httpd 服務的配置檔案中大約 113 行處開始,分別追加寫入兩個基於埠號的虛擬主機網站引數,然後儲存並退出。記得需要重啟 httpd 服務,這些配置才生效。

  第四步:因為我們把網站資料目錄存放在/home/wwwroot 目錄中,因此還是必須要正確設定網站資料目錄檔案的 SELinux 安全上下文,使其與網站服務功能相吻合。

設定完後測試連線,出現報錯資訊。這是因為SELinux服務檢測到6111和6222埠原本不屬於Apache服務應該需要的資源,但現在卻以httpd服務程式的名義監聽使用了,所以SELinux會拒絕使用Apache服務使用這兩個埠。使用semanage命令查詢並過濾出所有與HTTP協議相關且SELinux服務允許的埠列表:

  第五步:手動新增6111和6222埠號到SELinux允許的與http協議相關的埠號中。該操作立即生效且永久有效。

重啟httpd服務再次測試,可以看到正確結果。

 

6.Apache的訪問控制

  Apache可以基於源主機名、源IP地址或源主機上的瀏覽器特徵等資訊對網站上的資源進行訪問控制。它通過Allow指令允許某個主機訪問伺服器上的網站資源,通過Deny指令實現禁止訪問。在允許或禁止訪問網站資源時,還會用到Order指令,這個指令用來定義Allow或Deny指令起作用的順序,其匹配原則是按照順序進行匹配,若匹配成功則執行後面的預設指令。比如“Order Allow, Deny”表示先將源主機與允許規則進行匹配,若匹配成功則允許訪問請求,反之則拒絕訪問請求。

  第一步:先在伺服器上的網站資料目錄中新建一個子目錄,並在這個子目錄中建立一個包含 Successful 單詞的首頁檔案。

  第二步:開啟httpd服務的配置檔案,在第129行後面新增下述規則來限制源主機的訪問。這段規則的含義是允許使用Firefox瀏覽器的主機訪問伺服器上的首頁檔案,除此之外的所有請求都將被拒絕。

  第三步:除了匹配源主機的瀏覽器特徵之外,還可以通過匹配源主機的 IP 地址進行訪問控制。例 如,我們只允許 IP 地址為 192.168.10.20 的主機訪問網站資源,那麼就可以在 httpd 服務配置 檔案的第 129 行後面新增下述規則。這樣在重啟 httpd 服務程式後再用本機(即伺服器,其 IP 地址為 192.168.10.10)來訪問網站的首頁面時就會提示訪問被拒絕了。

結果:只有IP地址為192.168.232.152的主機可以成功訪問伺服器,其它都被禁止。