Nginx TCP代理转发和负载均衡
众所周知,nginx是一个高性能http和反向代理的web服务器,其实也可以用于代理转发TCP连接
从1.9.x版本开始,nginx增加了一个stream模块可以用于转发TCP连接
一、配置TCP转发的方法
1.首先找到nginx的配置文件nginx.conf
cd /etc/nginx/ #进入配置文件路径当前目录
vim nginx.conf
# For more information on configuration, see:
# * Official English Documentation: http://nginx.org/en/docs/
# * Official Russian Documentation: http://nginx.org/ru/docs/
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;
# Load dynamic modules. See /usr/share/doc/nginx/README.dynamic.
include /usr/share/nginx/modules/*.conf;
events {
worker_connections 1024;
}
http {
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;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
include /etc/nginx/mime.types;
default_type application/octet-stream;
# Load modular configuration files from the /etc/nginx/conf.d directory.
# See http://nginx.org/en/docs/ngx_core_module.html#include
# for more information.
include /etc/nginx/conf.d/*.conf;
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name _;
root /usr/share/nginx/html;
# Load configuration files for the default server block.
include /etc/nginx/default.d/*.conf;
location / {
}
error_page 404 /404.html;
location = /40x.html {
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
}
}
}
# Settings for a TLS enabled server.
#
# server {
# listen 443 ssl http2 default_server;
# listen [::]:443 ssl http2 default_server;
# server_name _;
# root /usr/share/nginx/html;
#
# ssl_certificate "/etc/pki/nginx/server.crt";
# ssl_certificate_key "/etc/pki/nginx/private/server.key";
# ssl_session_cache shared:SSL:1m;
# ssl_session_timeout 10m;
# ssl_ciphers PROFILE=SYSTEM;
# ssl_prefer_server_ciphers on;
#
# # Load configuration files for the default server block.
# include /etc/nginx/default.d/*.conf;
#
# location / {
# }
#
# error_page 404 /404.html;
# location = /40x.html {
# }
#
# error_page 500 502 503 504 /50x.html;
# location = /50x.html {
# }
# }
2.nginx.conf添加stream模块,写入TCP代理转发的参数
#注意stream模块和http模块是同级,不要将stream添加到http模块里
stream{
upstream test{
server 192.168.0.1:8000(ip地址:端口号)
}
server{
listen 8000;
proxy_pass test;
}
}
二、nginx tcp代理转发的负载均衡
原理和nginx http代理转发思路一样,也是5种模式
轮询(默认)
每个请求按时间顺序分配给配置的server地址,如果其中一个server地址无法连通,会自动剔除
upstream test{
server 192.168.0.1:8090;
server 192.168.0.2:8090;
}
server{
listen 8090;
proxy_connect_timeout 1s;
proxy_pass test;
}
权重(weight)
给server地址配置weight权重值,weight和分配的访问比率成正比,一般用于所配置的server性能不均的情况
upstream test{
server 192.168.0.1:8090 weight=9; #10次请求9次转发到该地址
server 192.168.0.2:8090 weight=1;
}
server {
listen 8090;
proxy_pass test ;
}
ip_hash
每次请求按照请求访问方的IP的hash结果分配,每个用户分固定访问其中一个server地址
upstream test{
ip_hash;
server 192.168.0.1:8090;
server 192.168.0.2:8090;
}
server{
listen 8090;
proxy_pass test;
}
fair(第三方)需要安装第三方模块
按照server的地址的响应时间来分配,响应时间短的优先分配
upstream{
fair;
server 192.168.0.1:8090;
server 192.168.0.2:8090;
}
server{
listen 8090;
proxy_pass test;
}
url_hash
按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存时比较有效。
注意:在upstream中加入hash语句,server语句中不能写入weight等其他的参数,hash_method是使用的hash算法
upstream test{
hash $request_uri;
hash_method crc32;
server 192.168.0.1:8090;
server 192.168.0.2:8090;
}
server{
listen 8090;
proxy_pass test;
}
自定义负载
upstream test{
server 192.168.0.1:8090 down;
server 192.168.0.2:8090;
server 192.168.0.3:8090 backup;
}
server{
liisten 8090;
proxy_connect_timeout 1s; #一定要设置连接时间,否则不生效
proxy_timeout 1s; #proxy_connect_timeout和proxy_timeout 实测设置一个就可以生效
proxy_pass test;
}