Nginx反向代理TCP

前言

由于历史原因,我司公网的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)