nginx(engine x) 是一個 高性能 的 HTTP 和 反向代理 服務器、郵件代理服務器以及通用的 TCP/UDP 代理服務器。其特點為輕量級(占用系統(tǒng)資源少)、穩(wěn)定性好、可擴展性(模塊化結(jié)構(gòu))、并發(fā)能力強、配置簡單等。
本文主要介紹在測試環(huán)境中通過 nginx 實現(xiàn)基本的 負載均衡 功能。
nginx 可以提供 HTTP 服務,包括處理靜態(tài)文件,支持 SSL 和 TLS SNI、GZIP 網(wǎng)頁壓縮、虛擬主機、URL 重寫等功能,可以搭配 FastCGI、uwsgi 等程序處理動態(tài)請求。
此外,nginx 還可以用于代理、反向代理、負載均衡、緩存等服務器功能,在集群環(huán)境中改善網(wǎng)絡負載、提高可用性。
一、搭建測試環(huán)境
這里的測試環(huán)境為通過VirtualBox 安裝的兩臺Lubuntu 19.04 虛擬機,Linux 系統(tǒng)安裝方法不作贅述。
為了保證兩臺 Linux 虛擬機之間的相互訪問,虛擬機的網(wǎng)絡配置除了默認的 NAT 方式外,還使用了 VirtualBox 軟件提供的內(nèi)部網(wǎng)絡(Internal) 聯(lián)網(wǎng)方式。
此外,還需要將兩臺虛擬機中與“內(nèi)部網(wǎng)絡”相關聯(lián)的網(wǎng)卡,綁定上 同一網(wǎng)段 的靜態(tài) IP 地址,則兩臺主機形成局域網(wǎng)絡,相互之間可以直接訪問。
網(wǎng)絡配置
打開 VirtualBox 軟件,分別進入兩臺虛擬機的設置界面,為其添加 連接方式為內(nèi)部網(wǎng)絡 的網(wǎng)絡連接,截圖如下(兩臺虛擬機作同樣的配置):
內(nèi)部網(wǎng)絡
登錄進虛擬機系統(tǒng),使用 ip addr 命令查看當前的網(wǎng)絡連接信息:
$ ip addr ... 2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> 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,MULTICAST,UP,LOWER_UP> 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
可以看到,此時的 enp0s8 網(wǎng)卡還沒有綁定 IPv4 地址,需要為其手動指定靜態(tài) IP。
需要 注意 的是,從 Ubuntu 17.10 版本開始,一個新的名為 netplan 的工具被引入,原來的網(wǎng)絡配置文件 /etc/network/interfaces
不再生效。
所以為網(wǎng)卡設置靜態(tài) 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]
由于兩臺主機處于同一子網(wǎng),網(wǎng)關和 DNS 服務器未配置的情況下仍可以互相訪問。對應的配置項暫時先注釋掉(后續(xù)可以嘗試自行搭建 DNS 服務器)。
編輯完成后運行 sudo netplan apply
命令,前面配置的靜態(tài) IP 即可生效。
$ ip addr ... 3: enp0s8: <BROADCAST,MULTICAST,UP,LOWER_UP> 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
登錄進另一臺虛擬機中,執(zhí)行同樣的操作(注意配置文件中的 addresses 項改為 [192.168.1.102/24] )。兩臺虛擬機的網(wǎng)絡即配置完成。
此時有 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 的安裝方式主要有兩種:
本示例并沒有特殊的需求,所以直接選擇第一種安裝方式。命令如下:
$ sudo apt-get update $ sudo apt-get install nginx
安裝成功后,通過 systemctl status nginx
命令查看 nginx 服務的運行狀態(tài):
$ 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)即按照一定的規(guī)則將負載分攤到多個操作單元上執(zhí)行,從而提高服務的可用性和響應速度。
簡單的示例圖如下:
load-balancing
如某網(wǎng)站應用部署在多臺主機構(gòu)成的服務器集群上,負載均衡服務器位于終端用戶和服務器集群之間,負責接收終端用戶的訪問流量,并根據(jù)一定的規(guī)則將用戶訪問 分發(fā) 給后端的服務器主機,從而提高在高并發(fā)狀態(tài)下的響應速度。
負載均衡服務器
nginx 可以通過 upstream 選項配置負載均衡。這里使用虛擬機 server1 作為負載均衡服務器。
修改 serve1 上默認站點的配置文件( sudo vim /etc/nginx/sites-available/default ),改為如下內(nèi)容:
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)已經(jīng)作為負載均衡服務器,所以使用 server2(192.168.1.102)作為應用服務器。
這里借助 nginx 的虛擬主機功能,分別將 192.168.1.102 和 192.168.1.102:8000 “模擬”為兩臺不同的應用服務器。
應用服務器
修改 server2 上默認站點的配置文件( sudo vim /etc/nginx/sites-available/default ),改為如下內(nèi)容:
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 目錄下創(chuàng)建 index.html 文件,作為 default 站點的 index 頁面,內(nèi)容如下:
<html> <head> <title>Index Page From Server1</title> </head> <body> <h1>This is Server1, Address 192.168.1.102.</h1> </body> </html>
運行 sudo systemctl restart nginx
命令重啟 nginx 服務,此時訪問http://192.168.1.102 即可獲取剛剛創(chuàng)建的 index.html 頁面:
$ curl 192.168.1.102 <html> <head> <title>Index Page From Server1</title> </head> <body> <h1>This is Server1, Address 192.168.1.102.</h1> </body> </html>
配置“另一臺主機”上的站點,在 server2 上創(chuàng)建 /etc/nginx/sites-available/server2
配置文件,內(nèi)容如下:
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; } }
注意監(jiān)聽端口和 index 頁面的配置變化。在 /var/www/html 目錄下創(chuàng)建 index2.html 文件,作為 server2 站點的 index 頁面,內(nèi)容如下:
<html> <head> <title>Index Page From Server2</title> </head> <body> <h1>This is Server2, Address 192.168.1.102:8000.</h1> </body> </html>
PS:為了測試目的,default 站點和 server2 站點配置在同一個主機 server2 上,且頁面稍有不同。實際環(huán)境中通常將這兩個站點配置在不同的主機上,且內(nèi)容一致。
運行 sudo ln -s /etc/nginx/sites-available/server2 /etc/nginx/sites-enabled/
命令啟用剛剛創(chuàng)建的 server2 站點。
重啟 nginx 服務,此時訪問 http://192.168.1.102:8000 即可獲取剛剛創(chuàng)建的 index2.html 頁面:
$ curl 192.168.1.102:8000 <html> <head> <title>Index Page From Server2</title> </head> <body> <h1>This is Server2, Address 192.168.1.102:8000.</h1> </body> </html>
負載均衡測試
回到負載均衡服務器即虛擬機 server1 上,其配置文件中設置的 反向代理 URL 為 http://backend 。
由于未曾配置域名解析服務,無法將 URLhttp://backend 定位到正確的位置。
可以修改 server1 上的 /etc/hosts 文件,添加如下一條記錄:
127.0.0.1 backend
即可將該域名解析到本地 IP ,完成對負載均衡服務器的訪問。
重啟 nginx 服務,在 server1 上訪問http://backend ,效果如下:
$ curl http://backend <html> <head> <title>Index Page From Server1</title> </head> <body> <h1>This is Server1, Address 192.168.1.102.</h1> </body> </html> $ curl http://backend <html> <head> <title>Index Page From Server2</title> </head> <body> <h1>This is Server2, Address 192.168.1.102:8000.</h1> </body> </html> $ curl http://backend <html> <head> <title>Index Page From Server1</title> </head> <body> <h1>This is Server1, Address 192.168.1.102.</h1> </body> </html> $ curl http://backend <html> <head> <title>Index Page From Server2</title> </head> <body> <h1>This is Server2, Address 192.168.1.102:8000.</h1> </body> </html>
從輸出中可以看出,server1 對負載均衡服務器http://backend 的訪問,完成了對應用服務器 server2 上兩個 Web 站點的 輪詢 ,起到負載均衡的作用。
四、負載均衡方法
nginx 開源版本提供四種負載均衡的實現(xiàn)方式,簡單介紹如下。
1. Round Robin
用戶請求 均勻 地分配給后端服務器集群(可以通過 weight 選項設置輪詢的 權(quán)重 ),這是 nginx 默認使用的負載均衡方式:
upstream backend { server backend1.example.com weight=5; server backend2.example.com; }
2. Least Connections
用戶請求會優(yōu)先轉(zhuǎn)發(fā)給集群中當前活躍連接數(shù)最少的服務器。同樣支持 weight 選項。
upstream backend { least_conn; server backend1.example.com; server backend2.example.com; }
3. IP Hash
用戶請求會根據(jù) 客戶端 IP 地址 進行轉(zhuǎn)發(fā)。即該方式意圖保證某個特定的客戶端最終會訪問 同一個 服務器主機。
upstream backend { ip_hash; server backend1.example.com; server backend2.example.com; }
4. Generic Hash
用戶請求會根據(jù)一個 自定義鍵值 確定最終轉(zhuǎn)發(fā)的目的地,該鍵值可以是字符串、變量或者組合(如源 IP 和端口號)。
upstream backend { hash $request_uri consistent; server backend1.example.com; server backend2.example.com; }
權(quán)重
參考下面的示例配置:
upstream backend { server backend1.example.com weight=5; server backend2.example.com; server 192.0.0.1 backup; }
默認權(quán)重(weight)為 1 。 backup 服務器 只有在所有其他服務器全部宕機的情況下才會接收請求。
如上面的示例,每 6 個請求會有 5 個轉(zhuǎn)發(fā)給 backend1.example.com
,1 個轉(zhuǎn)發(fā)給 backend2.example.com。只有當 backend1 和 backend2 全部宕機時,192.0.0.1 才會接收并處理請求。
參考資料
HTTP Load Balancing
總結(jié)
以上所述是小編給大家介紹的Linux 系統(tǒng) nginx 服務器安裝及負載均衡配置詳解,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
如果你覺得本文對你有幫助,歡迎轉(zhuǎn)載,煩請注明出處,謝謝!