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。因而就有了以下法子。php

概念
  • SSH反向通道

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

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

实战 SSH 端口转发nginx

  • Nginx反向代理和负载均衡

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

配置

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

如今个人目标是让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)

相关文章
相关标签/搜索