码迷,mamicode.com
首页 > 其他好文 > 详细

SSH反向通道暴露内网主机80端口——作为Nginx的upstream后端

时间:2015-02-06 13:24:59      阅读:166      评论:0      收藏:0      [点我收藏+]

标签:

背景

微信开发的时候,需要提供一个已经备案的域名才能调用api。这里假设我的域名是domain.com,我把weixin.domain.com解释到一个公网IP。我的项目就部署到weixin.domain.com上面,微信接入的URL就是http://weixin.domain.com/gateway.php。现在有个问题,我的项目有一些bug,而又不是肉眼能看出来的,我需要debug。但是微信发送给公众账号的消息是发送到http://weixin.domain.com/gateway.php,即发到送到我的服务器上。我在内网做开发的主机没法收到请求。没法debug。于是就有了如下法子。

概念
  • SSH反向通道

SSH反向通道可以将公网服务器的某个端口映射到内网主机的某个端口上来。关于SSH反向通道可以参考下面两篇文章,

SSH隧道技术简介:端口转发&SOCKS代理

实战 SSH 端口转发

  • Nginx反向代理和负载均衡

Nginx的反向代理可以把接收到的客户端请求代理到后端的处理器,得到结果后再把结果响应给客户端。而负载均衡就是上面提到的处理器的一个提供方式,一般是几个处理器并列。一个死了,另一个顶上。

配置

我的部署方案是这样的,在www.domain.com上面部署了一个Nginx服务器,一个8989端口的php-fpm。我在内网做开发的主机上部署了一个9090端口的php-fpm。

现在我的目标是让nginx做前端,而两个php-fpm做后端的负载均衡。而且当内网的开发主机开启的时候,要求nginx把请求发送到开发主机上来。当内网的开发主机不开启的时候,nginx就把请求代理到公网服务器上的php-fpm上,即8989端口。

这里要做两件事,

  1. 让内网的9090端口暴露出去,以便Nginx能把请求代理到这个端口来。我的做法是用ssh的反向通道,如下

    ssh -f -N -q -R 9090:localhost:80 sshadmin@weixin.domain.com

    修改weixin.domain.com上面的sshd配置文件/etc/ssh/sshd_config,在最后面添加 GatewayPorts yes。 这一点非常重要,是为了让9090端口的监听地址不受限于127.0.0.1

经过刚才的配置,在浏览器上就可以访问weixin.domain.com:9090。

  1. 配置Nginx,很简单,两个配置:

    添加一个均衡负载器,注意下面的backup关键字

    upstream weixin {
    server weixin.domain.com:8989 backup;
    server weixin.domain.com:9090;
    }
    

    添加一个命名虚拟主机

    server {
    listen 80;
    server_name weixin.domain.com;
    location  /     {
        proxy_pass http://weixin;
    }
    }
    

到这里所有的配置就完成了。现在我在浏览器访问weixin.domain.com的时候,Nginx就会默认把请求代理到weixin.domain.com:9090,然后通过ssh reverse tunnel来到我的开发机器上了,而当我的开发机器关机的时候,请求就交给了weixin.domain.com:8989。这样就实现了开发生产两不误。

SSH反向通道暴露内网主机80端口——作为Nginx的upstream后端

标签:

原文地址:http://my.oschina.net/atanl/blog/375997

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!