nginx從1.9.0版本開始,新增了ngx_stream_core_module模塊,使nginx支持四層負載均衡。默認編譯的時候該模塊並未編譯進去,需要編譯的時候添加--with-stream,使其支持stream代理。
Nginx 基於tcp/udp代理
Nginx

nginx從1.9.0版本開始,新增了ngx_stream_core_module模塊,使nginx支持四層負載均衡。默認編譯的時候該模塊並未編譯進去,需要編譯的時候添加--with-stream,使其支持stream代理。
同時需要說明一點,nginx也可以代理tcp的正向代理和反向代理,我這里主要以反向代理為基礎,需要正向代理可以參考 Nginx 反向代理與正向代理
官方文檔stream模塊地址:
http://nginx.org/en/docs/stream/ngx_stream_core_module.html
因為手上沒有合適的環境,我這里設置nginx代理smtp。使用騰訊的smtp服務進行代理演示
Nginx搭建
1.nginx版本沒有太大要求,1.9以上即可 wget http://nginx.org/download/nginx-1.10.3.tar.gz #按照依賴包 yum install -y gcc glibc gcc-c++ prce-devel openssl-devel pcre-devel useradd -s /sbin/nologin nginx -M tar xf nginx-1.10.3.tar.gz && cd nginx-1.10.3 #編譯 ./configure --prefix=/usr/local/nginx-1.10.3 --user=nginx --group=nginx --with-http_ssl_module --with-http_stub_status_module --with-stream make && make install 檢查 /usr/local/nginx/sbin/nginx -t 啟動 /usr/local/nginx/sbin/nginx 查看服務器是否啟動 netstat -lntp|grep nginx tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 7058/nginx: master
配置Nginx
stream不可以配置在http標簽,需要和events同級,我這里就單獨寫一份配置文件,也方便后期維護管理
1.首先需要修改nginx.conf,添加include 引用server標簽 cat >/usr/local/nginx/conf/nginx.conf < 解釋一下什么是長連接 長連接多用於操作頻繁,點對點的通訊,而且連接數不能太多情況,。每個TCP連接都需要三步握手,這需要時間,如果每個操作都是先連接,再操作的話那么處理速度會降低很多,所以每個操作完后都不斷開,次處理時直接發送數據包就OK了,不用建立TCP連接。例如:數據庫的連接用長連接, 如果用短連接頻繁的通信會造成socket錯誤,而且頻繁的socket 創建也是對資源的浪費。 而像WEB網站的http服務一般都用短鏈接,因為長連接對於服務端來說會耗費一定的資源,而像WEB網站這么頻繁的成千上萬甚至上億客戶端的連接用短連接會更省一些資源,如果用長連接,而且同時有成千上萬的用戶,如果每個用戶都占用一個連接的話,那可想而知吧。所以並發量大,但每個用戶無需頻繁操作情況下需用短連好。 總之,長連接和短連接的選擇要視情況而定。 具體網絡中的應用的話:http 1.0一般就指短連接,smtp,pop3,telnet這種就可以認為是長連接。一般的網絡游戲應用都是長連接 添加配置文件 cat >/usr/local/nginx/conf/i4t.com < 溫馨提示:tcp代理不支持配置server_name 修改完配置文件后,我們nginx -t檢查一下語法是否有問題。順便我們啟動nginx $/usr/local/nginx/sbin/nginx -t nginx: the configuration file /usr/local/nginx-1.10.3/conf/nginx.conf syntax is ok nginx: configuration file /usr/local/nginx-1.10.3/conf/nginx.conf test is successful #啟動 /usr/local/nginx/sbin/nginx #服務器檢查 [root@abcdocker ~]# lsof -i:1998 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME nginx 24034 root 6u IPv4 34775578 0t0 TCP *:x25-svc-port (LISTEN) nginx 24035 nginx 6u IPv4 34775578 0t0 TCP *:x25-svc-port (LISTEN) [root@abcdocker ~]# ps -ef|grep nginx root 24034 1 0 08:22 ? 00:00:00 nginx: master process /usr/local/nginx/sbin/nginx nginx 24035 24034 0 08:22 ? 00:00:00 nginx: worker process root 26095 24232 0 08:33 pts/2 00:00:00 grep --color=auto nginx 訪問測試 telnet沒有問題~
1.首先需要修改nginx.conf,添加include 引用server標簽 cat >/usr/local/nginx/conf/nginx.conf < 解釋一下什么是長連接 長連接多用於操作頻繁,點對點的通訊,而且連接數不能太多情況,。每個TCP連接都需要三步握手,這需要時間,如果每個操作都是先連接,再操作的話那么處理速度會降低很多,所以每個操作完后都不斷開,次處理時直接發送數據包就OK了,不用建立TCP連接。例如:數據庫的連接用長連接, 如果用短連接頻繁的通信會造成socket錯誤,而且頻繁的socket 創建也是對資源的浪費。 而像WEB網站的http服務一般都用短鏈接,因為長連接對於服務端來說會耗費一定的資源,而像WEB網站這么頻繁的成千上萬甚至上億客戶端的連接用短連接會更省一些資源,如果用長連接,而且同時有成千上萬的用戶,如果每個用戶都占用一個連接的話,那可想而知吧。所以並發量大,但每個用戶無需頻繁操作情況下需用短連好。 總之,長連接和短連接的選擇要視情況而定。 具體網絡中的應用的話:http 1.0一般就指短連接,smtp,pop3,telnet這種就可以認為是長連接。一般的網絡游戲應用都是長連接 添加配置文件 cat >/usr/local/nginx/conf/i4t.com < 溫馨提示:tcp代理不支持配置server_name 修改完配置文件后,我們nginx -t檢查一下語法是否有問題。順便我們啟動nginx $/usr/local/nginx/sbin/nginx -t nginx: the configuration file /usr/local/nginx-1.10.3/conf/nginx.conf syntax is ok nginx: configuration file /usr/local/nginx-1.10.3/conf/nginx.conf test is successful #啟動 /usr/local/nginx/sbin/nginx #服務器檢查 [root@abcdocker ~]# lsof -i:1998 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME nginx 24034 root 6u IPv4 34775578 0t0 TCP *:x25-svc-port (LISTEN) nginx 24035 nginx 6u IPv4 34775578 0t0 TCP *:x25-svc-port (LISTEN) [root@abcdocker ~]# ps -ef|grep nginx root 24034 1 0 08:22 ? 00:00:00 nginx: master process /usr/local/nginx/sbin/nginx nginx 24035 24034 0 08:22 ? 00:00:00 nginx: worker process root 26095 24232 0 08:33 pts/2 00:00:00 grep --color=auto nginx 訪問測試 telnet沒有問題~
1.首先需要修改nginx.conf,添加include 引用server標簽 cat >/usr/local/nginx/conf/nginx.conf < 解釋一下什么是長連接 長連接多用於操作頻繁,點對點的通訊,而且連接數不能太多情況,。每個TCP連接都需要三步握手,這需要時間,如果每個操作都是先連接,再操作的話那么處理速度會降低很多,所以每個操作完后都不斷開,次處理時直接發送數據包就OK了,不用建立TCP連接。例如:數據庫的連接用長連接, 如果用短連接頻繁的通信會造成socket錯誤,而且頻繁的socket 創建也是對資源的浪費。 而像WEB網站的http服務一般都用短鏈接,因為長連接對於服務端來說會耗費一定的資源,而像WEB網站這么頻繁的成千上萬甚至上億客戶端的連接用短連接會更省一些資源,如果用長連接,而且同時有成千上萬的用戶,如果每個用戶都占用一個連接的話,那可想而知吧。所以並發量大,但每個用戶無需頻繁操作情況下需用短連好。 總之,長連接和短連接的選擇要視情況而定。 具體網絡中的應用的話:http 1.0一般就指短連接,smtp,pop3,telnet這種就可以認為是長連接。一般的網絡游戲應用都是長連接 添加配置文件 cat >/usr/local/nginx/conf/i4t.com < 溫馨提示:tcp代理不支持配置server_name 修改完配置文件后,我們nginx -t檢查一下語法是否有問題。順便我們啟動nginx $/usr/local/nginx/sbin/nginx -t nginx: the configuration file /usr/local/nginx-1.10.3/conf/nginx.conf syntax is ok nginx: configuration file /usr/local/nginx-1.10.3/conf/nginx.conf test is successful #啟動 /usr/local/nginx/sbin/nginx #服務器檢查 [root@abcdocker ~]# lsof -i:1998 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME nginx 24034 root 6u IPv4 34775578 0t0 TCP *:x25-svc-port (LISTEN) nginx 24035 nginx 6u IPv4 34775578 0t0 TCP *:x25-svc-port (LISTEN) [root@abcdocker ~]# ps -ef|grep nginx root 24034 1 0 08:22 ? 00:00:00 nginx: master process /usr/local/nginx/sbin/nginx nginx 24035 24034 0 08:22 ? 00:00:00 nginx: worker process root 26095 24232 0 08:33 pts/2 00:00:00 grep --color=auto nginx 訪問測試 telnet沒有問題~