Nginx 实现TCP反向代理

Nginx 实现 TCP 反向代理

来源: Nginx 实现 TCP 反向代理

默认Nginx只支持 http 的反向代理,要想Nginx支持tcp的反向代理,还需要在编译时增加 tcp 代理模块支持,即nginx_tcp_proxy_module

下面操作步骤只让 Nginx 支持tcp_proxy,没有加入prcegzipssl等功能,如需要,可自行在编译时加上相关参数。

wget https://github.com/yaoweibin/nginx_tcp_proxy_module/archive/master.zip
unzip master
cd nginx-1.6.2
patch -p1 </opt/nginx_tcp_proxy_module-master/tcp.patch
./configure  --add-module=/opt/nginx_tcp_proxy_module-master
make
make install

nginx.conf 主配置文件中增加如下配置配置:(也可以在主配置文件中配置 include,包含 tcp 转发的配置文件)

include /opt/nginx_tcp_proxy_module-master/tcp_proxy.conf)

tcp {
    upstream proxy_name {
        \# simple round-robin
        server 192.168.1.10:8000;
        server 192.168.1.10:8001;
        server 192.168.1.11:8000;
        server 192.168.1.11:8001;

        check interval=3000 rise=2 fall=5timeout=1000;
        \#check interval=3000 rise=2 fall=5timeout=1000
        \#check interval=3000 rise=2 fall=5timeout=1000
        \#check_http_send "GET /HTTP/1.0\r\n\r\n";
        \#check_http_expect_alive http_2xxhttp_3xx;
    }

    server {
        listen 8888;

        proxy_pass proxy_name;
    }
}

说明:

  • check interval 健康检查,单位是毫秒
  • rise 检查几次正常后,将 reslserver 加入以负载列表中
  • fall 检查几次失败后,摘除 realserver
  • timeout 检查超时时间,单位许毫秒
  • 具体可查看 nginx_tcp_proxy_module-master/README,很详细。

——————————————- 分割线 ——————————————-

Nginx TCP 代理

Nginx TCP 代理功能由nginx_tcp_proxy_module模块提供,同时监测后端主机状态。该模块包括的模块有:

  • ngx_tcp_module
  • ngx_tcp_core_module
  • ngx_tcp_upstream_module
  • ngx_tcp_proxy_module
  • ngx_tcp_upstream_ip_hash_module
1. 安装
$ wget http://nginx.org/download/nginx-1.4.4.tar.gz
$ tar zxvf nginx-1.4.4.tar.gz
$ cd nginx-1.4.4
$ ./configure --add-module=/path/to/nginx_tcp_proxy_module
$ make
$ make install
2. 配置
http {
    listen 80;
    location /status {
        check_status;
    }
}
tcp {
    upstream cluster_www_ttlsa_com {
        \# simple round-robin
        server 127.0.0.1:1234;
        check interval=3000 rise=2 fall=5 timeout=1000;
        \#check interval=3000 rise=2 fall=5 timeout=1000 type=ssl_hello;
        \#check interval=3000 rise=2 fall=5 timeout=1000 type=http;
        \#check_http_send "GET / HTTP/1.0\r\n\r\n";
        \#check_http_expect_alive http_2xx http_3xx;
    }
    server {
        listen 8888;
        proxy_pass cluster_www_ttlsa_com;
    }
}

这会出现一个问题,就是tcp连接会掉线。原因在于当服务端关闭连接的时候,客户端不可能立刻发觉连接已经被关闭,需要等到当Nginx在执行check规则时认为服务端链接关闭,此时Nginx会关闭与客户端的连接。

3. 保持连接配置
http {
    listen 80;
    location /status {
        check_status;
    }
}
tcp {
 timeout 1d;
    proxy_read_timeout 10d;
    proxy_send_timeout 10d;
    proxy_connect_timeout 30;
    upstream cluster_www_ttlsa_com {
        \# simple round-robin
        server 127.0.0.1:1234;
        check interval=3000 rise=2 fall=5 timeout=1000;
        \#check interval=3000 rise=2 fall=5 timeout=1000 type=ssl_hello;
        \#check interval=3000 rise=2 fall=5 timeout=1000 type=http;
        \#check_http_send "GET / HTTP/1.0\r\n\r\n";
        \#check_http_expect_alive http_2xx http_3xx;
    }
    server {
        listen 8888;
        proxy_pass cluster_www_ttlsa_com;
 so_keepalive on;
        tcp_nodelay on;
    }
}

模块具体指令参见: nginx_tcp_proxy_module模块指令

Donate - Support to make this site better.
捐助 - 支持我让我做得更好.