ngrok服务端搭建并使用docker解放80端口

【start】

前言:为什么要搭建ngrok服务端,为什么使用docker

1、开发环境下调试微信公众号使用(要求80端口);

2、ngrok配置中要指定 http的端口,如果指定80端口的话,会和nginx抢端口,nginx肯定比ngrok重要,不能给他让出80端 口,所以就需要docker创建一个容器将服务器的某个端口映射到容器的80端口,然后将服务器生成的ngrok服务端和证 书都放到docker中,在docker中启用ngrok服务端;

一、搭建ngrok所需东西

服务器(有公网ip),域名

【示例中我的IP为39.105.210.177,域名是 zhangqi.art,ngrok使用的二级域名是 ngrok.zhangqi.art ,操作系统:ubuntu16.04】

二、搭建ngrok服务端步骤

1、做域名【泛解析】,开放ngrok软件所需端口;

2、在服务器上把 ngrok 软件安装好,编译好服务端和客户端;配置ngrokd (服务端)的证书、密钥;

3、启动服务端;

4、配置客户端文件,客户端启动(主要是检测服务端配置的有没有问题,没有问题的话才能将ngrok服务端放到docker中);

5、新建Dockerfile文件,创建docker镜像,运行docker容器,在容器中启动ngrok服务端;

6、服务器中:nginx配置反向代理,将 ngrok的请求都代理到服务器给docker开放的端口上(也就是docker的80端口上)

7、客户端配置好后启动,就可以使用了.

三、具体操作

1、域名泛解析以及开放ngrok所需端口;

(1)【域名泛解析】我的域名是在阿里云下的,所以在域名管理里面做域名解析,添加记录;【域名为 zhangqi.art , 域名泛解析为 *.ngrok.zhangqi.art】

ngrok服务端搭建并使用docker解放80端口插图

(2)【ngrok开放端口】-修改安全组

开放 4443,443,8080,59900(这个端口是随便的,前面的4443、443端口是ngrok需要,8080是nginx反向代理用的)

2、安装ngrok软件,编译 服务端和客户端

(1) 安装ngrok必须安装 git、golang软件;【go version 检测是否存在go程序;git version 检测是否存在git】;

## git自己安装,安装go sudo mkdir /ngrok cd /ngrok sudo wget https://dl.google.com/go/go1.11.2.linux-amd64.tar.gz sudo tar -C /ngrok -xzf go1.11.2.linux-amd64.tar.gz #下面三条一起粘贴执行 echo 'export GOPATH=/ngrok export NGROK_DOMAIN="ngrok.zhangqi.art"' | sudo tee -a /etc/profile source /etc/profile ## 安装ngrok,在 /ngrok 目录下操作 git clone https://github.com/inconshreveable/ngrok.git (生成秘钥、证书之类的) openssl genrsa -out rootCA.key 2048 openssl req -x509 -new -nodes -key rootCA.key -subj "/CN=$NGROK_DOMAIN" -days 5000 -out rootCA.pem openssl genrsa -out server.key 2048 openssl req -new -key server.key -subj "/CN=$NGROK_DOMAIN" -out server.csr openssl x509 -req -in server.csr -CA rootCA.pem -CAkey rootCA.key -CAcreateserial -out server.crt -days 5000 cp rootCA.pem /ngrok/assets/client/tls/ngrokroot.crt cp server.crt /ngrok/assets/server/tls/snakeoil.crt cp server.key /ngrok/assets/server/tls/snakeoil.key

(2)编译服务端和客户端

#linux是64位应该执行的 <getconf LONG_BIT 查看Linux是64位还是32位 linux版本> GOOS=linux GOARCH=amd64 make release-server #编译服务端 GOOS=linux GOARCH=amd64 make release-client #编译客户端 #编译报以下错,安装最新的go和配置GOPATH package context: unrecognized import path "context" (import path does not begin with hostname) package net/http/httptrace: unrecognized import path "net/http/httptrace" (import path does not begin with hostname) Makefile:8: recipe for target 'deps' failed make: *** [deps] Error 1

3、启动服务端命令(这个命令在 /ngrok 目录下执行)

./bin/ngrokd -tlsKey=server.key -tlsCrt=server.crt -domain="ngrok.zhangqi.art" -httpAddr=":8080" -httpsAddr=":8082" -tunnelAddr=":4443"

4、配置客户端文件 ngrok.cfg

首先要有生成的客户端 ngrok,ngrok.cfg(配置文件),start.sh(启动文件)

#ngrok.cfg文件 server_addr: "ngrok.zhangqi.art:4443" trust_host_root_certs: false tunnels: my: subdomain: "my" proto: http: 127.0.0.1:8090 #start.sh文件 /ngrok/bin/ngrok -config=./ngrok.cfg start my #命令启动 ./start.sh

如果Tunnel Status onlie,就证明ngrok服务端没有问题,继续下一步(这个时候映射出来的地址并不能正常访问,只是映射成功了)

5、创建Dockerfile文件(确保自己安装了docker)

ngrok和 nginx都在抢 80端口该怎么办??显然 nginx更重要,所以我打算用 Docker欺骗 ngrok,让它误以为自己绑定到了机 器的 80端口。
目录结构如下:(下面所需的东西,都从上面生成的文件中复制过来)

.├── Dockerfile ├── ngrok | ────ngrokd (服务端) | ────server.crt | ────server.key | ────server.csr └── run.sh 

Dockerfile 如下:

FROM hub.c.163.com/public/ubuntu:16.04 MAINTAINER itzhangqi itzhangqi@sina.com RUN mkdir /opt/ngrok ENV NGROK /opt/ngrok ENV DOMAIN ngrok.zhangqi.art //替换你自己的域名 EXPOSE 80 443 4443 59900 COPY ngrok/ngrokd $NGROK/ COPY ngrok/server.crt $NGROK/ssl.crt COPY ngrok/server.key $NGROK/ssl.key COPY ngrok/server.csr $NGROK/ssl.csr COPY run.sh $NGROK/ RUN chmod +x $NGROK/run.sh CMD .$NGROK/run.sh 

其中 run.sh 内容如下:

#!/bin/sh /opt/ngrok/ngrokd -tlsCrt /opt/ngrok/ssl.crt -tlsKey /opt/ngrok/ssl.key -domain "ngrok.zhangqi.art" 

然后在工程目录下执行:

//$REPO_NAME 你的 repo名称 //$TAG 你的镜像 tag docker build -t $REPO_NAME:$TAG . 

不出意外地,镜像 build成功,然后运行镜像:

docker run -d -p 127.0.0.1:8080:80 -p 127.0.0.1:8081:443 -p 4443:4443 -p 59900:59900 $REPO_NAME:$TAG

6、nginx设置反向代理:(*.ngrok.zhangqi.art的请求都代理到 8080端口,而8080端口绑定到了docker容器的80端口上)

server { server_name *.ngrok.zhangqi.art; listen 80; location / { proxy_pass http://127.0.0.1:8080; proxy_redirect off; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } }

7、配置好要启动的域名,启动客户端

#nginx中监听 8090端口 server { charset utf-8; client_max_body_size 128M; listen 8090; ## listen for ipv4 server_name dev.passport.com; root /data/wwwroot/Passport/public; index index.php; location / { try_files $uri $uri/ /index.php$is_args$args; } # uncomment to avoid processing of calls to non-existing static files by Yii #location ~ \.(js|css|png|jpg|gif|swf|ico|pdf|mov|fla|zip|rar)$ { # try_files $uri =404; #} #error_page 404 /404.html; location ~ \.php$ { include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_pass unix:/run/php/php7.2-fpm.sock; } location ~* /\. { deny all; } } 
#ngrok.cfg中 proto 设置8090端口 server_addr: "ngrok.zhangqi.art:4443" trust_host_root_certs: false tunnels: my: subdomain: "my" proto: http: 127.0.0.1:8090

启动客户端:

/ngrok/bin/ngrok -config=./ngrok.cfg start my

ok,成功了

ngrok服务端搭建并使用docker解放80端口插图1

访问项目,打了个断点 1

ngrok服务端搭建并使用docker解放80端口插图2

参考链接:

https://www.jianshu.com/p/bac99dd98c4a
https://www.jianshu.com/p/6f72a7bfb6ec

【end】

原文链接:https://blog.csdn.net/zq199692288/article/details/88379431

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享