日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

nginx tcp代理_nginx——TCP/UDP Load Balancing

發布時間:2024/2/28 编程问答 46 豆豆
生活随笔 收集整理的這篇文章主要介紹了 nginx tcp代理_nginx——TCP/UDP Load Balancing 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

nginx––– tcp and udp 代理

Introduction

nginx 反向代理一般都是7層代理,進行http/https 協議層的轉發;說起4層代理,一般想到的都是lvs 和 haproxy 這些;目前nginx新版本已經支持 4層 (tcp,udp) 代理;

在Nginx1.9.0版本之前,TCP代理一般會使用Haproxy或Nginx的第三方包nginx_tcp_proxy_module。但Nginx在1.9.0版本之后加入了ngx_stream_proxy_modulea,它提供了TCP代理,只需在編譯Nginx時加入––ngx_stream_proxy_module即可。

在1.9.13版本之后,Nginx加入了對UDP(UserDatagramProtocol)代理的支持,因此可以使用Nginx來代理DNS的UDP端口;

Install

[root@network-test nginx-1.19.2]# ./configure --help# --with-stream 開啟tcp/udp 代理;一般是初次安裝的時候使用;# --with-stream=dynamic 動態開啟tcp/udp;存量已安裝的nginx 下動態支持# 這次使用動態升級的方法,在原始參數后面添加 –with-stream=dynamic./configure --prefix=/usr/local/nginx --add-module=../ngx_devel_kit --add-module=../set-misc-nginx-module --with-stream=dynamic# make編譯 ,切記不要install,執行install 會有覆蓋的情況,可能會影響存量的業務或配置,需要注意make# 當前目錄objs中會存在 編譯好的 ngx_stream_module.soll objs/ngx_stream_module.so# 將對于文件cp 到 存量已安裝的目錄mkdir /usr/local/nginx/modulescp objs/ngx_stream_module.so /usr/local/nginx/modules/# 編輯 nginx.conf ; reload 或 重啟服務# load_module modules/ngx_stream_module.so;[root@network-test nginx]# head -n 30 conf/nginx.conf | grep -v '^$'load_module modules/ngx_stream_module.so;#user nobody;worker_processes 1;error_log logs/error.log;#error_log logs/error.log notice;#error_log logs/error.log info;#pid logs/nginx.pid;events { worker_connections 1024;}stream { upstream tcp_backed { hash $remote_addr consistent; server 127.0.0.1:9090 weight=4 max_fails=3 fail_timeout=30s; } server { listen 9999; proxy_connect_timeout 1s; proxy_timeout 3s; proxy_pass tcp_backed; }}

Configuring TCP OR UDP Load Balancing

TCP代理在stream指令塊內進行聲明,位于main內,和http指令塊同級。

反向代理的upstream支持DNS域名(如ip_hash、socket)配置、權重即故障轉移(如max_fails)配置。

當proxy_pass代理TCP時,沒有http://前綴,注意配置時不要寫錯。

支持和HTTP一樣的連接超時參數proxy_timeout、proxy_connect_timeout。

在實操這里時,需要提到一點是,一般4層代理是沒有轉發日志的;比如lvs ;nginx 這里使用tcp/udp 代理時是可以配置轉發日志的;

配置方法:

在nginx.conf stream 中配置對應log_farmart;

stream { log_format tcp_proxy '$remote_addr [$time_local] ' '$protocol $status $bytes_sent $bytes_received ' '$session_time "$upstream_addr" ' '"$upstream_bytes_sent" "$upstream_bytes_received" "$upstream_connect_time"'; access_log logs/tcp-access.log tcp_proxy ; open_log_file_cache off; #include /etc/nginx/conf.d/*.stream; upstream tcp_backed { hash $remote_addr consistent; server 127.0.0.1:9090 weight=4 max_fails=3 fail_timeout=30s; } # proxy_bind $remote_addr transparent; server { listen 9999; proxy_connect_timeout 1s; proxy_timeout 3s; proxy_pass tcp_backed; }}

配置經驗

  • 測試發現nginx會等待session結束才會記錄到日志文件;
  • session日志只是tcp層面的記錄,包括session時間,發送接收字節數等等;
  • session內部發送日志(比如一個socket連接建立起來以后,多次發送心跳數據)需要在應用層面才能記錄;

常見指令:

TCP代理還包含其他很多指令,下面將介紹一些常用的指令。

指令:proxy_bind語法:proxy_bind address [transparent] | off;默認值:無環境:stream、server含義:如果此配置為off,則表示請求將會使用系統自動分配的本地IP地址,即后端服務看不到用戶的真實IP地址;如果配置為“proxy_bind $remote_addr transparent;”,則后端服務可以看到用戶的真實IP地址。

為了使參數生效,需要以超級用戶權限運行Nginx的worker進程,并配置核心路由表以截獲反向代理服務器的網絡流量。

查看nginx upstream 服務的業務日志,在proxy_bind address off 的配置下,upstream 服務日志顯示為 nginx 本地ip:

直接配置該參數后,抓包看的話,是可以看到向RS 轉發的ip 從 nginx 本身的ip 變成了 client 真實ip;

不過在開啟時,可能出現后端RS 無法正常響應的情況;需要以超級用戶權限運行Nginx的worker進程,并配置核心路由表以截獲反向代理服務器的網絡流量。 代理服務器上需要配置iptables 以及對應路由表信息;上游服務器也要指向對應的網關;

這部分的配置,也找到了一些文檔;不過部署的測試環境,一直沒調通 o(╥﹏╥)o ;所以這部分暫時不細寫;

指令:proxy_download_rate語法:proxy_download_rate rate;默認值:proxy_download_rate 0;環境:stream、server含義:設置后端服務器讀取數據的速度。速度定義為字節每秒。默認值為0,表示禁用限速。限速設置的值對每個連接都有效。指令:proxy_next_upstream語法:proxy_next_upstream on | off;默認值:proxy_next_upstream on;環境:stream、server含義:當無法與當前的后端服務器建立連接時,該指令用來確定是否將客戶端連接傳遞給下一臺后端服務器。這可能會受到嘗試次數(proxy_next_upstream_tries)和時間(proxy_next_upstream_timeout)的影響。指令:proxy_next_upstream_timeout語法:proxy_next_upstream_timeout time;默認值:proxy_next_upstream_timeout 0;環境:stream、server含義:設置傳遞連接到下一臺后端服務器的時間。默認值為0,表示關閉這個限制。指令:proxy_next_upstream_tries語法:proxy_next_upstream_tries number;默認值:proxy_next_upstream_tries 0;環境:stream、server含義:設置傳遞連接到下一臺后端服務器的嘗試次數。默認值為0,表示關閉這個限制。指令:proxy_pass語法:proxy_pass address;默認值:無環境:server含義:設置被代理的服務器地址。地址可以是一個域名,也可以是IP地址加端口號。從Nginx1.11.3版本開始支持配置變量,如“proxy_pass $upstream;”。指令:resolver語法:resolver address ... [valid=time] [ipv6=on|off];環境:stream、server含義:在進行DNS解析時,該指令用于對upstream中出現的域名進行IP地址解析,然后將請求代理到解析到的IP地址上;Valid=time表示DNS解析后的緩存時間,使用緩存時間可以減少DNS解析的次數;關于ipv6=on|off,如果設置為on,則表示在查詢IPv4(Internet Protocol version 4,互聯網協議版本4)無果后會繼續查詢IPv6(Internet Protocol Version 6,互聯網協議版本6),如果不需要查找IPv6,可以配置為off,以縮短查找時間。指令:resolver_timeout語法:resolver_timeout time;默認值:resolver_timeout 30s;執行階段:stream、server含義:設置解析DNS的超時時間,如果超時,DNS會使用上一次解析到的IP地址。指令:proxy_protocol_timeout語法:proxy_protocol_timeout timeout;默認值:proxy_protocol_timeout 30s;環境:stream、server含義:設置讀取proxy協議頭的時間。如果在所設置的時間內沒有發送完整的報頭,則關閉連接。

實戰經驗

1.指令nginx_tcp_proxy_module和ngx_stream_core_module都可以在TCP代理中使用。其中ngx_stream_core_module包含有關日志記錄的一些常用變量,通過這些日志信息可以分析每個TCP請求的情況。

2.在做TCP代理時,Nginx代理節點服務器可能不止一臺,可以使用DNS輪詢或LVS(LinuxVirtualServer,Linux虛擬服務器)等功能對Nginx進行負載均衡。

3.Redis屬于單核服務,所以在一臺服務器上啟動多個Redis實例是很正常的。如果多個Redis從庫部署在同一臺服務器上,可以通過TCP代理進行轉發,否則會因為端口不一致,導致配置非常煩瑣。

引用資料

相關nginx 官網鏈接和參考資料:

https://docs.nginx.com/nginx/admin-guide/load-balancer/tcp-udp-load-balancer/

http://nginx.org/en/docs/stream/stream_processing.html

http://nginx.org/en/docs/stream/ngx_stream_log_module.html#open_log_file_cache

http://nginx.org/en/docs/stream/ngx_stream_core_module.html

http://nginx.org/en/docs/varindex.html

http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_bind

https://github.com/vislee/leevis.com/issues/142

http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_bind

https://www.nginx.com/blog/ip-transparency-direct-server-return-nginx-plus-transparent-proxy/

https://pengpengxp.github.io/archive/before-2018-11-10/2017-06-27-%E4%BD%BF%E7%94%A8nginx%E7%9A%84proxy_bind%E9%80%89%E9%A1%B9%E9%85%8D%E7%BD%AE%E9%80%8F%E6%98%8E%E7%9A%84%E5%8F%8D%E5%90%91%E4%BB%A3%E7%90%86.html#tproxy_sum

超強干貨來襲 云風專訪:近40年碼齡,通宵達旦的技術人生

總結

以上是生活随笔為你收集整理的nginx tcp代理_nginx——TCP/UDP Load Balancing的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。