nginx/java tcp反向代理
1.需求:用户通过公网IP:port 这个入口,能够访问到自己虚拟机(提供内网IP):22端口。
2.实现限制:由于公网ip有限,用户访问量较大,不可能给每个用户分配一个ip或端口。所以考虑通过域名的方式来区分不同的用户
3.参考方案:给每个用户提供一个二级域名,如userA.XXX.com、userB.XXX.com;然后通过ipables做端口映射,
将所有*.XXX.com:10099的tcp请求转发到myProxy:10098这个代理服务器,代理服务器然后根据每个用户的域名,再反向代理到自己的虚拟机IP:22端口。
4.实现:在具体的实施过程中,发现nginx可以做tcp反向代理(nginx本身不具备,需要装nginx_tcp_proxy_module第三方模块),这个链路是通的(公网IP:10099->反向代理服务器:10099->虚拟机IP:22),但是tcp反向代理服务器无法通过不同的二级域名来智能路由到不同的虚拟机(备注:利用nginx的http反向代理是可以根据域名来做请求转发的)。看大伙怎么考虑这个问题,畅所欲言,不一定非要用nginx。
下面是tcp反向代理的nginx.conf部分配置
tcp {
upstream chatCluster{
# simple round-robin
server 192.168.202.249:10098;
#server 127.0.0.1:1234;
check interval=3000 rise=2 fall=5 timeout=1000;
}
server {
listen 10098;
proxy_pass chatCluster;
}
}
在帖下http反向代理,根据不同的二级域名做路由转发
server
{
listen 10000;
server_name *.newtouch.cn;
if ($http_host ~* "^(.*?)\.newtouch\.cn:10001$") {
set $domain $1;
}
location / {
if ($domain ~* "test1") {
proxy_pass http://www.baidu.com;
}
if ($domain ~* "test2") {
proxy_pass http://www.sohu.com;
}
proxy_pass http://www.sohu.com;
proxy_redirect off;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Server $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}