您的位置:首页 > 理论基础 > 计算机网络

nginx之TCP反向代理

2017-03-29 18:54 288 查看
nginx的tcp proxy负载调度有两种方式:
官方的ngx_stream_core_module
阿里开源的nginx_tcp_proxy_module

此处介绍nginx官方TCP proxy。
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;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  TCP 反向代理 nginx