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