天天看點

使用LXD搭建Web網站

歡迎大家前往騰訊雲+社群,擷取更多騰訊海量技術實踐幹貨哦~

本文由獨木橋先生 發表于雲+社群專欄

Linux的容器是Linux的一組程序,通過使用Linux核心功能與系統隔離。它是一個類似于虛拟機的構造,但它的更輕量級。您可以在同一台伺服器上輕松建立多個容器。使用Linux容器,您可以在同一伺服器上運作多個執行個體,或者将應用程式及其依賴項捆綁到容器中,而不會影響系統的其餘部分。

假設您有一台伺服器,并且已為您的客戶設定了多項服務,按照Web應用來說,每個Web站點都是Apache或NginxWeb伺服器的同一執行個體的虛拟主機。但是對于Linux容器,每個網站都在其自己的容器中配置,并具有自己的Web伺服器。我們可以使用LXD來建立和管理這些容器。LXD提供管生命周期的容器管理。

在本教程中,您将使用LXD在同一伺服器上安裝兩個基于Nginx的網站,每個網站都限制在自己的容器中。然後,您将在第三個容器中安裝HAProxy,該容器将充當反向代理。然後,您将網站路由到HAProxy容器,以便從Internet通路這兩個網站。

要完成本教程,您需要以下内容:

一台已經設定好可以使用<code>sudo</code>指令的非root賬号的Ubuntu伺服器,并且已開啟防火牆。沒有伺服器的同學可以在這裡購買,不過我個人更推薦您使用免費的騰訊雲開發者實驗室進行試驗,學會安裝後在購買伺服器。

兩個域名,如果你沒有域名,建議您先去這裡注冊一個域名,您需要将域名解析到您的伺服器,您可以使用騰訊雲雲解析進行快速設定。

20GB以上存儲空間,建議您使用騰訊雲的雲硬碟進行擴容。

使用非root使用者帳戶登入伺服器。我們将使用此帳戶執行所有容器管理任務。為此,您必須先将此使用者添加到lxd組。使用以下指令執行此操作:

登出伺服器并重新登入,以便使用新的組成員身份更新新的SSH會話。登入後,您可以開始配置LXD。

需要先配置LXD才能使用,最重要的配置取決于存儲容器的後端類型。LXD的推薦存儲後端是ZFS檔案系統,請安裝<code>zfsutils-linux</code>包:

安裝完成後,您就可以初始化LXD了。在初始化期間,系統将提示您指定ZFS存儲後端。接下來有兩個部分,具體取決于您是要使用預配置設定檔案還是塊存儲。按照适合您情況的步驟進行操作。指定存儲機制後,您将為容器配置網絡選項。

請按照以下步驟配置LXD以使用預配置設定的檔案來存儲容器。首先,執行以下指令以啟動LXD初始化:

系統将提示您提供資訊,如以下輸出所示。我們将選擇預設值,包括預配置設定檔案的建議大小。

建議的大小将根據伺服器的可用磁盤空間自動計算。配置裝置後,您将配置網絡設定。

初始化過程将為我們提供一個GUI,如下圖所示,讓我們為容器配置網絡橋接,以便它們可以擷取私有IP位址,互相通信以及通路網絡。

使用LXD搭建Web網站

使用每個選項的預設值,但當被問及IPv6網絡時,請選擇否,因為國内環境暫時不允許。

完成網絡配置後,您就可以建立容器了。

我們已成功配置LXD。我們指定了存儲後端的位置,并為任何新建立的容器配置了預設網絡。我們将準備建立和管理一些容器,我們将使用lxc指令。

讓我們嘗試我們的第一個指令,它列出了可用的已安裝容器:

您将看到以下輸出:

由于這是<code>lxc</code>指令第一次與LXD管理程式通信,是以輸出讓我們知道該指令會自動建立用戶端證書與LXD進行安全通信。然後,它顯示了有關如何啟動容器的一些資訊。最後,該指令顯示了一個空的容器清單,這很正常,我們尚未建立任何容器。

讓我們來建立三個容器。我們将建立兩個web容器,并為反向代理建立第三個容器。反向代理的目的是将來自網絡的傳入連接配接定向到容器中的正确Web伺服器。

我們将使用<code>lxc launch</code>指令建立并啟動名為web1的Ubuntu 16.04(<code>ubuntu:x</code>)容器。<code>ubuntu:x</code>是預先配置的LXD鏡像存儲庫的辨別符

注意:您可以通過運作<code>lxc image list images:</code>來運作鏡像, <code>lxc image list ubuntu:</code>指令找到所有可用Ubuntu映像的完整清單。

執行以下指令以建立容器:

因為這是我們第一次建立容器,是以第一個指令從網絡下載下傳容器映像。接下來的兩個容器建立速度要快得多。

在這裡,您可以看到建立容器<code>web1</code>的示例輸出結果。

現在我們已經建立了三個空的vanilla容器,讓我們使用<code>lxc list</code>指令來顯示有關它們的資訊:

輸出結果顯示為一個表,其中包含每個容器的名稱,其目前狀态,IP位址,類型以及是否存在快照。

記下容器名稱及其對應的IPv4位址。您需要它們來配置您的服務。

讓我們連接配接到<code>web1</code>容器并配置第一個Web伺服器。

要進行連接配接,我們使用 <code>lxc exec</code>指令,該指令需要容器的名稱和要執行的指令。執行以下指令以連接配接到容器:

<code>--</code>字元串表示該指令參數<code>lxc</code>應該停在那裡,如在容器内将要執行的指令的行的其餘部分将被傳遞。該指令是<code>sudo --login --user ubuntu</code>,它為容器内的預配置帳戶ubuntu提供登入shell 。

注意:如果需要以root身份連接配接到容器,則可以使用<code>lxc exec web1 --/bin/bash</code>指令。

進入容器後,我們的shell提示現在如下所示。

容器中的這個ubuntu使用者具有<code>sudo</code>通路權限,并且可以在不提供密碼的情況下運作<code>sudo</code>指令。這個shell限制在容器的範圍内。我們在此shell中運作的任何内容都保留在容器中,無法轉義到主機伺服器。

讓我們更新容器内Ubuntu執行個體的包清單并安裝Nginx:

讓我們編輯此站點的預設網頁,并添加一些文本,清楚地表明該站點是在web1容器中托管的。打開檔案<code>/var/www/html/index.nginx-debian.html</code>:

對檔案進行以下更改:

我們在兩個地方編輯了檔案,并在on LXD container web1上專門添加了文本。儲存檔案并退出編輯器。

現在登出容器并傳回主機伺服器:

對<code>web2</code>容器重複此步驟。登入,安裝Nginx,然後編輯檔案<code>/var/www/html/index.nginx-debian.html</code>以及使用<code>web2</code>。然後退出<code>web2</code>容器。

讓我們使用<code>curl</code>來測試容器中的Web伺服器是否正常工作。我們需要先前顯示的Web容器的IP位址。

輸出結果應該是:

同樣測試第二個容器,使用<code>curl</code>指令及其IP位址驗證它是否也正确設定。配置好兩個容器後,我們可以繼續設定HAProxy。

我們将使用HAProxy設定這些容器的代理。根據我們使用的域名将流量引導至每個容器。我們将在後面的配置示例中使用<code>example.com</code>。我們将在主機名<code>example.com</code>和<code>www.example.com</code>上提供第一個網站。第二個網站使用<code>www2.example.com</code>。或用您自己的域名代替這些域名。

登入<code>haproxy</code>容器:

更新安裝包清單并安裝HAProxy:

安裝完成後,我們需要配置HAProxy。HAProxy的配置檔案位于<code>/etc/haproxy/haproxy.cfg</code>中。使用您喜歡的文本編輯器打開檔案。

首先,我們将對<code>defaults</code>部分進行一些修改。我們将添加<code>forwardfor</code>選項,以便保留Web用戶端的真實源IP,并且我們将添加<code>http-server-close</code>選項,進而實作會話重用和更低的延遲。

接下來,我們将配置前端指向我們的兩個後端容器。添加一個新的<code>frontend</code>部分名為<code>www_frontend</code>,如下所示:

使用<code>acl</code>指令與Web伺服器的主機名比對,并将請求重定向到相應的<code>backend</code>部分。

然後我們定義兩個新的<code>backend</code>部分,每個部分分别用于每個Web伺服器,分别命名它們為<code>web1_cluster</code>和<code>web2_cluster</code>。将以下代碼添加到檔案中以定義backend:

<code>balance</code>選項表示負載均衡政策。在這種情況下,我們選擇最少數量的連接配接。<code>http-request</code>選項使用真實Web用戶端IP設定HTTP标頭。如果我們沒有設定此标頭,則Web伺服器會将HAProxy IP位址記錄為所有連接配接的源IP,進而使分析流量來源的位置。<code>server</code>選項指定server(<code>web1</code>)的任意名稱,并跟着伺服器的主機名和端口。

LXD為容器提供DNS伺服器,是以 <code>web1.lxd</code>解析為與<code>web1</code>容器關聯的IP。其他容器有自己的主機名,例如 <code>web2.lxd</code>和<code>haproxy.lxd</code>。

<code>check</code>參數告訴HAPRoxy在Web伺服器上執行運作狀況。要測試配置是否有效,請運作以下指令:

輸出結果應該是

讓我們重新加載HAProxy,以便它讀取新配置。

現在登出容器以便傳回主機。

我們已将HAProxy配置為充當反向代理,将其在<code>80</code>端口上接收的任何連接配接轉發到其他兩個容器中的相應Web伺服器。讓我們測試<code>haproxy</code>将請求轉發到正确的Web容器。請執行以下指令:

這會向HAProxy送出請求并設定HTTP <code>host</code>标頭,HAProxy應使用該标頭将連接配接重定向到相應的Web伺服器。

HAProxy正确轉發請求并将其轉發給web2容器。Web伺服器提供了我們之前編輯的預設索引頁面。現在讓我們将外部請求路由到HAProxy,可以讓全世界通路我們的網站。

最後一個難題是将反向代理連接配接到網絡。我們需要設定我們的伺服器以将它從<code>80</code>端口上的網絡接收的任何連接配接轉發到<code>haproxy</code>容器中。

HAProxy安裝在容器中,無法從Internet通路。為了解決這個問題,我們将建立一個<code>iptables</code>轉發連接配接的規則。

iptables指令需要兩個IP位址:伺服器的公共IP位址(<code>your_server_ip</code>)和haproxy容器的私有IP位址(<code>your_haproxy_ip</code>),您可以使用<code>lxc list</code>指令擷取該位址。

執行此指令以建立規則:

這是指令分解的方式:

<code>-t nat</code>指定我們正在使用該nat表。

<code>-I PREROUTING</code> 指定我們将規則添加到PREROUTING鍊。

<code>-i eth0</code>指定接口eth0,它是Droplets上的預設公共接口。

<code>-p TCP</code>表明我們正在使用TCP協定。

<code>-d your_server_ip/32</code> 指定規則的目标IP位址。

<code>--dport 80</code>:指定目标端口。

<code>-j DNAT</code> 表明我們想要跳轉到目标NAT(DNAT)。

<code>--to-destination your_haproxy_ip:80</code>表明我們希望請求使用HAProxy轉到容器的IP位址。

最後,要儲存<code>iptables</code>指令以便在重新啟動後重新應用它,我們将安裝<code>iptables-persistent</code>軟體包:

安裝軟體包時,系統将提示您儲存所有目前<code>iptables</code>規則。如果您已設定了兩個FQDN,那麼您應該能夠使用Web浏覽器連接配接到每個網站。

要測試兩個Web伺服器是否實際可以從Internet通路,請使用以下curl指令從本地計算機通路每個Web伺服器:

這些指令使HTTP連接配接到伺服器的公共IP位址,并添加一個HTTP頭字段,--header其中包含HAProxy将用于處理請求的選項。

這是第一個curl指令的輸出結果:

這是第二個<code>curl</code>指令的輸出結果:

在這兩種情況下,都會顯示正确的網站。

您已經設定了兩個網站,每個網站都在自己的容器中,并使用HAProxy重定向流量。您可以複制此過程以配置更多網站,每個網站都限制在自己的容器中。

您還可以在新容器中添加MySQL,然後安裝像WordPress這樣的CMS來運作每個網站。您還可以使用此過程來支援舊版本的軟體。最後,LXD提供了對容器的完整狀态進行快照的功能,這使得以後可以輕松地建立備份和復原容器。此外,如果我們在兩個不同的伺服器上安裝LXD,則可以通過Internet連接配接它們并在伺服器之間遷移容器。更多Linux教程請前往騰訊雲+社群學習更多知識。

參考文獻:《How to Host Multiple Web Sites with Nginx and HAProxy Using LXD on Ubuntu 16.04》
如何使用Kubernetes? 安全報告 | 2018上半年網際網路惡意爬蟲分析:從全景視角看爬蟲與反爬蟲 安全報告 | SSH 暴力破解趨勢:從雲平台向物聯網裝置遷移 給你的CVM安裝一個面闆吧!

此文已由作者授權騰訊雲+社群釋出,原文連結:https://cloud.tencent.com/developer/article/1177656?fromSource=waitui

歡迎大家前往騰訊雲+社群或關注雲加社群微信公衆号(QcloudCommunity),第一時間擷取更多海量技術實踐幹貨哦~

海量技術實踐經驗,盡在雲加社群!

https://cloud.tencent.com/developer

繼續閱讀