【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】
(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 5000cp 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 ipv4server_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,成功了
访问项目,打了个断点 1
参考链接:
https://www.jianshu.com/p/bac99dd98c4a
https://www.jianshu.com/p/6f72a7bfb6ec
【end】
原文链接:http://www.taodudu.cc/news/show-3354687.html