linux入門系列18--Web服務之Apache服務2

来源:https://www.cnblogs.com/heimatengyun/archive/2020/03/25/12564268.html
-Advertisement-
Play Games

接上一篇文章,在瞭解Apache基本配置以及SELinux相關知識後,繼續演示Apache提供的虛擬主機功能以及訪問控制方式。 ...


接上一篇文章,在瞭解Apache基本配置以及SELinux相關知識後,繼續演示Apache提供的虛擬主機功能以及訪問控制方式。

如果還沒看上一篇的建議先查看後再來,上篇文章“linux入門系列18--web服務之apache服務1”。

三、Apache虛擬主機功能

如果早期你部署過網站,相信一定知道虛擬機主機、VPS等概念,尤其是2000年前後建站非常流行,甚至誕生了很多成功的草根站長,其中有一部分網站到現在仍然做的非常成功。

網站流量的增加是一個長期累積的過程,如果每台伺服器上只能運行一個網站,那些人氣低、流量小的草根站長就要被迫承擔著高昂的伺服器租賃費用,這顯然也會造成硬體資源的浪費。

為此在虛擬專用伺服器(VPS:Virtual Private Server)和雲計算技術誕生以前,IDC服務供應商為了更充分利用伺服器資源和減低草根站長的購買門檻,都啟用了虛擬主機功能。利用虛擬主機功能,可以把一臺處於運行狀態的物理伺服器分割成多個“虛擬的伺服器”。

虛擬主機功能也有明顯的缺點,它無法像目前的雲主機技術那樣實現硬體資源的隔離,這些虛擬主機共同使用物理伺服器的硬體資源,IDC供應商只能限制硬碟的使用空間大小,因此同一臺物理主機上的不同用戶的虛擬主機可能會相互影響。但是出於成本考慮,目前還是有部分個人站長採用虛擬主機的方式來部署網站。

其示意圖如下:

在這裡插入圖片描述
Apache的虛擬主機功能是伺服器基於用戶請求的不同IP地址、主機功能變數名稱或埠號,實現提供多個網站同時為外部提供訪問服務的技術。

3.1 基於IP

如果一臺伺服器有多個IP地址,每個IP與伺服器上部署的每個網站一一對應, 這樣當用戶請求訪問不同的IP地址時,會訪問到不同網站的頁面資源。

這種方式每個網站都有一個獨立的IP地址,利於搜索引擎SEO優化,因此這種方式提供虛擬網站主機功能最常見且受草根站長的歡迎。

本示例IP的網站對應關係為:192.168.78.101、102、103分別對應網站1、2、3,過程如下:

3.1.1 配置多個IP

利用前面講解的網路配置方法配置多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。

在這裡插入圖片描述

3.1.2 準備多個網站

在系統根目錄下的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
3.1.3 配置Apache

配置主配置文件/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
3.2.4 測試訪問

由於是繼續上前文的環境下實驗,前文已經設置好了防火牆和SELinux,所以直接就可以訪問了,如果你遇到不能訪問的情況,請參考前文檢查相關設置。

在這裡插入圖片描述

註意:

(1)前邊已經把/website目錄添加了SELinux的上下文,因此無需把剛剛創建的子目錄/website/1等進行設置。

(2)前文實驗中直接通過ip可以訪問/website/index.html文件,本文實驗並沒有刪除原來的配置,只是新加了虛擬主機相關配置,可以看到,再次訪問192.168.78.101這個ip是指向新的虛擬主機網站,而非原來的網站。也就是會虛擬主機配置會覆蓋原來設置,優先順序更高。

3.2 基於功能變數名稱

當伺服器無法為每個網站都分配一個獨立 IP 地址的時候,可以嘗試讓 Apache 自動識別 用戶請求的功能變數名稱,從而根據不同的功能變數名稱請求來傳輸不同的內容。

基於功能變數名稱的配置與基於IP的配置,方法基本一致,只是多了一個功能變數名稱和IP的映射。

3.2.0 環境準備

還是繼續使用上一步的環境,把之前設置的多餘的IP刪除,只保留一個IP:192.168.78.101;同時將上一步3.1.3中配置的多個IP與網站的映射刪除。

假設三個功能變數名稱分別對應三個網站,功能變數名稱分別為:test1、test2、test3.heimatengyun.com,分別對應之前的1、2、3三個網站。

3.2.1 配置功能變數名稱與IP映射

可以通過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:\Windows\System32\drivers\etc\hosts文件即可。然後在宿主機就可以ping同前面的三個功能變數名稱。

3.2.2 準備多個網站

由於是直接採用原來的三個網站,先修改下每個網頁裡邊的內容,我們採用重定嚮往原來頁面中追加對應的功能變數名稱信息,方便後續驗證效果。

[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
3.2.3 配置Apache

修改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配置後,需要重啟服務才會生效。

3.2.4 測試訪問

在宿主機瀏覽器輸入對應的功能變數名稱即可訪問對應的網站。

在這裡插入圖片描述

3.3 基於埠號

基於埠號的虛擬主機功能可以讓用戶通過指定的埠號來訪問伺服器上的網站資源。

相較於前二種方式,這種方式的配置要稍微複製一些,因為不僅要考慮httpd服務程式的配置,還要考慮SELinux服務對新開的埠的監控和限制。

通常情況下使用80、443、8080等埠提供網站訪問服務,如果是其他埠就需要註意SELinux的現在。

3.3.0 環境準備

我們繼續在上邊的環境下實驗,刪除上一步3.2.3在配置文件中的配置。假設8111、8222、8333分別對應前面創建的1、2、3三個網站。

3.3.1 網站內準備

我們繼續使用之前的三個網站,對網站內容進行修改

[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
3.3.2 Apache配置

對/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在搞鬼。

3.3.3 設置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
3.3.4 測試訪問

經過以上的操作在虛擬機內容通過瀏覽器進行訪問,可以正常通過各個埠去訪問對應的網站。

但是如果在宿主機進行訪問,你會發現訪問不了。這無疑就是因為防火牆在搞鬼。

利於“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訪問控制

Apache可以基於源主機名、源IP地址或源主機上的瀏覽器特征等信息對網站上的資源進行訪問控制。簡單說就是能控制網站讓指定用戶才能看到。

主要是通過訪問控制指令實現,常用指令有:Allow、Deny、Order

Allow:允許某個主機訪問伺服器上的網站資源

Deny:實現禁止訪問

Order: 定義Allow或Deny指令起作用的順序,其匹配原則是按照順序進行匹配,若匹配成功則執行後面的預設指令。

舉個例子:

Order Allow, Deny:表示先將源主機與允許規則進行匹配,若匹配成功則允許訪 問請求,反之則拒絕訪問請求。

4.1 通過IP控制

假設我們的需求是:讓前面部署的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的安裝及基本用法。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 寫在前面 對於iet論文,如果實在不想調整word的模板以及安裝$LaTeX$軟體 請直接到https://www.overleaf.com/網站的 "Template for IET Research Journals" iet的模板latex 最近用IET的期刊模板寫論文IET_Research ...
  • 剛裝好的Linux系統出現所有home目錄下的文件全部出現到桌面,對於處女座的人來說,實在是彆扭至極,因此果斷調整。 重啟關機命令點擊此處 原桌面 #1.用vim編輯器打開文件,或者用gedit、nano打開都可以,這裡以vim為例 sudo vim ~/home/velma(用戶名)/.confi ...
  • while迴圈用於不斷執行一系列命令,也用於從輸入文件中讀取數據。命令執行完畢,控制返回迴圈頂部,從頭開始直至測試條件為假。 [toc] 語法格式 無限迴圈的實現 寫法一 寫法二 while讀取鍵盤信息 下麵這段代碼可以接收一行鍵盤的輸入,然後把輸入的內容覆述在屏幕上,就像復讀機一樣。當然,我沒給它 ...
  • 實例 這個命令比較厲害。。 nohup 加在一個命令的最前面,表示不掛斷的運行命令 & 載入一個命令的最後面,表示這個命令放在後臺執行 查看後臺運行的命令 有兩個命令可以來查看,ps 和 jobs。區別在於 jobs 只能查看當前終端後臺執行的任務,換了終端就看不見了。而ps命令適用於查看瞬時進程的 ...
  • 1. touch + qwe.txt(文件名 ) 創建文件akk.txt文件 2.vi akk.txt vi為進入vim編輯器命令,意為在vim編輯器中編輯qwe.txt文件 3.i i意為insert為輸入模式,輸入i之後你就可以開始編輯這個txt文件了 4.esc 退出編輯模式 5. :wq 保 ...
  • 目錄導航 1、啟用網路發現和密碼訪問共用 2、設置用於訪問共用文件夾的用戶和密碼 3、創建共用文件夾並設置訪問許可權 4、訪問共用的文件夾 1、啟用網路發現和密碼訪問共用 返回目錄導航 1.1 使用組合鍵“Win+R”打開運行視窗,輸入“control”打開控制面板 1.2 在控制面板中,點擊“查看網 ...
  • 一 Kubernetes網路策略 1.1 策略說明 為實現細粒度的容器間網路訪問隔離策略,Kubernetes發佈Network Policy,目前已升級為networking.k8s.io/v1穩定版本。 Network Policy的主要功能是對Pod間的網路通信進行限制和準入控制,設置方式為將 ...
  • 查找一個關鍵詞: grep -o objStr filename|wc -l 查找多個關鍵字 將關鍵詞用‘|’ 分隔grep -o ‘objStr1|objStr2' filename|wc -l ...
一周排行
    -Advertisement-
    Play Games
  • 概述:在C#中,++i和i++都是自增運算符,其中++i先增加值再返回,而i++先返回值再增加。應用場景根據需求選擇,首碼適合先增後用,尾碼適合先用後增。詳細示例提供清晰的代碼演示這兩者的操作時機和實際應用。 在C#中,++i 和 i++ 都是自增運算符,但它們在操作上有細微的差異,主要體現在操作的 ...
  • 上次發佈了:Taurus.MVC 性能壓力測試(ap 壓測 和 linux 下wrk 壓測):.NET Core 版本,今天計劃準備壓測一下 .NET 版本,來測試並記錄一下 Taurus.MVC 框架在 .NET 版本的性能,以便後續持續優化改進。 為了方便對比,本文章的電腦環境和測試思路,儘量和... ...
  • .NET WebAPI作為一種構建RESTful服務的強大工具,為開發者提供了便捷的方式來定義、處理HTTP請求並返迴響應。在設計API介面時,正確地接收和解析客戶端發送的數據至關重要。.NET WebAPI提供了一系列特性,如[FromRoute]、[FromQuery]和[FromBody],用 ...
  • 原因:我之所以想做這個項目,是因為在之前查找關於C#/WPF相關資料時,我發現講解圖像濾鏡的資源非常稀缺。此外,我註意到許多現有的開源庫主要基於CPU進行圖像渲染。這種方式在處理大量圖像時,會導致CPU的渲染負擔過重。因此,我將在下文中介紹如何通過GPU渲染來有效實現圖像的各種濾鏡效果。 生成的效果 ...
  • 引言 上一章我們介紹了在xUnit單元測試中用xUnit.DependencyInject來使用依賴註入,上一章我們的Sample.Repository倉儲層有一個批量註入的介面沒有做單元測試,今天用這個示例來演示一下如何用Bogus創建模擬數據 ,和 EFCore 的種子數據生成 Bogus 的優 ...
  • 一、前言 在自己的項目中,涉及到實時心率曲線的繪製,項目上的曲線繪製,一般很難找到能直接用的第三方庫,而且有些還是定製化的功能,所以還是自己繪製比較方便。很多人一聽到自己畫就害怕,感覺很難,今天就分享一個完整的實時心率數據繪製心率曲線圖的例子;之前的博客也分享給DrawingVisual繪製曲線的方 ...
  • 如果你在自定義的 Main 方法中直接使用 App 類並啟動應用程式,但發現 App.xaml 中定義的資源沒有被正確載入,那麼問題可能在於如何正確配置 App.xaml 與你的 App 類的交互。 確保 App.xaml 文件中的 x:Class 屬性正確指向你的 App 類。這樣,當你創建 Ap ...
  • 一:背景 1. 講故事 上個月有個朋友在微信上找到我,說他們的軟體在客戶那邊隔幾天就要崩潰一次,一直都沒有找到原因,讓我幫忙看下怎麼回事,確實工控類的軟體環境複雜難搞,朋友手上有一個崩潰的dump,剛好丟給我來分析一下。 二:WinDbg分析 1. 程式為什麼會崩潰 windbg 有一個厲害之處在於 ...
  • 前言 .NET生態中有許多依賴註入容器。在大多數情況下,微軟提供的內置容器在易用性和性能方面都非常優秀。外加ASP.NET Core預設使用內置容器,使用很方便。 但是筆者在使用中一直有一個頭疼的問題:服務工廠無法提供請求的服務類型相關的信息。這在一般情況下並沒有影響,但是內置容器支持註冊開放泛型服 ...
  • 一、前言 在項目開發過程中,DataGrid是經常使用到的一個數據展示控制項,而通常表格的最後一列是作為操作列存在,比如會有編輯、刪除等功能按鈕。但WPF的原始DataGrid中,預設只支持固定左側列,這跟大家習慣性操作列放最後不符,今天就來介紹一種簡單的方式實現固定右側列。(這裡的實現方式參考的大佬 ...