■ 枝江市職業教育中心 楊華
目前能夠提供Web網絡服務的程序有IIS、Nginx和Apache等。其中,IIS是Windows系統中默認的Web服務程序,是一款圖形化的網站管理工具,不僅可以提供Web網站服務,還可以提供FTP、NMTP及SMTP等服務。但IIS只能在Windows系統中使用。
Apache程序是目前擁有很高市場占有率的Web服務程序之一,其跨平臺和安全性廣泛被認可且擁有快速、可靠、簡單的API擴展。Apache服務程序可以運行在Linux系統、Unix系統甚至是Windows系統中,支持基于IP、域名及端口號的虛擬主機功能,支持多種認證方式,集成有代理服務器模塊、安全Socket層(SSL),能夠實時監視服務狀態與定制日志消息,并有著各類豐富的模塊支持。
一方面在Web服務器軟件市場具有相當高的占有率,另一方面Apache也是RHEL 7系統中默認的Web服務程序,而且還是RHCSA和RHCE(紅帽)認證考試的必考內容。
因此,無論從實際應用角度還是從應對紅帽認證考試的角度,我們都有必要好好學習Apache服務程序的部署,并深入挖掘其可用的豐富功能。
首先我們要正確安裝Apache服務,然后啟動服務。

注意:以上只是提供服務啟動失敗,具體的錯誤詳細信息則可以利用"systemctl status httpd.service"來查看。
顯示提示:(98)Address already in use:AH00072:make_sock:could n...]:80
出現“address already in use”,則我們需要修改端口,以上錯誤提示無法綁定80端口,因為WWW服務默認端口是80。
這里有兩種解決方案:
1.找出占用80端口的服務或程序,把它停用即可。
先找到占用端口的程序進程號:

再根據進程號找出對應的服務或程序:


現在我們可以根據實際情況刪除該服務或程序,或者找到相關配置文件,修改端口。
2.如果以上服務或程序無法刪除或因其它原因不能做任何修改,那就只好修改自己配置文檔,重新啟用80以外的端口:

進入配置文件后,修改配置文件,此處為Listen 8080。
當然為確保該端口,可以先查詢下使用情況,結果沒有任何匹配信息,可以放心使用了:

筆者本以為這樣配置后,馬上就可以使用8080端口正常訪問了,但希望很快破滅了,又出現了如下錯誤信息:


怎么又占用了?通過查詢不是沒有程序使用該端口嗎?
原來,同樣是端口問題,但原因不一樣了:Permission denied (拒絕訪問)。
這里有必要提到Linux下重要的安全措施——SELinux安全子系統。
SELinux(Security-Enhanced Linux)是一個強制訪問控制(MAC)的安全子系統。RHEL 7系統使用SELinux技術的目的是為了讓各個服務進程都受到約束,使其僅獲取到本應獲取的資源。
例如,您在自己的電腦上下載了一個修圖軟件,當您全神貫注地使用它給照片進行美顏時,它卻在后臺默默監聽著瀏覽器中輸入的密碼信息,而這顯然不應該是它應做的事情(哪怕是訪問電腦中的圖片資源)。
SELinux安全子系統就是為了杜絕此類情況而設計的,它能夠從多方面監控違法行為:對服務程序的功能進行限制(SELinux域限制可以確保服務程序做不了出格的事情);對文件資源的訪問限制(SELinux安全上下文確保文件資源只能被其所屬的服務程序進行訪問)。
系統默認SELinux是處于強制級別,這里我們只做簡單的配置,將它配置成松散級別,以確保我們的服務正常啟用即可。(當然,從安全角度來講,作者不建議這么做,因為它的配置較復雜,以后專門來討論)。
SELinux的運行模式分為三種:enforcing(強制)、permissive(寬松),以及disabled(徹底禁用)。
通過getenforce查看當前SElinux狀態:

只要通過setenforce 0更改它的運行模式即可:

不過以上只是臨時配置,每次系統啟動都要重新配置。如果需要永久配置可以編輯配置文件“/etc/selinux/config”,修改以下選項:
SELINUX=permissive
至此,端口問題總算解決了。
注意:有時出現以下提示錯誤:apache啟動錯誤 AH00072:make_sock:could not bind to address[::]:443。
httpd.conf里面配置的listen端口是80,但是提示是443,奇怪了,其實443是apache-ssl的端口,也就是我們通過https://安全訪問時的默認端口,處理方法同上了。
經過以上配置,端口占用的情況應該可以排除了,服務總算可以正常啟動了。根據常規流程,應該可以正常訪問了,但結果是打開瀏覽器仍然無法訪問。
經過以上折騰,繼續驗證Apache服務是否正常啟動:


這是一個警告提示信息,“全局設置“ServerName”指令以禁止顯示此消息”。
雖然只是個警告信息,可能不會影響服務的正常運行,但在后期的調試中,可能會出現其它的故障。
因為根據配置文檔中“ServerName”的注釋說明,默認是不需要指定的,服務器通過名字解析過程來獲得自己的名字。但如果解析有問題(如反向解析不正確),或者沒有DNS名字,也可以在這里指定IP地址,當這項不正確的時候服務器不能正常啟動。
解決方法就是啟動該項,把“www.example.com:80”修改為自己的域名或者直接修改為“localhost”。此項配置文件中有兩處,第一處是全局選項,這是我們初次配置是需要關注的。
另外一處一般出現在下面的局部配置(如下所示),是需要做虛擬主機制的配置,此時可暫時略過了。


1.主機名不是默認的localhost(如筆者的主機名:hbzjtb)
系統主要在以下兩個配置文件中驗證主機名的映射了:系統會先在httpd.conf中搜索主機域名映射,如果沒有得到解析,那么就會轉去hosts文件中試圖使用主機名來取代,如果還是沒有找到,就會出現以上錯誤提示。
(1)修改配置文件httpd.conf

系統默認首先到“/etc/httpd/conf/httpd.conf”項中查看ServerName選項,而對于此項,系統默認有一個詳細配置說明,但下面是一個注釋項,需要用戶根據自己的域名注冊記錄進行修改。


譯文:“server name”提供服務器用來標識自身的名稱和端口。這通常可以自動確定,但筆者建議您顯式指定它,以防止在啟動期間出現問題。如果您的主機沒有注冊的DNS名稱,請在此處輸入其IP地址:

所以這個地方可以去掉注釋,寫成:

注意:其實這個地方只要基本語法正確,即ServerName后一定是“主機名或IP:端口號”,系統并不會驗證其主機名和IP及端口號。即輸入“ServerName www.hbzj.cn:8080”,也會讓HTTPD服務正常加載運行了。只不過后面如果要通過域名服務,就會出現訪問故障了。

譯文:/etc/httpd/conf/httpd.conf的第43行出現語法錯誤:
ServerName接受一個參數,即服務器的主機名和端口。
(2)修改配置文件/etc/hosts
如果上面的配置文件沒有更改,接下來系統會繼續驗證/etc/hosts中查詢域名映射是否正確,因為localhost是系統默認的主機名,所在在配置文件中hosts中有映射記錄。
所以,如果默認沒有更改主機名,就直接驗證通過。但主機名已更改了,這地方要做以下修改:
127.0.0.1 localhost.localdomain localhost hbzjtb
注意:并不是Windows下的127.0.0.1 hbzjtb
2.主機名就是默認的localhost
系統會根據配置文件映射到默認的localhost,所以以上兩個配置文件不需要做任何修改,系統httpd服務即可順利啟動。
經過以上艱難的排錯,終于看到了Apache正常啟動信息。馬上去瀏覽器打開網頁,期待的默認主面卻并沒有出現。
筆者猛然想到Linux嚴格的安全機制,防火墻好像沒有去配置。
查看防火墻設置:

發現果然沒有開啟任何服務端口,馬上開啟:

注意: “--permanent #”永久生效,沒有此參數重啟后將失效。
網頁重新加載,久違的默認主頁終于出現了。