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)

相關文章
相關標籤/搜索