利用SSH隧道进行反向代理

公司有几个网站要迁移到阿里云,数据已经被我迁移过去了,域名还在备案,使用未备案的域名访问,阿里云是会直接封锁的,万恶的备案!!!

公司有一个临时方案,把域名和数据暂时放在北京office的一台Linux服务器上,备案通过后再切换到阿里云服务器,但是当把数据弄到临时服务器后,突然发现网站的一个功能模块出现兼容性问题,代码里很多地方是针对windows处理的, 由于开发机和原服务器都是windows系统,在文件目录分隔符系统字符编码等一些地方没有考虑到linux的情形,而且这模块不是我开发的, 代码写得有些凌乱,改了两天也算勉强能用了。

还有一个问题,北京office的服务器似乎不太稳定,SSH连接偶尔还会掉线,这个影响后面的部署和选择。

我想来想去,最终觉得用反向代理处理。好处是显而易见的:

  1. 解决代码的平台兼容性问题

  2. 不用重复迁移,否则当域名备案成功后还要把临时服务器的数据转移到阿里云来,不堪其扰。

正常反向代理

  1. 在阿里云上安装必要的软件,配置网站,这里使用apache , 开放服务器80端口。

  2. 在临时服务器上配置反向代理,这里我使用nginx,配置如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    
    server{		
        listen  80;
        server_name 域名1 域名2;
        access_log /log/web/access.log;
        location / {
               proxy_pass http://阿里云主机IP:80;
               include proxy.conf;
           }	
       }
    
  3. 重启nginx后即生效,访问似乎正常,几分钟后域名被拦截了,意料之中,反向代理访问在后端主机看来跟正常访问其实是一样的,都是常规的http请求,阿里云根据请求头的信息拦截。

阿里云拦截

一句话说白了,此路不通

结合SSH Forward的反向代理

先看命令,在阿里云上执行:

1
c:\ssh -R 7002:localhost:80 用户名@远程主机IP

这条命令的意思是在阿里云服务器向临时服务器建立一个ssh连接,将阿里云的80端口映射到临时服务器的7002端口,这样请求临时服务器的7002端口数据时,就会被转发往阿里云服务器的80端口,而且借助SSH隧道,还实现了加密传输,于是阿里云的系统根本不能拦截。

同时临时服务器nginx做以下配置:

1
2
3
4
5
6
7
8
9
server{		
	    listen  80;
	    server_name 域名1 域名2;
	    access_log /log/web/access.log;
	    location / {
	           proxy_pass http://127.0.0.1:7002;
	           include proxy.conf;
	       }	
	   }

可以看到跟正常反向代理相比,只是将proxy_pass修改了,原来防火墙的配置也不用修改。

在Windows下除了安装openssh的命令行执行外,还可以在 putty,bitvise一些客户端设置。推荐使用bitvise,因为掉线后会自动重连。

putty设置

bitvise设置

Apache的日志格式修改

使用反向代理后,后端的apache就不能直接取得访客真实IP了,在代理服务器nginx的proxy.conf可见如下内容:

proxy_set_header        X-Real-IP $remote_addr
proxy_set_header       X-Forwarded-For   $proxy_add_x_forwarded_for;

即为转发到apache上的请求增加了两个请求头X-Real-IPX-Forwarded-For

Apache的http.conf配置日志格式增加一条:

#reverse proxy backend
LogFormat "%{X-Forwarded-For}i %l %u %t \"%r\" %>s %b" backend

http-vhosts.conf相关配置修改为:

CustomLog "path/to/log" backend

参考资料