使用Apache服務部署靜態網站

網站服務程序
我們平時訪問的網站服務就是Web網絡服務,一般是指允許用戶通過瀏覽器訪問到互聯網中各種資源的服務。如圖所示,Web網絡服務是一種被動訪問的服務程序,即只有接收到互聯網中其他主機發出的請求後纔會響應,最終用於提供服務程序的Web服務器會通過HTTP(超文本傳輸協議)或HTTPS(安全超文本傳輸協議)把請求的內容傳送給用戶。
在這裏插入圖片描述
目前能夠提供Web網絡服務的程序有IIS、Nginx和Apache等。其中,IIS(Internet Information Services,互聯網信息服務)是Windows系統中默認的Web服務程序,這是一款圖形化的網站管理工具,不僅可以提供Web網站服務,還可以提供FTP、NMTP、SMTP等服務。但是,IIS只能在Windows系統中使用。

部署Apache程序:

yum install httpd #安裝Apache服務程序(Apache服務的軟件包名爲httpd)

systemctl start httpd #啓用httpd服務

systemctl enable httpd #加入開機啓動項

用瀏覽器訪問:127.0.0.1(本機)可以看到httpd服務程序的默認頁面,當看到這個頁面時,說明服務程序正常啓動,但可能還會有另外兩種情況

1.權限不足
2.網站內沒有數據

在這裏插入圖片描述
配置服務文件參數

在Linux系統中配置服務,其實就是修改服務的配置文件,因此,還需要知道這些配置文件的所在位置以及用途,httpd服務程序的主要配置文件及存放位置如表所示。

服務目錄 /etc/httpd

主配置文件 /etc/httpd/conf/httpd.conf

網站數據目錄 /var/www/html

訪問日誌 /var/log/httpd/access_log

錯誤日誌 /var/log/httpd/error_log

在httpd服務程序的主配置文件中,存在三種類型的信息:註釋行信息、全局配置、區域配置,如圖所示。

httpd服務程序的主配置文件的構成

在這裏插入圖片描述

全局配置參數與區域配置參數的區別:

全局配置:一種全局性的配置參數,可作用於對所有的子站點,既保證了子站點的正常訪問,也有效減少了頻繁寫入重複參數的工作量。

區域配置:單獨針對於每個獨立的子站點進行設置。

在這裏插入圖片描述

實例:修改保存網站數據的目錄。

#1.建立新的網站數據保存目錄,並創建首頁文件。

mkdir /home/wwwroot

echo 「hello」 > /home/wwwroot/index.html

#2.修改httpd服務程序主配置文件,把網站數據保存路徑修改爲/home/wwwroot

vim /etc/httpd/conf/httpd.conf

119 DocumentRoot 「/home/wwwroot」 #用於定義網站數據保存路徑的參數DocumentRoot修改爲/home/wwwroot

124 <Directory 「home/wwwroot」> #用於定義目錄權限的參數Directory後面的路徑也修改爲/home/wwwroot

128

#3.重啓httpd服務驗證效果,此時會發現因爲權限不足導致出現的是httpd默認首頁(SElinux的安全上下文).

systemctl restart httpd

#4.暫時禁用SElinux,發現可以看到正常的網頁內容了。

setenforce 0

SELinux安全子系統

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

SELinux服務有三種配置模式,具體如下。

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

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

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

SELinux服務的主配置文件中,定義的是SELinux的默認運行狀態,可以將其理解爲系統重啓後的狀態,因此它不會在更改後立即生效。可以使用getenforce命令獲得當前SELinux服務的運行模式:

[[email protected] ~]# getenforce

Enforcing

getenforce:查看當前SELinxu服務的運行模式

setenforce [0|1]:修改SELinux當前的運行模式(0禁用,1啓用)。此修改是臨時的,在系統重啓後就會失效。

分析上面實例被SELinux攔截的原因:

semanage命令:用於管理SELinux的策略,格式:semanage [選項] [文件]。

semanage命令不僅能夠像傳統chcon命令那樣—設置文件、目錄的策略,還可以管理網絡端口、消息接口。常用參數:

-l:用於查詢;

-a:用於添加;

-m:用於修改;

-d:用於刪除;

-t:指定要想修改的值。

semanage命令沒有遞歸功能,因此要先修改目錄的安全上下文,再修改目錄裏所有文件的安全上下文。另外semanage命令修改好的配置不會立即生效。

restorecon命令:將設置好的SELinux安全上下文立即生效。格式: restorecon [選項] [指定目錄或文件]。

常用參數:

-R:對指定目錄進行遞歸操作
-v:顯示SELinux安全上下文的修改過程

實例:解決上面實例被SELinux攔截的問題。

#1.把SELinux服務恢復到強制啓用安全策略模式

setenforce 1

#2.分別查看原始網站數據的保存目錄與當前網站數據的保存目錄的SELinux安全上下文值

ls -Zd /var/www/html #SElinux安全上下文爲httpd_sys_content_t

ls -Zd /home/wwwroot #SELinux安全上下文爲home_root_t

#3.把當前網站數據保存目錄的安全上下文設置成和原始網站數據保存目錄的安全上下文一樣

semanage fcontext -a -t httpd_sys_content_t /home/wwwroot #修改目錄的安全上下文

semanage fcontext -a -t httpd_sys_content_t /home/wwwroot/* #修改目錄裏的所有文件的安全上下文

#4.使設置好的SELinux安全上下文立即生效

restorecon -Rv /home/wwwroot/

個人用戶主頁功能

getsebool命令:搭配-a參數輸出所有安全策略(off禁止,on允許)

setsebool命令:修改SELinux策略中各條規則的布爾值。搭配-P參數使得修改後的SELinux策略規則立即且永久生效。

實例:實現個人用戶主頁功能。

#1.修改配置文件/etc/httpd/conf.d/userdir.conf ,讓httpd服務程序開啓個人用戶主頁功能。

vim /etc/httpd/conf.d/userdir.conf

17 UserDir public_html #UserDir參數表示網站數據在用戶家目錄中的保存目錄名稱,即public_html目錄

31 <Directory 「/home/*/public_html」> #注意要和17行的目錄名一致

35

#2.在用戶家目錄中建立用於保存網站數據的目錄及首頁文件。把自己家目錄的權限修改爲755,以保證其他人也有權限讀取裏面的內容。退出該用戶。

su - linuxprobe

mkdir public_html #注意要和配置文件中的目錄名一致

echo 「linuxprobe’s website」 > public_html/index.html

chmod -Rf 755 ~ #「~」代表就是當前用戶的家目錄,相當於/home/linuxprobe

exit

#3.重啓httpd服務。在瀏覽器輸入網址驗證(格式:網址/~用戶名),會報錯。原因依然在於SELinux。

systemctl restart httpd

#4.查詢並過濾出所有與http協議相關的安全策略。留意

httpd_enable_homedirs是否爲on狀態,若不是,修改爲on狀態並立即且永久生效。

getsebool -a | grep http

setsebool -P httpd_enable_homedirs=on

實例:在上面實例的基礎上,爲網站中添加口令功能,讓只有通過身份驗證的用戶訪客才能看到網站內容。

htpasswd命令:建立和更新存儲用戶名、密碼的文本文件, 用於對HTTP用戶的basic認證。htpasswd 是開源 http 服務器apache httpd的一個命令工具。其中,用於驗證的用戶名稱不必是系統已有的本地賬戶,該命令生成的賬戶密碼和系統中的賬戶密碼是獨立的,沒有聯繫。

-c參數:創建密碼文件.如果密碼文件已經存在,那麼它會重新寫入並刪去原有內容。

#1.生成密碼數據庫

htpasswd -c /etc/httpd/passwd liwh #生成密碼文件,添加一個名爲liwh的用戶

htpasswd /etc/httpd/passwd liangjm #往密碼文件追加一個用戶liangjm

#2.修改個人用戶主頁功能的配置文件

vim /etc/httpd/conf.d/userdir.conf

31 <Directory 「/home/*/public_html」>

32 AllowOverride all #允許僞靜態技術

33 authuserfile 「/etc/httpd/passwd」 #指定生成的密碼文件的存放路徑

34 authname 「Hello」 #當用戶嘗試訪問個人用戶網站時的提示信息

35 authtype basic #採用基本驗證方式

36 require user mumu #指定用戶進行賬戶密碼認證時支持驗證的用戶(可以支持多個用戶驗證,比如:mumu,haha)

37

#3.重啓httpd服務,刷新頁面,會彈出窗口要求輸入賬戶密碼。其中liwh的帳號密碼是沒用的,只能用liangjm賬號密碼驗證

systemctl restart httpd

虛擬網站主機功能

Apache的虛擬主機功能是服務器基於用戶請求的不同IP地址、主機域名或端口號,實現提供多個網站同時爲外部提供訪問服務的技術,如圖所示,用戶請求的資源不同,最終獲取到的網頁內容也各不相同。

在這裏插入圖片描述

在配置虛擬網站主機功能前,做些基本設置:分別在/home/wwwroot中創建用於保存不同網站數據的3個目錄,並向其中分別寫入網站的首頁文件。每個首頁文件中要有明確區分不同網站內容的信息,以便能更直觀地檢查效果。由前面實例可知,目錄/home/wwwroot及其下級目錄和文件一定會受到SELinux安全上下文的制約,要修改相關內目錄及其裏面所有文件的SELinux安全上下文,並讓設置立即生效。

mkdir -p /home/wwwroot/A
mkdir -p /home/wwwroot/B
mkdir -p /home/wwwroot/C
echo 「This is A」 > /home/wwwroot/A/index.html
echo 「This is B」 > /home/wwwroot/B/index.html
echo 「This is C」 > /home/wwwroot/C/index.html
semanage fcontext -a -t httpd_sys_content_t /home/wwwroot
semanage fcontext -a -t httpd_sys_content_t /home/wwwroot/A
semanage fcontext -a -t httpd_sys_content_t /home/wwwroot/B
semanage fcontext -a -t httpd_sys_content_t /home/wwwroot/C
semanage fcontext -a -t httpd_sys_content_t /home/wwwroot/A/*
semanage fcontext -a -t httpd_sys_content_t /home/wwwroot/B/*
semanage fcontext -a -t httpd_sys_content_t /home/wwwroot/C/*
restorecon -Rv /home/wwwroot

1.基於IP地址實現虛擬網站主機功能。

#1.爲網卡配置3個ip地址(方法很多)

vim /etc/sysconfig/network-scripts/ifcfg-eno16777728

IPADDR0=192.168.10.10
IPADDR1=192.168.10.20
IPADDR2=192.168.10.30

#2.編輯httpd服務的主配置文件,追加寫入3個基於IP地址的虛擬主機網站參數
vim /etc/httpd/conf/httpd.conf

113 <VirtualHost 192.168.10.10> #虛擬主機參數開始
114 DocumentRoot /home/wwwroot/B #虛擬主機的家目錄
115 ServerName www.b.com #虛擬主機的域名
116 <Directory /home/wwwroot/B > #子目錄權限指定
117 AllowOverride None #關閉僞靜態
118 Require all granted #允許所有環回請求
119
120 #虛擬主機參數結束
121 <VirtualHost 192.168.10.10>
122 DocumentRoot /home/wwwroot/A
123 ServerName www.a.com
124 <Directory /home/wwwroot/A >
125 AllowOverride None
126 Require all granted
127
128
129 <VirtualHost 192.168.10.30>
130 DocumentRoot /home/wwwroot/C
131 ServerName www.c.com
132 <Directory /home/wwwroot/C >
133 AllowOverride None
134 Require all granted
135
136

#3.重啓httpd服務,在瀏覽器分別輸入相應的ip地址進行驗證。
systemctl restart httpd

測試結果:

訪問192.168.10.30,會出現「This is C」;
訪問192.168.10.20,會出現默認頁面(因爲上面根本沒有用到192.168.10.20);
訪問192.168.10.10,會出現「This is B」。上面配置參數表明192.168.10.10這個ip地址是對應着兩個虛擬主機網站參數,但是由於B頁面的參數編輯在最上面,因此訪問192.168.10.10時出現的是B頁面。

2.在1的基礎之上,基於主機域名實現虛擬網站主機功能。

#1.編輯IP地址與域名之間對應關係的配置文件,保存退出後會立即生效
2 vim /etc/hosts
3 …
4 192.168.10.10 www.a.com www.b.com www.c.com

基於主機域名的配置其實在實例1就已經配置好了,因爲是基於主機域名,所以和ip地址無關。輸入虛擬主機裏定義的域名,就會出現相對應的頁面。

分別在瀏覽輸入相應的域名,測試結果:

訪問www.a.com,出現「This is A」;
訪問www.b.com,出現「This is B」;
訪問www.c.com,出現「This is C」;

3.在1的基礎上,基於端口號實現虛擬網站主機功能。

#1.修改httpd服務的主配置文件,添加幾個用於監聽端口的參數;修改虛擬主機網站參數爲基於端口號的形式。
vim /etc/httpd/conf/httpd.conf

43 Listen 6111 #監聽端口6111參數
44 Listen 6222
45 Listen 6333

113 <VirtualHost 192.168.10.10:6111> #基於端口的虛擬主機網站參數

121 <VirtualHost 192.168.10.10:6222>

129 <VirtualHost 192.168.10.10:6333>

#2.查看SELinux是否允許Apache服務使用新添加的幾個監聽端口,若不允許則添加這些端口號
semanage port -l | grep http #使用semanage命令查詢並過濾出所有與HTTP協議相關且SELinux服務允許的端口列表。
semanage port -a -t http_port_t -p tcp 6111 #在SELinux允許的與HTTP協議相關的端口號中添加相應的端口號
semanage port -a -t http_port_t -p tcp 6222
semanage port -a -t http_port_t -p tcp 6333
semanage port -l | grep http #添加端口號的操作會立即且永久生效,再一次查看與HTTP協議相關且SELinux服務允許的端口列表。
#3.重啓httpd服務
systemctl restart httpd

測試結果:

訪問192.168.10.10:6111,顯示「This is B」。
訪問192.168.10.10:6222,顯示「This is A」。
訪問192.168.10.10:6333,顯示「This is C」。

Apache的訪問控制

設置Apache訪問控制,使得只有ip地址爲192.168.10.1或使用火狐瀏覽器的客戶端才能訪問指定的網頁。

#1.在默認網站數據目錄新建一個子目錄,並在該子目錄創建一個首頁文件。
mkdir /var/www/html/server
echo 「NB」 > /var/www/html/server/index.html
#2.修改httpd服務的主配置文件,編輯規則限制源主機的訪問。
vim /etc/httpd/conf/httpd.conf

129 <Directory 「/var/www/html/server」> #針對該子目錄的權限設置
130 SetEnvIf User-Agent 「Firefox」 ff=1 #設置環境變量,相當於ff=「用戶通過Firefox訪問」
131 Order allow,deny #先匹配允許規則再匹配拒絕規則
132 Deny from 192.168.10.55 #拒絕ip地址爲192.168.10.55的主機訪問
133 Allow from env=ff #允許使用火狐瀏覽器的人訪問
134 Allow from 192.168.10.1 #允許ip地址192.168.10.1的主機訪問
135

#3.重啓httpd服務
systemctl restart httpd

測試結果:

ip地址爲192.168.10.1的主機使用非火狐瀏覽器也能訪問; ip地址爲192.168.10.55的主機即使使用火狐瀏覽器也不能訪問; ip地址不是192.168.10.1的主機使用火狐瀏覽器可以訪問。