美文网首页
Nginx反向代理TCP

Nginx反向代理TCP

作者: 野生DBNull | 来源:发表于2022-03-23 11:13 被阅读0次

    前言

    由于历史原因,我司公网的80端口与443端口并不指向同一台机器,这就导致了https和http不能在同一台机器上做,而且我司公网的443端口还被一个tcp站点占用了。针对这个问题,需要进行改进和优化,要将443端口进行分流转发,如果是带TSL类型的请求转发到二级nginx上去,如果是tcp类型的请求继续转发到之前机器的443端口上。后来选择了使用Nginx作为解决方案来

    Nginx反向代理Tcp

    Nginx的反向代理是由Stream模块来实现的,这个在老版本是没有的,但是现在新版本是一定有的。
    详细解释可以参照Nginx官网的stream章节

    image.png

    具体实现

    首先要加载stream模块的配置文件

    修改nginx.conf文件,添加stream模块支持和配置

    nginx.conf文件末尾添加如下代码,开启stream的配置文件引用(这个文件的位置一般在/etc/nginx/nginx.conf)

    stream {
        include /etc/nginx/tcp.conf.d/*.conf;
    }
    

    配置tcp转发

    /etc/nginx/tcp.conf.d/文件夹下添加redis.conf,内容如下,就实现了将redis的6379端口转发为8888的功能

        upstream redis{
           server 192.168.0.1:6379;
           server 192.168.0.2:6379;
        }
    
       server {
            listen 8888;
            proxy_connect_timeout 1s;
            proxy_timeout 3s;
            proxy_pass redis;
        }
    

    配置https安装域名转发到不同的地址

    首先如果是http的话可以直接配置转发就行,因为不需要证书,比较简单,教程网上一抓一大把;
    但是https就比较特殊了,如果采用传统的方式去进行转发nginx就会要求你配置证书,但是如果你有多个网站,而且证书都已经配置好了就可以使用tcp转发,这样比较方便,免得在这个nginx中也配置证书了。

    这个功能需要用到ngx_stream_ssl_preread_module模块

    map $ssl_preread_server_name $host_name {
        baidu.aaa.com      baidu;
        nginx.aaa.com      nginx;
    }
    
    upstream baidu{
        server www.baidu.com;
        # server 192.168.1.1:443 # 可以使用域名,也可以使用IP+端口
    }
    
    upstream nginx{
        server  nginx.org:443;
    }
    
    server {
        listen      443;
        proxy_pass  $host_name;
        ssl_preread on; #必须要开了这个才会有$ssl_preread_server_name这个参数
    }
    
    

    配置https端口转发到二级nginx,其他的转发到之前的那台机器的443端口上

    这个的实现逻辑就是使用通配符来通配https的域名,然后转发到二级nginx上去,没有域名的就直接转发到预定机器上去。

    map $ssl_preread_server_name $server {
        default default_server; # 默认转发到之前机器的443上
    
        ~*.xxx.com xxx_com;# 通配符转发到二级nginx上
    }
    
    upstream default_server {
        server 192.168.1.2:443;
    }
    
    upstream xxx_com {
        server 192.168.1.1:443;
    }
    
    server {
        listen 443;
        ssl_preread on;
        proxy_pass $server;
        proxy_connect_timeout 5s;
    }
    
    

    相关文章

      网友评论

          本文标题:Nginx反向代理TCP

          本文链接:https://www.haomeiwen.com/subject/gircjrtx.html