首页 > 代码库 > nginx之TCP反向代理

nginx之TCP反向代理

nginx从1.9.0版本以后支持面向TCP的反向代理。莫约是2015年初发布的。

注:如今最新版nginx为1.11.12

  nginx从1.9.0后引入模块ngx_stream_core_module,模块是没有编译的,需要用到编译需添加--with-stream配置参数,stream负载均衡官方配置样例


配置编译的时候需要加上

先切换到nginx解压后目录内

# ./configure --prefix=/usr/local/nginx --user=www --group=www --with-http_ssl_module --with-stream

# make

# cp ./objs/nginx /usr/local/nginx/sbin/

# make upgrade


以下配置文件示例为反向代理MySQL。

user  nginx;
#user root;
worker_processes  1;

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  ‘$remote_addr - $remote_user [$time_local] "$request" ‘
                      ‘$status $body_bytes_sent "$http_referer" ‘
                      ‘"$http_user_agent" "$http_x_forwarded_for"‘;

    access_log  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    #gzip  on;

    include /etc/nginx/conf.d/*.conf;
}

stream{
	upstream mysql{
		server 192.168.1.106:3306 weight=1;
		server 192.168.1.108:3306 weight=1;
	}
        
	server{
		listen 3307;
		proxy_pass mysql;
	}

}

stream 与 http 是一个层级的,在main内定义,放在配置文件最后。其中可包含server字段。


配置项说明:

listen address:port [ssl] [udp] [proxy_protocol] [backlog=number] [bind] [ipv6only=on|off] [reuseport] [so_keepalive=on|off|[keepidle]:[keepintvl]:[keepcnt]];  

 It is possible to specify just only the port.   #我这撇脚的英语。。

 地址也可以是一个主机名,若IPv6要用方括号指定 [::1] 。

 ssl参数允许指定所有连接在该端口上接受SSL模式下工作。

 udp参数配置一个监听套接字用于处理数据报(1.9.13引入)。

 proxy_protocol参数(1.11.4)允许指定在该端口上所有连接都要使用PROXY protocol.。

 backlog参数 它限制了等待连接的队列的最大长度(1.9.2)。

 bind 指定一个单独的bind()相应一个给定地址:端口。

 更多参照官网关于模块ngx_stream_core_module的叙述


ngx_stream_core_module自1.11.2模块支持变量。

$binary_remote_addr

 二进制格式的客户端地址

$bytes_received

 从客户端接收的字节数(1.11.4)

$bytes_sent

 发送到客户端的字节数

$connection

 连接序列号

$hostname

 主机名

$msec

 当前时间在秒和毫秒分辨率

$nginx_version

 nginx版本

$pid

 工作进程的PID

$protocol

 协议用于与客户沟通: TCP或 UDP(1.11.4)

$proxy_protocol_addr

 客户端地址从代理协议头,否则或空字符串(1.11.4)

 代理协议之前必须通过设置启用 proxy_protocol参数听指令。

$proxy_protocol_port

 客户端端口从代理协议头,否则或空字符串(1.11.4)

 代理协议之前必须通过设置启用 proxy_protocol参数听指令。

$remote_addr

 客户端地址

$remote_port

 客户端端口

$server_addr

 接受连接过来的服务器的地址

 计算这个变量的值通常需要一个系统调用。为了避免一个系统调用,听指令必须指定地址和使用 bind参数。

$server_port

 接受了一个连接端口的服务器

$session_time

 会话持续时间在秒和毫秒分辨率(1.11.4);

$status

 会话状态(1.11.4),可以是下列之一:

 200

 会议成功完成

 400

 客户端数据不能被解析,例如,代理协议头

 403

 访问被禁止的,例如,当访问是有限的某些客户端地址

 500

 内部服务器错误

 502

 糟糕的网关,例如,如果一个上游服务器无法选中或者联系到。

 503

 服务不可用,例如,当访问是有限的连接数

 $time_iso8601

 当地时间的ISO 8601标准格式


编写完成后测试语法格式,OK后重载服务

# ./sbin/nginx -t

# ./sbin/nginx -s reload


———————————————官方Example Configuration—————————————————worker_processes auto;


error_log /var/log/nginx/error.log info;

events {
   worker_connections  1024;
}

stream {
   upstream backend {
       hash $remote_addr consistent;

       server backend1.example.com:12345 weight=5;
       server 127.0.0.1:12345            max_fails=3 fail_timeout=30s;
       server unix:/tmp/backend3;
   }

   upstream dns {
      server 192.168.0.1:53535;
      server dns.example.com:53;
   }

   server {
       listen 12345;
       proxy_connect_timeout 1s;
       proxy_timeout 3s;
       proxy_pass backend;
   }

   server {
       listen 127.0.0.1:53 udp;
       proxy_responses 1;
       proxy_timeout 20s;
       proxy_pass dns;
   }

   server {
       listen [::1]:12345;
       proxy_pass unix:/tmp/stream.socket;
   }
}



本文出自 “墨” 博客,请务必保留此出处http://jinyudong.blog.51cto.com/10990408/1911522

nginx之TCP反向代理