Linux下nginx服務器安裝及負載均衡怎么配置

一、搭建測試環境

這里的測試環境為通過virtualbox 安裝的兩臺lubuntu 19.04 虛擬機,linux 系統安裝方法不作贅述。

為了保證兩臺 linux 虛擬機之間的相互訪問,虛擬機的網絡配置除了默認的 nat 方式外,還使用了 virtualbox 軟件提供的內部網絡(internal) 聯網方式。

此外,還需要將兩臺虛擬機中與“內部網絡”相關聯的網卡,綁定上 同一網段 的靜態 ip 地址,則兩臺主機形成局域網絡,相互之間可以直接訪問。

網絡配置

打開 virtualbox 軟件,分別進入兩臺虛擬機的設置界面,為其添加 連接方式為內部網絡 的網絡連接,截圖如下(兩臺虛擬機作同樣的配置):

Linux下nginx服務器安裝及負載均衡怎么配置

內部網絡

登錄進虛擬機系統,使用 ip addr 命令查看當前的網絡連接信息:

$?ip?addr ... 2:?enp0s3:?<broadcast>?mtu?1500?qdisc?fq_codel?state?up?group?default?qlen?1000 ?link/ether?08:00:27:38:65:a8?brd?ff:ff:ff:ff:ff:ff ?inet?10.0.2.15/24?brd?10.0.2.255?scope?global?dynamic?noprefixroute?enp0s3 ??valid_lft?86390sec?preferred_lft?86390sec ?inet6?fe80::9a49:54d3:2ea6:1b50/64?scope?link?noprefixroute ??valid_lft?forever?preferred_lft?forever 3:?enp0s8:?<broadcast>?mtu?1500?qdisc?fq_codel?state?up?group?default?qlen?1000 ?link/ether?08:00:27:0d:0b:de?brd?ff:ff:ff:ff:ff:ff ?inet6?fe80::2329:85bd:937e:c484/64?scope?link?noprefixroute ??valid_lft?forever?preferred_lft?forever</broadcast></broadcast>

可以看到,此時的 enp0s8 網卡還沒有綁定 ipv4 地址,需要為其手動指定靜態 ip。

需要 注意 的是,從 ubuntu 17.10 版本開始,一個新的名為 netplan 的工具被引入,原來的網絡配置文件?/etc/network/interfaces?不再生效。

所以為網卡設置靜態 ip 時需要修改 /etc/netplan/01-network-manager-all.yaml 配置文件,示例如下:

network: ?version:?2 ?renderer:?networkmanager ??ethernets: ??enp0s8: ???dhcp4:?no ???dhcp6:?no ???addresses:?[192.168.1.101/24] #???gateway4:?192.168.1.101 #???nameservers: #?????addresses:?[192.168.1.101,?8.8.8.8]

由于兩臺主機處于同一子網,網關和 dns 服務器未配置的情況下仍可以互相訪問。對應的配置項暫時先注釋掉(后續可以嘗試自行搭建 dns 服務器)。

編輯完成后運行?sudo netplan apply?命令,前面配置的靜態 ip 即可生效。

$?ip?addr ... 3:?enp0s8:?<broadcast>?mtu?1500?qdisc?fq_codel?state?up?group?default?qlen?1000 ??link/ether?08:00:27:0d:0b:de?brd?ff:ff:ff:ff:ff:ff ??inet?192.168.1.101/24?brd?192.168.1.255?scope?global?noprefixroute?enp0s8 ????valid_lft?forever?preferred_lft?forever ??inet6?fe80::a00:27ff:fe0d:bde/64?scope?link ????valid_lft?forever?preferred_lft?forever</broadcast>

登錄進另一臺虛擬機中,執行同樣的操作(注意配置文件中的 addresses 項改為 [192.168.1.102/24] )。兩臺虛擬機的網絡即配置完成。

此時有 linux 虛擬機 server1,ip 地址為 192.168.1.101;linux 虛擬機 server2,ip 地址為 192.168.1.102。兩臺主機可相互訪問。測試如下:

starky@server1:~$?ping?192.168.1.102?-c?2 ping?192.168.1.102?(192.168.1.102)?56(84)?bytes?of?data. 64?bytes?from?192.168.1.102:?icmp_seq=1?ttl=64?time=0.951?ms 64?bytes?from?192.168.1.102:?icmp_seq=2?ttl=64?time=0.330?ms ---?192.168.1.102?ping?statistics?--- 2?packets?transmitted,?2?received,?0%?packet?loss,?time?2ms rtt?min/avg/max/mdev?=?0.330/0.640/0.951/0.311?ms skitar@server2:~$?ping?192.168.1.101?-c?2 ping?192.168.1.101?(192.168.1.101)?56(84)?bytes?of?data. 64?bytes?from?192.168.1.101:?icmp_seq=1?ttl=64?time=0.223?ms 64?bytes?from?192.168.1.101:?icmp_seq=2?ttl=64?time=0.249?ms ---?192.168.1.101?ping?statistics?--- 2?packets?transmitted,?2?received,?0%?packet?loss,?time?29ms rtt?min/avg/max/mdev?=?0.223/0.236/0.249/0.013?ms

二、安裝 nginx 服務器

nginx 的安裝方式主要有兩種:

  • 預編譯的二進制程序。這是最簡單和最快速的安裝方式,各主流操作系統都可以通過包管理器(如 ubuntu 的 apt-get)安裝。此種方式會安裝幾乎所有的 官方 模塊或插件。

  • 從源代碼編譯安裝。這種方式相對于前者更加靈活,可以自行選擇需要安裝的模塊或第三方插件。

本示例并沒有特殊的需求,所以直接選擇第一種安裝方式。命令如下:

$?sudo?apt-get?update $?sudo?apt-get?install?nginx

安裝成功后,通過?systemctl status nginx?命令查看 nginx 服務的運行狀態:

$?systemctl?status?nginx ●?nginx.service?-?a?high?performance?web?server?and?a?reverse?proxy?server ??loaded:?loaded?(/lib/systemd/system/nginx.service;?enabled;?vendor?preset:?en ??active:?active?(running)?since?tue?2019-07-02?01:22:07?cst;?26s?ago ???docs:?man:nginx(8) ?main?pid:?3748?(nginx) ??tasks:?2?(limit:?1092) ??memory:?4.9m ??cgroup:?/system.slice/nginx.service ??????├─3748?nginx:?master?process?/usr/sbin/nginx?-g?daemon?on;?master_pro ??????└─3749?nginx:?worker?process

通過?curl -i 127.0.0.1?命令驗證 web 服務器是否可以正常訪問:

$?curl?-i?127.0.0.1 http/1.1?200?ok server:?nginx/1.15.9?(ubuntu) ...

三、負載均衡配置

負載均衡(load-balancing)即按照一定的規則將負載分攤到多個操作單元上執行,從而提高服務的可用性和響應速度。

簡單的示例圖如下:

Linux下nginx服務器安裝及負載均衡怎么配置

load-balancing

如某網站應用部署在多臺主機構成的服務器集群上,負載均衡服務器位于終端用戶和服務器集群之間,負責接收終端用戶的訪問流量,并根據一定的規則將用戶訪問 分發 給后端的服務器主機,從而提高在高并發狀態下的響應速度。

負載均衡服務器

nginx 可以通過 upstream 選項配置負載均衡。這里使用虛擬機 server1 作為負載均衡服務器。

修改 serve1 上默認站點的配置文件( sudo vim /etc/nginx/sites-available/default ),改為如下內容:

upstream?backend?{ ??server?192.168.1.102:8000; ??server?192.168.1.102; } server?{ ??listen?80;  ??location?/?{ ????proxy_pass?http://backend; ??} }

基于測試的目的,當前只有兩臺虛擬機。server1(192.168.1.101)已經作為負載均衡服務器,所以使用 server2(192.168.1.102)作為應用服務器。

這里借助 nginx 的虛擬主機功能,分別將 192.168.1.102 和 192.168.1.102:8000 “模擬”為兩臺不同的應用服務器。

應用服務器

修改 server2 上默認站點的配置文件( sudo vim /etc/nginx/sites-available/default ),改為如下內容:

server?{ ????listen?80;  ????root?/var/www/html;  ????index?index.html?index.htm?index.nginx-debian.html;  ????server_name?192.168.1.102;  ????location?/?{ ????????try_files?$uri?$uri/?=404; ????} }

在 /var/www/html 目錄下創建 index.html 文件,作為 default 站點的 index 頁面,內容如下:

 ?? ????<title>index?page?from?server1</title> ?? ?? ????<h1>this?is?server1,?address?192.168.1.102.</h1> ?? 

運行?sudo systemctl restart nginx?命令重啟 nginx 服務,此時訪問 即可獲取剛剛創建的 index.html 頁面:

$?curl?192.168.1.102  ?? ????<title>index?page?from?server1</title> ?? ?? ????<h1>this?is?server1,?address?192.168.1.102.</h1> ?? 

配置“另一臺主機”上的站點,在 server2 上創建?/etc/nginx/sites-available/server2?配置文件,內容如下:

server?{ ????listen?8000;  ????root?/var/www/html;  ????index?index2.html?index.htm?index.nginx-debian.html;  ????server_name?192.168.1.102;  ????location?/?{ ????????try_files?$uri?$uri/?=404; ????} }

注意監聽端口和 index 頁面的配置變化。在 /var/www/html 目錄下創建 index2.html 文件,作為 server2 站點的 index 頁面,內容如下:

 ?? ????<title>index?page?from?server2</title> ?? ?? ????<h1>this?is?server2,?address?192.168.1.102:8000.</h1> ?? 

ps:為了測試目的,default 站點和 server2 站點配置在同一個主機 server2 上,且頁面稍有不同。實際環境中通常將這兩個站點配置在不同的主機上,且內容一致。

運行?sudo ln -s /etc/nginx/sites-available/server2 /etc/nginx/sites-enabled/?命令啟用剛剛創建的 server2 站點。

重啟 nginx 服務,此時訪問 ?即可獲取剛剛創建的 index2.html 頁面:

$?curl?192.168.1.102:8000  ?? ????<title>index?page?from?server2</title> ?? ?? ????<h1>this?is?server2,?address?192.168.1.102:8000.</h1> ?? 

負載均衡測試

回到負載均衡服務器即虛擬機 server1 上,其配置文件中設置的 反向代理 url 為 ?。

由于未曾配置域名解析服務,無法將 urlhttp://backend 定位到正確的位置。

可以修改 server1 上的 /etc/hosts 文件,添加如下一條記錄:

127.0.0.1 backend

即可將該域名解析到本地 ip ,完成對負載均衡服務器的訪問。

重啟 nginx 服務,在 server1 上訪問 ,效果如下:

$?curl?http://backend  ?? ????<title>index?page?from?server1</title> ?? ?? ????<h1>this?is?server1,?address?192.168.1.102.</h1> ??  $?curl?http://backend  ?? ????<title>index?page?from?server2</title> ?? ?? ????<h1>this?is?server2,?address?192.168.1.102:8000.</h1> ??  $?curl?http://backend  ?? ????<title>index?page?from?server1</title> ?? ?? ????<h1>this?is?server1,?address?192.168.1.102.</h1> ??  $?curl?http://backend  ?? ????<title>index?page?from?server2</title> ?? ?? ????<h1>this?is?server2,?address?192.168.1.102:8000.</h1> ?? 

從輸出中可以看出,server1 對負載均衡服務器 的訪問,完成了對應用服務器 server2 上兩個 web 站點的 輪詢 ,起到負載均衡的作用。

四、負載均衡方法

nginx 開源版本提供四種負載均衡的實現方式,簡單介紹如下。

1. round robin

用戶請求 均勻 地分配給后端服務器集群(可以通過 weight 選項設置輪詢的 權重 ),這是 nginx 默認使用的負載均衡方式:

upstream?backend?{ ??server?backend1.example.com?weight=5; ??server?backend2.example.com; }

2. least connections

用戶請求會優先轉發給集群中當前活躍連接數最少的服務器。同樣支持 weight 選項。

upstream?backend?{ ??least_conn; ??server?backend1.example.com; ??server?backend2.example.com; }

3. ip hash

用戶請求會根據 客戶端 ip 地址 進行轉發。即該方式意圖保證某個特定的客戶端最終會訪問 同一個 服務器主機。

upstream?backend?{ ??ip_hash; ??server?backend1.example.com; ??server?backend2.example.com; }

4. generic hash

用戶請求會根據一個 自定義鍵值 確定最終轉發的目的地,該鍵值可以是字符串、變量或者組合(如源 ip 和端口號)。

upstream?backend?{ ??hash?$request_uri?consistent; ??server?backend1.example.com; ??server?backend2.example.com; }

權重

參考下面的示例配置:

upstream?backend?{ ??server?backend1.example.com?weight=5; ??server?backend2.example.com; ??server?192.0.0.1?backup; }

默認權重(weight)為 1 。 backup 服務器 只有在所有其他服務器全部宕機的情況下才會接收請求。

如上面的示例,每 6 個請求會有 5 個轉發給?backend1.example.com,1 個轉發給 backend2.example.com。只有當 backend1 和 backend2 全部宕機時,192.0.0.1 才會接收并處理請求。

? 版權聲明
THE END
喜歡就支持一下吧
點贊6 分享