在前面我們實現了基本的HTTP反向代理,從互聯網過來的請求已經可以分發到後端多臺網站服務器上,但不是所有的業務都是網絡類型的,此篇文章我們主要討論的是TCP 端口的負載均衡做法,昨天也有小夥伴提到了,在HTTP反向代理中,我們並沒有討論會話保持和健康檢查,我們將會在這篇文章結束後,專門寫一篇關於會話保持和檢查檢查的文章,來分析他們的做法。
我們正式開始此篇的重點,我們要實現的是用戶通過Nginx來訪問一個或多個端口,這種場景還是蠻多的,例如OpenStack的控制節點等無狀態的服務就需要一個統一的訪問入口,例如對外的API接口、MySQL服務器等,但凡是需要對外提供一個高可用端口的場景,都用的上。
TCP 負載均衡
目標: 通過Nginx來實現後端兩臺服務器的負載均衡,且以輪詢的方式將請求分發到不同的服務器上,此處我們就以SSH的22號端口來演示。
角色 | 機器名 | IP地址 |
Nginx | Host1 | 192.168.30.130 |
TCP 端口服務器 | Host2 | 192.168.30.131 |
TCP 端口服務器 | Host3 | 192.168.30.132 |
備用TCP 端口服務器 | Host4 | 192.168.30.133 |
新建一個port.conf的配置文件,我們將用這些文件來實現此實驗目標,但是我們要注意位置,配置文件不要新建到conf.d目錄中,因爲如下圖所示,這個位置是包含在HTTP這個塊中的,我們需要新建一個,例如port.conf.d的目錄,並在nginx主配置文件中,包括此目錄
查看不能放在conf.d的原因
包含port.conf.d目錄
vim /etc/nginx/nginx.conf
在此文件中的最後一行,添加如下所示的內容
include /etc/nginx/port.conf.d/*.conf;
新建配置文件
mkdir /etc/nginx/port.conf.d
vim /etc/nginx/port.conf.d/port.conf
將以下內容複製粘貼到配置文件中
stream {
upstream sshport {
server 192.168.30.131:22 weight=10;
server 192.168.30.132:22 weight=10;
server 192.168.30.133:22 backup;
}
server {
listen 2000;
proxy_pass sshport;
}
}
配置文件效果如下
開啓nginx服務器的TCP 2000端口防火牆
firewall-cmd --add-port=2000/tcp
firewall-cmd --add-port=2000/tcp --permanent
如果你的服務器開啓了selinux,可能會啓動失敗,由於selinux不在討論範圍內,你可以使用以下命令臨時關閉selinux
setenforce 0
重啓Nginx服務
systemctl restart nginx.service
查看偵聽
netstat -tunlp | grep 2000
高可用驗證
在ssh時,指定端口爲2000,我們可以看到,輸入密碼後,直接登錄了host2,也就是說代理成功
我們來測試一下,如果host2關機會怎麼樣,你可以在host2上執行以下命令關機
systemctl poweroff
再次登錄的時候報錯SSH,這是因爲host2已經關機,嘗試鏈接host3,發現指紋不對,可以執行rm -rf /root/.ssh/known_hosts刪除
此時我們可以看到,host2關機後,再次連接,就會有host3爲你提供服務
結合上一篇和本篇文章,我們已經可以簡單完成HTTP類型的網站和TCP 端口的高可用配置,下一篇我們重點來講一下在常規的負載均衡背後的技術,會話保持、健康檢查、場景的負載均衡策略都會在下一篇講到。