Nginx 实现 TCP 反向代理
默认Nginx
只支持 http 的反向代理,要想Nginx
支持tcp
的反向代理,还需要在编译时增加 tcp 代理模块支持,即nginx_tcp_proxy_module
下面操作步骤只让 Nginx 支持tcp_proxy
,没有加入prce
、gzip
、ssl
等功能,如需要,可自行在编译时加上相关参数。
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 反向代理搭建配置及搭建过程一些思考
- CentOS 6.2 实战部署 Nginx+MySQL+PHP
- 使用 Nginx 搭建 WEB 服务器
- 搭建基于 Linux6.3+Nginx1.2+PHP5+MySQL5.5 的 Web 服务器全过程
- CentOS 6.3 下 Nginx 性能调优
- CentOS 6.3 下配置 Nginx 加载 ngx_pagespeed 模块
- CentOS 6.4 安装配置 Nginx+Pcre+php-fpm
- Nginx 安装配置使用详细笔记
- Nginx 日志过滤 使用 ngx_log_if 不记录特定日志
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
模块指令