记住用户名密码
由于历史原因,我司公网的80端口与443端口并不指向同一台机器,这就导致了https和http不能在同一台机器上做,而且我司公网的443端口还被一个tcp站点占用了。针对这个问题,需要进行改进和优化,要将443端口进行分流转发,如果是带TSL类型的请求转发到二级nginx上去,如果是tcp类型的请求继续转发到之前机器的443端口上。后来选择了使用Nginx作为解决方案来
Nginx的反向代理是由Stream模块来实现的,这个在老版本是没有的,但是现在新版本是一定有的。
详细解释可以参照Nginx官网的stream章节
image.png
修改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; }
首先如果是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上去,没有域名的就直接转发到预定机器上去。
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;}
目前有 0 条留言 其中:访客:0 条, 博主:0 条