簡易nginx TCP反向代理設置


nginx從1.9.0開始支持TCP反向代理,之前只支持HTTP。這是我的系統示意圖:

為何需要?

為什么需要反向代理?主要是:

  1. 負載均衡
  2. 方便管控

比如我現在要更新后端服務器,如果不用負載均衡的話,在更新過程中,用戶會出現無法連接服務器的情況,而一旦用了負載均衡,用戶此時的連接請求將會分配到別的沒在更新的后端服務器去,盡可能地確保了服務的可用性;再考慮這么種情況,我有多個服務器后端,那么就需要打開多個不同的監聽端口,我需要在系統防火牆里做多個配置,如果它們與客戶端的連接使用了SSL/TLS,那么得給它們各自配置證書,現在用了反向代理的話這些都簡化了,服務器只需要打開一個對外監聽端口,證書也只需要給反向代理配置好即可,就是我說的方便管控,當然了,還能方便的管控流量,設置一些額外的訪問策略什么的。

那么反向代理的缺點是什么?我想如果后端多了起來,連接多了起來之后,對nginx來說是一個很大的挑戰,畢竟TCP和HTTP不一樣,TCP通常是“長連接”,要一直維持着的。到時候如果nginx撐不下去,就考慮用硬件負載均衡吧(不過聽說這玩意兒不便宜)。

安裝nginx

安裝nginx的舊方法當然是去官網下載tar包,解壓縮,configure,make……我在《HappyAA服務器部署筆記1》中有詳細描述,現在我們不妨改進一下——用yum安裝,這樣更省事。我用的CentOS7的默認yum容器貌似並沒有nginx,需要自己加裝一下,其實很簡單,改一下配置即可。在/etc/yum.repo.d底下創建文件nginx.repo,內容為:

[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/mainline/centos/$releasever/$basearch/
gpgcheck=0
enabled=1

然后:

#yum install nginx

nginx默認安裝在/usr/sbin/nginx,檢驗下是否我們需要的nginx版本:

#/usr/sbin/nginx -v

我安裝的是1.9.11,沒問題!再看看--with-stream和--with-stream_ssl_module這兩個參數是否存在:

#/usr/sbin/nginx -V

如果沒有看到這兩個參數,那就只好走老路來安裝nginx了。

允許開機自動運行:

#systemctl enable nginx

啟動:

#systemctl start nginx

對應着以前的service nginx start

查看nginx狀態:

#systemctl status nginx

對應着以前的service nginx status

發現了沒有,使用yum安裝管理起來也簡單了。

nginx配置

編輯/etc/nginx/nginx.conf

stream{
    upstream backend{                                          1)
        hash $remote_addr consistent;
        server 127.0.0.1:7397 max_fails=3 fail_timeout=10s;    2)
        server 127.0.0.1:7398 max_fails=3 fail_timeout=10s;
    }

    server{
        listen 1268 ssl;                                       3)
        ssl_certificate     /home/guogangj/certs/cert1268.pem; 4)
        ssl_certificate_key  /home/guogangj/certs/key1268.pem; 5)
        ssl_session_cache    shared:SSL:10m;                   6)
        ssl_session_timeout  10m;                              7)
        ssl_ciphers  HIGH:!aNULL:!MD5;                         8)
        ssl_prefer_server_ciphers  on;                         9)
        proxy_connect_timeout 20s;                             10)
        proxy_timeout 5m;                                      11)
        proxy_pass backend;                                    12)
    }
}

配置說明:

1) 設置一個叫“backend”的后端配置

2) 我有兩個后端服務器,其中之一監聽在7397端口,nginx嘗試連接之,(10秒鍾為判定失敗的時長,這個我暫時也不太明白)最多失敗3次,超過則不再重試

3) nginx監聽在1268端口,使用SSL安全連接

注意:有必要的話,調整firewalld或iptables來允許這個端口的外部訪問,對firewalld來說,可以添加這樣的策略

firewall-cmd --zone=public --add-port=1268/tcp --permanent
firewall-cmd --reload

查看一下firewalld的策略列表:

firewall-cmd --permanent --zone=public --list-all

4) 所使用的X.509證書文件(PEM格式),對證書不熟悉的請參考《那些證書相關的玩意兒》,對於使用TCP協議的服務器端,其實是可以用自簽的證書的,(如何生成自簽證書,剛提到的文章里也有說明)你客戶端“認”它就是了,反正我們的目的就是防范中間人攻擊,不像做網站,我們得讓瀏覽器“認”證書才行

5) 證書私鑰文件

6) 設置SSL Session Cache使用“shared”方式更有利於提高資源的利用率,“SSL”是給緩存起的名字,你可以改成別的(這個名字如何用我現在不太清楚),“10m”為緩存大小(1M的緩存大約可以存放4000個session)

7) SSL Session的失效時間,默認5分鍾,我設為10分鍾

8) 指定SSL加密算法,照寫即可(我一看數學就頭大,所以至今仍未明白RSA的數學原理)

9) 更偏向於使用服務器的加密算法(這個我不太明白什么意思)

10) 指定nginx連接后端服務器超時的時間,指定為20秒

11) 距離上一次成功訪問(連接或讀寫)后端服務器的時間超過了5分鍾就判定為超時,斷開此連接

12) 將TCP連接及數據收發轉向叫“backend”的后端(這句話很關鍵)

完成

好像沒啥好說的了,客戶端連接1268這個端口完事。哦,對了,改好配置了別忘記重啟下nginx:

#systemctl restart nginx

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM