nginx從1.9.0開始支持TCP反向代理,以前只支持HTTP。這是個人系統示意圖:html
爲何須要反向代理?主要是:nginx
負載均衡算法
方便管控後端
好比我如今要更新後端服務器,若是不用負載均衡的話,在更新過程當中,用戶會出現沒法鏈接服務器的狀況,而一旦用了負載均衡,用戶此時的鏈接請求將會分配到別的沒在更新的後端服務器去,儘量地確保了服務的可用性;再考慮這麼種狀況,我有多個服務器後端,那麼就須要打開多個不一樣的監聽端口,我須要在系統防火牆裏作多個配置,若是它們與客戶端的鏈接使用了SSL/TLS,那麼得給它們各自配置證書,如今用了反向代理的話這些都簡化了,服務器只須要打開一個對外監聽端口,證書也只須要給反向代理配置好便可,就是我說的方便管控,固然了,還能方便的管控流量,設置一些額外的訪問策略什麼的。centos
那麼反向代理的缺點是什麼?我想若是後端多了起來,鏈接多了起來以後,對nginx來講是一個很大的挑戰,畢竟TCP和HTTP不同,TCP一般是「長鏈接」,要一直維持着的。到時候若是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這兩個參數是否存在:session
#/usr/sbin/nginx -V
若是沒有看到這兩個參數,那就只好走老路來安裝nginx了。
容許開機自動運行:
#systemctl enable nginx
啓動:
#systemctl start nginx
對應着之前的service nginx start
查看nginx狀態:
#systemctl status nginx
對應着之前的service nginx status
發現了沒有,使用yum安裝管理起來也簡單了。
編輯/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