专业的编程技术博客社区

网站首页 > 博客文章 正文

Nginx TCP代理转发和负载均衡

baijin 2024-12-19 10:11:12 博客文章 7 ℃ 0 评论

众所周知,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;
}

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表