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的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python打包exe不弹窗_Pyins
- 下一篇: unique函数_Office 365函