使用 Apache 服務部署靜態網站
1.網站服務程序
Web網絡服務,一般是指允許用戶通過瀏覽器訪問到互聯網中各種資源的服務。Apache程序是目前擁有很高市場占有率的Web服務程序之一,其跨平臺和安全性廣泛被認可且擁有快速、可靠、簡單的API擴展。Apache也是RHEL 5、6、7系統中默認的Web服務程序。
第一步:把光盤設備中的系統鏡像掛載到 /media/cdrom 目錄。
第二步:使用 Vim 編輯器創建 Yum 倉庫的配置文件。
第三步:安裝 Apache 服務程序。使用yum命令進行安裝時,跟在命令後面的Apache服務的軟件包名稱為httpd。如果直接執行yum install apache命令,則系統會報錯。
第四步:啟動 httpd 服務程序並將其加入到開機啟動項中,使其能夠跟隨系統開機而運行,從而持續為用戶提供 Web 服務。
在瀏覽器(這裏是Firefox)輸入 http://127.0.0.1 回車,就可以看到用於提供 Web 服務的 httpd 服務程序的默認頁面了。
2.配置服務文件參數
httpd 服務程序的主要配置文件及存放位置:
在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服務的運行狀態。
然後就可以看到正常的網頁內容了。
httpd服務程序的功能是允許用戶訪問網站內容,因此SELinux肯定會默認放行用戶對網站的請求操作。但是,我們將網站數據的默認保存目錄修改為了/home/wwwroot,而這就產生問題了。/home目錄是用來存放普通用戶的家目錄數據的,而現在,httpd提供的網站服務卻要去獲取普通用戶家目錄中的數據了,這顯然違反了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 命令使設置立即生效,-Rv參數對指定的目錄進行遞歸操作,以及顯示SELinux安全上下文的修改過程。最後,再次刷新頁面,就可以正常看到網頁內容了。
4.個人用戶主頁功能
httpd服務程序提供的個人用戶主頁功能可以讓系統內所有的用戶在自己的家目錄中管理個人的網站,而且訪問起來也非常容易。
第一步:在httpd服務程序中,默認沒有開啟個人用戶主頁功能。需編輯配置文件 /etc/httpd/conf.d/userdir.conf,在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行開始的內容修改如下。重啟httpd服務。
當用戶再想訪問某個用戶的個人網站時,就必須要輸入賬戶和密碼才能正常訪問了。
5.虛擬主機功能
如果每臺運行Linux系統的服務器上只能運行一個網站,那麽人氣低、流量小的草根站長就要被迫承擔著高昂的服務器租賃費用了,這顯然也會造成硬件資源的浪費。Apache的虛擬主機功能是服務器基於用戶請求的不同IP地址、主機域名或端口號,實現提供多個網站同時為外部提供訪問服務的技術。
5.1 基於 IP 地址
如果一臺服務器有多個IP地址,而且每個IP地址與服務器上部署的每個網站一一對應,這樣當用戶請求訪問不同的IP地址時,會訪問到不同網站的頁面資源。而且,每個網站都有一個獨立的IP地址,對搜索引擎優化也大有裨益。因此以這種方式提供虛擬網站主機功能最常見。
當前實驗通過nmtui命令配置的 IP 如下:
配置完並重啟網卡(systemctl restart network)服務後檢查網絡的連通性:
第一步:分別在/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安全上下文,使其與網站服務功能相吻合。然後用restorecon命令讓新配置的SELinux安全上下文立即生效。
5.3 基於端口號
基於端口號的虛擬主機功能可以讓用戶通過指定的端口號來訪問服務器上的網站資源。在使用Apache配置虛擬網站主機功能時,不僅要考慮httpd服務程序的配置因素,還需要考慮到SELinux服務對新開設端口的監控。一般來說,使用80、443、8080等端口號來提供網站訪問服務是比較合理的,如果使用其他端口號則會受到SELinux服務的限制。
第一步:分別在/home/wwwroot中創建用於保存不同網站數據的兩個目錄,並向其中分別寫入網站的首頁文件。每個首頁文件中應有明確區分不同網站內容的信息,方便稍後能更直觀地檢查效果。
第二步:在httpd服務配置文件的第43行和第44行分別添加用於監聽6111和6222端口的參數。
第三步:在httpd服務的配置文件中大約113行處開始,分別追加寫入兩個基於端口號的虛擬主機網站參數。重啟 httpd 服務。
第四步:設置網站數據目錄文件的SELinux安全上下文。用restorecon命令讓新配置的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)來訪問網站的首頁面時就會提示訪問被拒絕了。
使用 Apache 服務部署靜態網站