接上一篇文章,在瞭解Apache基本配置以及SELinux相關知識後,繼續演示Apache提供的虛擬主機功能以及訪問控制方式。html
若是還沒看上一篇的建議先查看後再來,上篇文章「linux入門系列18--web服務之apache服務1」。linux
若是早期你部署過網站,相信必定知道虛擬機主機、VPS等概念,尤爲是2000年先後建站很是流行,甚至誕生了不少成功的草根站長,其中有一部分網站到如今仍然作的很是成功。web
網站流量的增長是一個長期累積的過程,若是每臺服務器上只能運行一個網站,那些人氣低、流量小的草根站長就要被迫承擔着高昂的服務器租賃費用,這顯然也會形成硬件資源的浪費。sql
爲此在虛擬專用服務器(VPS:Virtual Private Server)和雲計算技術誕生之前,IDC服務供應商爲了更充分利用服務器資源和減低草根站長的購買門檻,都啓用了虛擬主機功能。利用虛擬主機功能,能夠把一臺處於運行狀態的物理服務器分割成多個「虛擬的服務器」。apache
虛擬主機功能也有明顯的缺點,它沒法像目前的雲主機技術那樣實現硬件資源的隔離,這些虛擬主機共同使用物理服務器的硬件資源,IDC供應商只能限制硬盤的使用空間大小,所以同一臺物理主機上的不一樣用戶的虛擬主機可能會相互影響。可是出於成本考慮,目前仍是有部分我的站長採用虛擬主機的方式來部署網站。vim
其示意圖以下:segmentfault
Apache的虛擬主機功能是服務器基於用戶請求的不一樣IP地址、主機域名或端口號,實現提供多個網站同時爲外部提供訪問服務的技術。瀏覽器
若是一臺服務器有多個IP地址,每一個IP與服務器上部署的每一個網站一一對應, 這樣當用戶請求訪問不一樣的IP地址時,會訪問到不一樣網站的頁面資源。服務器
這種方式每一個網站都有一個獨立的IP地址,利於搜索引擎SEO優化,所以這種方式提供虛擬網站主機功能最多見且受草根站長的歡迎。網絡
本示例IP的網站對應關係爲:192.168.78.10一、10二、103分別對應網站一、二、3,過程以下:
利用前面講解的網絡配置方法配置多IP,忘記的請返回查看「linux入門系列11--Centos7網絡服務管理」。
[root@apache ~]# nmtui
中間操做過程省略,爲主機配置三個IP地址,保存並退出
重啓網絡使其生效
[root@apache ~]# systemctl restart network [root@apache ~]# ip addr ...省略部份內容 2: eno16777736: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000 link/ether 00:0c:29:2e:3a:65 brd ff:ff:ff:ff:ff:ff inet 192.168.78.101/24 brd 192.168.78.255 scope global eno16777736 valid_lft forever preferred_lft forever inet 192.168.78.102/24 brd 192.168.78.255 scope global secondary eno16777736 valid_lft forever preferred_lft forever inet 192.168.78.103/24 brd 192.168.78.255 scope global secondary eno16777736 valid_lft forever preferred_lft forever inet6 fe80::20c:29ff:fe2e:3a65/64 scope link valid_lft forever preferred_lft forever [root@apache ~]#
確保經過ip addr命令能夠看到剛纔配置的IP,並能在虛擬機或宿主機上能ping通剛纔配置的每一個IP。
在系統根目錄下的website目錄下建立3個目錄,並分別建立不一樣的頁面文件。
[root@apache website]# mkdir -p /website/1 [root@apache website]# mkdir -p /website/2 [root@apache website]# mkdir -p /website/3 [root@apache website]# echo "192.168.78.101">/website/1/index.html [root@apache website]# echo "192.168.78.102">/website/2/index.html [root@apache website]# echo "192.168.78.103">/website/3/index.html
配置主配置文件/etc/httpd/conf/httpd.conf
[root@apache website]# vim /etc/httpd/conf/httpd.conf ...省略部份內容 <VirtualHost 192.168.78.101> DocumentRoot /website/1 ServerName website1 <Directory /website/1> AllowOverride None Require all granted </Directory> </VirtualHost> <VirtualHost 192.168.78.102> DocumentRoot /website/2 ServerName website2 <Directory /website/2> AllowOverride None Require all granted </Directory> </VirtualHost> <VirtualHost 192.168.78.103> DocumentRoot /website/3 ServerName website3 <Directory /website/3> AllowOverride None Require all granted </Directory> </VirtualHost> ...省略部份內容
添加以下配置,並保存退出
重啓httpd使其生效。
[root@apache website]# systemctl restart httpd
因爲是繼續上前文的環境下實驗,前文已經設置好了防火牆和SELinux,因此直接就能夠訪問了,若是你遇到不能訪問的狀況,請參考前文檢查相關設置。
注意:
(1)前邊已經把/website目錄添加了SELinux的上下文,所以無需把剛剛建立的子目錄/website/1等進行設置。
(2)前文實驗中直接經過ip能夠訪問/website/index.html文件,本文實驗並無刪除原來的配置,只是新加了虛擬主機相關配置,能夠看到,再次訪問192.168.78.101這個ip是指向新的虛擬主機網站,而非原來的網站。也就是會虛擬主機配置會覆蓋原來設置,優先級更高。
當服務器沒法爲每一個網站都分配一個獨立 IP 地址的時候,能夠嘗試讓 Apache 自動識別 用戶請求的域名,從而根據不一樣的域名請求來傳輸不一樣的內容。
基於域名的配置與基於IP的配置,方法基本一致,只是多了一個域名和IP的映射。
仍是繼續使用上一步的環境,把以前設置的多餘的IP刪除,只保留一個IP:192.168.78.101;同時將上一步3.1.3中配置的多個IP與網站的映射刪除。
假設三個域名分別對應三個網站,域名分別爲:test一、test二、test3.heimatengyun.com,分別對應以前的一、二、3三個網站。
能夠經過DNS解析服務進行配置,本處直接修改/etc/hosts文件,在該文件中指定IP與域名之間的映射關係。/etc/hosts是Linux系統中用於強制把某個主機域名解析到指定IP地址的配置文件。
[root@apache website]# vim /etc/hosts 192.168.78.101 test1.heimatengyun.com test2.heimatengyun.com test3.heimatengyun.com
在文件末尾添加以上內容保存並退出。
在虛擬機中確保能夠ping同以上各個域名。
[root@apache website]# ping -c 1 test1.heimatengyun.com PING test1.heimatengyun.com (192.168.78.101) 56(84) bytes of data. 64 bytes from test1.heimatengyun.com (192.168.78.101): icmp_seq=1 ttl=64 time=0.033 ms --- test1.heimatengyun.com ping statistics --- 1 packets transmitted, 1 received, 0% packet loss, time 0ms rtt min/avg/max/mdev = 0.033/0.033/0.033/0.000 ms [root@apache website]#
這樣等後續操做完成後就能夠在虛擬機內部經過域名進行訪問。
可是若是想讓宿主機也能進行訪問的話,須要在宿主機中也要添加IP與域名的映射。因爲個人宿主機爲win10,所以將以上IP與域名的映射內容添加到C:WindowsSystem32driversetchosts文件便可。而後在宿主機就能夠ping同前面的三個域名。
因爲是直接採用原來的三個網站,先修改下每一個網頁裏邊的內容,咱們採用重定向往原來頁面中追加對應的域名信息,方便後續驗證效果。
[root@apache website]# echo "test1.heimatengyun.com">>/website/1/index.html [root@apache website]# echo "test2.heimatengyun.com">>/website/2/index.html [root@apache website]# echo "test3.heimatengyun.com">>/website/3/index.html
修改Apache主配置文件,/etc/httpd/conf/httpd.conf
[root@apache website]# vim /etc/httpd/conf/httpd.conf ...省略部份內容 <VirtualHost 192.168.78.101> DocumentRoot /website/1 ServerName test1.heimatengyun.com <Directory /website/1> AllowOverride None Require all granted </Directory> </VirtualHost> <VirtualHost 192.168.78.101> DocumentRoot /website/2 ServerName test2.heimatengyun.com <Directory /website/2> AllowOverride None Require all granted </Directory> </VirtualHost> <VirtualHost 192.168.78.101> DocumentRoot /website/3 ServerName test3.heimatengyun.com <Directory /website/3> AllowOverride None Require all granted </Directory> </VirtualHost> ...省略部份內容
在配置文件中添加上述內容並保存退出。
注意:此處能夠對比以前的IP配置,配置參數都是基本同樣的,惟一的不一樣是以前每一個網站對應不一樣IP,如今是都寫同一個IP。能夠自行對比
修改完成後重啓Apache,使其生效。
[root@apache website]# systemctl restart httpd
注意:修改Apache配置後,須要重啓服務纔會生效。
在宿主機瀏覽器輸入對應的域名便可訪問對應的網站。
基於端口號的虛擬主機功能可讓用戶經過指定的端口號來訪問服務器上的網站資源。
相較於前二種方式,這種方式的配置要稍微複製一些,由於不只要考慮httpd服務程序的配置,還要考慮SELinux服務對新開的端口的監控和限制。
一般狀況下使用80、44三、8080等端口提供網站訪問服務,若是是其餘端口就須要注意SELinux的如今。
咱們繼續在上邊的環境下實驗,刪除上一步3.2.3在配置文件中的配置。假設81十一、822二、8333分別對應前面建立的一、二、3三個網站。
咱們繼續使用以前的三個網站,對網站內容進行修改
[root@apache website]# echo "8111">>/website/1/index.html [root@apache website]# echo "8222">>/website/2/index.html [root@apache website]# echo "8333">>/website/3/index.html
對/etc/httpd/conf/httpd.conf進行配置,使其支持多端口監聽
(1)在大概43行左右,添加端口監聽
[root@apache website]# vim /etc/httpd/conf/httpd.conf ...省略部份內容 Listen 8111 Listen 8222 Listen 8333 ...省略部份內容
繼續下邊的修改
(2)在大概120行左右,追加基於端口號的虛擬主機參數配置
<VirtualHost 192.168.78.101:8111> DocumentRoot /website/1 ServerName test1.heimatengyun.com <Directory /website/1> AllowOverride None Require all granted </Directory> </VirtualHost> <VirtualHost 192.168.78.101:8222> DocumentRoot /website/2 ServerName test2.heimatengyun.com <Directory /website/2> AllowOverride None Require all granted </Directory> </VirtualHost> <VirtualHost 192.168.78.101:8333> DocumentRoot /website/3 ServerName test3.heimatengyun.com <Directory /website/3> AllowOverride None Require all granted </Directory> </VirtualHost> ...省略部份內容
保存退出
與3.2.3相對,沒有太大變化,只是在IP後添加端口便可,幾種配置方法都大同小異。
重啓apache使其生效
[root@apache website]# systemctl restart httpd Job for httpd.service failed. See 'systemctl status httpd.service' and 'journalctl -xn' for details. [root@apache website]# journalctl -xn ...省略部份內容 ***** Plugin bind_ports (92.2 confidence) suggests If you want to allow /usr/sbin/httpd to bind to network port 8111 Then you need to modify the port type. Do # semanage port -a -t PORT_TYPE -p tcp 8111 ...省略部份內容
可是你會發現,重啓失敗。若是你查看日誌,會發現這樣的提示內容,別擔憂,這正是剛開始提到的SELinux在搞鬼。
查看目前默認的SELinux容許的與HTTP協議相關的端口
[root@apache website]# semanage port -l | grep http http_cache_port_t tcp 8080, 8118, 8123, 10001-10010 http_cache_port_t udp 3130 http_port_t tcp 80, 81, 443, 488, 8008, 8009, 8443, 9000 pegasus_http_port_t tcp 5988 pegasus_https_port_t tcp 5989 [root@apache website]#
因而咱們要把剛纔新加的三個端口添加進入
[root@apache website]# semanage port -a -t http_port_t -p tcp 8111 [root@apache website]# semanage port -a -t http_port_t -p tcp 8222 [root@apache website]# semanage port -a -t http_port_t -p tcp 8333
添加完成重啓apache
[root@apache website]# systemctl restart httpd
通過以上的操做在虛擬機內容經過瀏覽器進行訪問,能夠正常經過各個端口去訪問對應的網站。
可是若是在宿主機進行訪問,你會發現訪問不了。這無疑就是由於防火牆在搞鬼。
利於「linux入門系列10--firewalld防火牆管理」講解的知識,將這3個對應的端口放行便可。
[root@apache website]# firewall-cmd --zone=public --list-ports [root@apache website]# firewall-cmd --zone=public --add-port=8111/tcp success [root@apache website]# firewall-cmd --zone=public --add-port=8222/tcp success [root@apache website]# firewall-cmd --zone=public --add-port=8333/tcp
此時,再次在宿主機進行訪問,就能夠正常訪問了。
細心的你可能會發現,若是是按照上邊的步驟一路下來的話,你會發現如今實際上是3種方式都開啓的。分別經過不一樣的端口去訪問,能夠正常訪問到對應的不一樣網站。可是經過若是你經過ip或域名再去訪問的話,你會發現通通都指向前一篇文章中案例1指向的網頁。爲何會這樣呢?那是由於以前案例沒有顯式指定端口,默認的端口爲80。所以若是沒顯式指定端口,默認是去web的80端口的。
Apache能夠基於源主機名、源IP地址或源主機上的瀏覽器特徵等信息對網站上的資源進行訪問控制。簡單說就是能控制網站讓指定用戶才能看到。
主要是經過訪問控制指令實現,經常使用指令有:Allow、Deny、Order
Allow:容許某個主機訪問服務器上的網站資源
Deny:實現禁止訪問
Order: 定義Allow或Deny指令起做用的順序,其匹配原則是按照順序進行匹配,若匹配成功則執行後面的默認指令。
舉個例子:
Order Allow, Deny:表示先將源主機與容許規則進行匹配,若匹配成功則容許訪 問請求,反之則拒絕訪問請求。
假設咱們的需求是:讓前面部署的1網站只容許虛擬機內部進行訪問,禁止外部機器訪問。
[root@apache website]# vim /etc/httpd/conf/httpd.conf ...省略部份內容 <VirtualHost 192.168.78.101:8111> DocumentRoot /website/1 ServerName test1.heimatengyun.com <Directory /website/1> AllowOverride None Require all granted Order allow,deny Allow from 192.168.78.101 </Directory> </VirtualHost> ...省略部份內容
咱們只須要打開主配置文件,在添加Order allow,deny和Allow from 192.168.78.101便可實現。配置以後,重啓apache,發如今虛擬機裏能夠正常訪問,可是在宿主機已經不能訪問了此網站了(直接跳轉到測試頁面)。
除此以外還能夠經過瀏覽器特徵來限制指定瀏覽器進行訪問,再此就不進行演示了。
下一篇文章將演示Mysql數據的兄弟-MariaDB的安裝及基本用法。