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

本贴最后更新于 2828 天前,其中的信息可能已经渤澥桑田
背景

在开发拇指动力项目的时候遇到了微信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。这样就实现了开发生产两不误。

转自:http://my.oschina.net/atanl/blog/375997

  • NGINX

    NGINX 是一个高性能的 HTTP 和反向代理服务器,也是一个 IMAP/POP3/SMTP 代理服务器。 NGINX 是由 Igor Sysoev 为俄罗斯访问量第二的 Rambler.ru 站点开发的,第一个公开版本 0.1.0 发布于 2004 年 10 月 4 日。

    311 引用 • 546 回帖 • 34 关注
  • SSH
    42 引用 • 51 回帖
  • 端口
    12 引用 • 22 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...