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
原文地址:http://jinyudong.blog.51cto.com/10990408/1911522