一、使用说明:

 nginx可以一般用来做http的转发,当然也可以用来做tcp转发,需要第三方模块nginx_tcp_proxy_module,下载地址为:https://github.com/yaoweibin/nginx_tcp_proxy_module 作者:Weibin Yao(姚伟斌) (yaoweibin@gmail.com)


二、实验环境:

 

 192.168.1.194服务器(centos 6.5 final版本)

 nginx版本:nginx-1.6.1


三、安装配置:

 这里假定已经安装好了nginx(安装nginx比较简单,网上案例很多),此刻需要给nginx扩展一个nginx_tcp_proxy_module模块。

 下载nginx_tcp_proxy_module到nginx的同级目录:

wget https://github.com/yaoweibin/nginx_tcp_proxy_module/archive/master.zip -o master.zip

 解压此文件

unzip master.zip

 可以看到

[root@localhost nginx]# ls
master.zip
nginx_tcp_proxy_module-master
nginx-1.6.1
nginx-1.6.1.tar.gz

 然后进入nginx-1.6.1目录,执行:

[root@localhost nginx-1.6.1]# patch -p1 < ../nginx_tcp_proxy_module-master/tcp.patch 
patching file src/core/ngx_log.c
Hunk #1 succeeded at 69 (offset 3 lines).
patching file src/core/ngx_log.h
Hunk #1 succeeded at 30 (offset 1 line).
Hunk #2 succeeded at 38 (offset 1 line).
patching file src/event/ngx_event_connect.h
Hunk #1 succeeded at 33 (offset 1 line).
Hunk #2 succeeded at 44 (offset 1 line).

 打上补丁。

[root@localhost nginx-1.6.1]# /usr/local/apps/nginx/sbin/nginx -V
nginx version: nginx/1.6.1
built by gcc 4.4.7 20120313 (Red Hat 4.4.7-17) (GCC) 
TLS SNI support enabled
configure arguments: --prefix=/usr/local/apps/nginx/ --user=nginx --group=nginx --with-http_stub_status_module --with-http_gzip_static_module --with-http_flv_module --with-http_mp4_module --with-pcre=/home/workspace/auto_deploy/software/nginx/pcre-8.30 --with-openssl=/home/workspace/auto_deploy/software/nginx/openssl-1.0.1i --add-module=../gnosek-nginx-upstream-fair-a18b409/ --add-module=../ngx_cache_purge-2.1 --with-http_ssl_module

 nginx -V可以查看nginx的版本,以及之前编译的项目。

 编译安装nginx_tcp_proxy_module,需要把之前的编译项目都copy进来,在加上新的nginx_tcp_proxy_module模块编译项。

[root@localhost nginx-1.6.1]# ./configure --prefix=/usr/local/rktsapps/nginx/ --user=nginx --group=nginx --with-http_stub_status_module --with-http_gzip_static_module --with-http_flv_module --with-http_mp4_module --with-pcre=/home/workspace/auto_deploy/software/nginx/pcre-8.30 --with-openssl=/home/workspace/auto_deploy/software/nginx/openssl-1.0.1i --add-module=../gnosek-nginx-upstream-fair-a18b409/ --add-module=../ngx_cache_purge-2.1 --with-http_ssl_module --add-module=../nginx_tcp_proxy_module-master/

 注意后面多了一个--add-module=../nginx_tcp_proxy_module-master/

[root@localhost nginx-1.6.1]# make && make install

 执行安装,安装完成后,执行nginx -V,看看模块是否被编译上去了

[root@localhost nginx-1.6.1]# /usr/local/rktsapps/nginx/sbin/nginx -V
nginx version: nginx/1.6.1
built by gcc 4.4.7 20120313 (Red Hat 4.4.7-17) (GCC) 
TLS SNI support enabled
configure arguments: --prefix=/usr/local/rktsapps/nginx/ --user=nginx --group=nginx --with-http_stub_status_module --with-http_gzip_static_module --with-http_flv_module --with-http_mp4_module --with-pcre=/home/workspace/auto_deploy/software/nginx/pcre-8.30 --with-openssl=/home/workspace/auto_deploy/software/nginx/openssl-1.0.1i --add-module=../gnosek-nginx-upstream-fair-a18b409/ --add-module=../ngx_cache_purge-2.1 --with-http_ssl_module --add-module=../nginx_tcp_proxy_module-master/

 ok,nginx_tcp_proxy_module已经被编译上去了,至此nginx已经支持tcp转发咯。


 下面列一份tcp转发的nginx配置文件

vim tcp_test.conf

内容为:
tcp {
    upstream tcpserver1 {
        # simple round-robin
        ip_hash;
        server 192.168.1.70:26000;
        server 192.168.1.71:26001;
        server 192.168.1.72:26002;
        server 192.168.1.73:26003;
        check interval=3000 rise=2 fall=3 timeout=2000;
        #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 26000;
        proxy_pass tcpserver1;
        so_keepalive on;
        tcp_nodelay on;
        access_log      logs/tcpserver1_access.log;
    }
}

 tcp的默认的access日志为默认为tcp_access.log,可以单独指定的。


 注意,这里的tcp_test.conf,不能在配置文件中被包括进http{  }里面,否则会报

nginx: [emerg] "tcp" directive is not allowed here in xxx

 这类的错误。这里一定要注意,tcp{ }和http{ }在nginx.conf配置文件里面是对等关系!



 访问日志的说明如下:

log_time worker_process_pid client_ip host_ip accept_time upstream_ip bytes_read bytes_write  
  
2011/08/02 06:19:07 [5972] 127.0.0.1 0.0.0.0:1982 2011/08/02 06:18:19 172.19.0.129:80 80 236305