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

背景

在开发拇指动力项目的时候遇到了微信JS接口的问题。 微信开发的时候,需要提供一个已经备案的域名才能调用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

    • -f *表示后台运行。

经过刚才的配置,在浏览器上就可以访问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。这样就实现了开发生产两不误。

By 啪嗒科技(padakeji.com)

转载于:https://my.oschina.net/atanl/blog/375997

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值