利用SSH隧道进行反向代理
公司有几个网站要迁移到阿里云
,数据已经被我迁移过去了,域名还在备案,使用未备案的域名访问,阿里云是会直接封锁的,万恶的备案!!!
公司有一个临时方案,把域名和数据暂时放在北京office的一台Linux服务器上,备案通过后再切换到阿里云服务器,但是当把数据弄到临时服务器后,突然发现网站的一个功能模块出现兼容性问题,代码里很多地方是针对windows处理的, 由于开发机和原服务器都是windows系统,在文件目录分隔符
、系统字符编码
等一些地方没有考虑到linux的情形,而且这模块不是我开发的, 代码写得有些凌乱,改了两天也算勉强能用了。
还有一个问题,北京office的服务器似乎不太稳定,SSH连接偶尔还会掉线,这个影响后面的部署和选择。
我想来想去,最终觉得用反向代理处理。好处是显而易见的:
解决代码的平台兼容性问题
不用重复迁移,否则当域名备案成功后还要把临时服务器的数据转移到阿里云来,不堪其扰。
正常反向代理
在阿里云上安装必要的软件,配置网站,这里使用
apache
, 开放服务器80端口。在临时服务器上配置反向代理,这里我使用
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; } }
重启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,因为掉线后会自动重连。
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-IP
和X-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