menu_book
description
使用 NGINX 配合 SSH 通道,可以把来自互联网的访问转发到在本地电脑上运行的服务来处理。
在宁皓独立开发者训练营中调试微信支付与支付宝支付时,服务端应用需要处理这些支付服务发送过来的支付结果。为了能让在本地电脑上运行的服务端应用收到这些支付结果,就必须得保证能够直接通过互联网访问在本地电脑上运行的应用,可以使用 NGINX 与 SSH 通道的方式实现这个需求。
先配置好一台能在互联网上被访问到的反向代理服务器(Web 服务器),服务器会将请求转发至本地服务器的某个特定端口,然后用 SSH 将这个服务器上的特定端口(比如 7689)与本地电脑上的某个特定端口(比如 3000)连通,这个本地电脑上的特定端口就是运行本地服务端应用时使用的端口,这样当有人在互联网访问这个反向代理服务器时,实际提供服务的是在我们本地电脑上运行的服务端应用。
在域名服务商提供的域名管理界面,添加一条 A 类型的 DNS 记录,记录值是我们的云服务器的 IP 地址,主机名可以随意设置。
比如我为 ninghao.net 这个域名添加了一条 DNS 记录,让 sandbox.ninghao.net 指向我的一台云服务器,准备好 NGINX 服务器与 SSH 通道以后,就可以在互联网通过这个域名直接访问在我本地电脑上运行的应用了。
使用 SSH 远程登录云服务器以后,需要配置一个 NGINX 的反向代理服务器。
vi /etc/nginx/conf.d/sandbox.ninghao.net.conf
内容如下:
/etc/nginx/conf.d/sandbox.ninghao.net.conf
server {
listen 80;
server_name sandbox.ninghao.net;
client_max_body_size 200m;
location / {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Real-Port $remote_port;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_redirect off;
expires off;
sendfile off;
proxy_pass http://127.0.0.1:7689;
}
}
上面这个 NGINX 配置,创建了一台反向代理服务器,监听的端口是 80,绑定的域名是 sandbox.ninghao.net,在用一个 location 区块,配置一下代理服务相关的东西,注意这里的 proxy_pass 指令的值被设置成了 http://127.0.0.1:7689,意思是将访问转发到本地服务器的 7689 这个端口。也就是当有人访问 http://sandbox.ninghao.net 的时候,这个反向代理服务器会将请求转给本地服务器的 7689 这个端口。
如果你希望通过 HTTPS 访问这个服务器,可以使用 certbot,为 sandbox.ninghao.net 这个域名申请一个 SSL 证书。完成以后,这个 NGINX 服务器的配置文件看起来会像下面这样:
server {
listen 443 ssl http2;
server_name sandbox.ninghao.net;
...
ssl_certificate /etc/letsencrypt/live/sandbox.ninghao.net/fullchain.pem; # managed by Certbot
ssl_certificate_key /etc/letsencrypt/live/sandbox.ninghao.net/privkey.pem; # managed by Certbot
include /etc/letsencrypt/options-ssl-nginx.conf;
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
location / {
...
proxy_pass http://127.0.0.1:7689;
}
}
回到本地电脑上,确定在本地电脑上的服务端应用已经运行了,这个应用通过 3000 这个端口提供服务。现在我们要使用 SSH,在本地电脑与云服务器之间打个通道。
示例
ssh -vnNT -R 7689:localhost:3000 root@42.120.40.68
打开本地电脑的终端,执行 ssh 命令,要加上一些参数,比如 vnNT 这四个参数,还需要一个 R 参数,具体这些参数表示的意思可以执行 man ssh 命令,查看 ssh 命令的使用说明。7689 指的是远程云服务器上的一个端口,还记得上面我们配置的那台 NGINX 反向代理服务器吗?它会将访问转发到 7689 这个端口。localhost:3000 是我在本地电脑上运行的服务端应用的地址。root 是远程登录服务器时使用的用户名,42.120.40.68 是我的云服务器的 IP 地址。
一切正常会出现下面这样的文字:
remote forward success for: listen 7689, connect localhost:3000
现在如果有人通过互联网访问 sandbox.ninghao.net,服务器会将请求转发到 7689 这个端口,又因为我们使用 SSH 在本地电脑与云服务器之间打了一个通道,这个通道的服务器这一边,设置使用的端口号是 7689,本地电脑这边的地址是 localhost:3000,这样访问 sandbox.ninghao.net,实际提供服务的就是在我们本地电脑上运行的应用。