非抢占式 Google Compute Engine VM 上的 ngrok

Posted

技术标签:

【中文标题】非抢占式 Google Compute Engine VM 上的 ngrok【英文标题】:ngrok on a non-preemptible Google Compute Engine VM 【发布时间】:2020-10-25 10:38:17 【问题描述】:

我在 GCE VM 上使用 ngrok 观察到一个奇怪的行为。

我使用静态外部 ip 启动了一个“可抢占式”VM 实例,并在其上正常启动 ngrok。我得到了将传入的 https 请求映射到本地主机上的 http 的 URL。我还可以检查隧道,一切正常。我创建了附加到此 VM 的可启动磁盘的快照。我关闭了虚拟机。

然后我创建另一个 GCE VM,它具有完全相同的配置、网络设置(当然具有不同的静态 ip)等,除了我禁用了抢占性。可引导磁盘也是通过上面的快照创建的,因此它是上面抢占式 VM 磁盘的精确副本。我在这台不可抢占的机器上启动 ngrok。 Ngrok没有抱怨什么,它似乎已经开辟了一条隧道。

但是,隧道不起作用。

谁能指出我可能的原因/调查方向?

我已经尝试过没有成功:

    在启动隧道之前登录 ngrok 并使用 ngrok authtoken <token> 重写主机头:ngrok http -host-header=rewrite localhost:3000

【问题讨论】:

【参考方案1】:

我已尝试在我的测试项目上按照您的步骤进行操作,但没有发现任何问题。

请看下面我的步骤:

    创建带有网络标签http-serverhttps-server的VM实例: 创建防火墙规则以允许 HTTP/HTTPS 传入连接:
gcloud compute firewall-rules create default-allow-http --direction=INGRESS --priority=1000 --network=default --action=ALLOW --rules=tcp:80 --source-ranges=0.0.0.0/0 --target-tags=http-server

gcloud compute firewall-rules create default-allow-https --direction=INGRESS --priority=1000 --network=default --action=ALLOW --rules=tcp:443 --source-ranges=0.0.0.0/0 --target-tags=https-server
    安装ngrokphp
instance-8:~$ sudo apt update
instance-8:~$ sudo apt install snapd
instance-8:~$ sudo snap install ngrok
instance-8:~$ sudo apt install php7.2-cli
    ngrok 连接到帐户:
instance-8:~$ ngrok authtoken xxxxxxxxxxxxxxxxxxxxxxxgmfHM
    使用虚拟页面启动嵌入式 php 网络服务器:
instance-8:~$ php -S localhost:8000
PHP 7.2.24-0ubuntu0.18.04.6 Development Server started at Mon Jul  6 17:19:31 2020
Listening on http://localhost:8000
Document root is /home/username
Press Ctrl-C to quit.
    开始ngrok:
instance-8:~$ ngrok http -host-header=rewrite localhost:8000
                                                                                                                                                                              
ngrok by @inconshreveable                                                                                                                                     (Ctrl+C to quit)
                                                                                                                                                                              
Session Status                online                                                                                                                                          
Account                       XXX (Plan: Free)                                                                                                                       
Version                       2.3.35                                                                                                                                          
Region                        United States (us)                                                                                                                              
Web Interface                 http://127.0.0.1:4040                                                                                                                           
Forwarding                    http://1537504102c2.ngrok.io -> http://localhost:8000                                                                                           
Forwarding                    https://1537504102c2.ngrok.io -> http://localhost:8000                                                                                          
                                                                                                                                                                              
Connections                   ttl     opn     rt1     rt5     p50     p90                                                                                                     
                              2       0       0.03    0.01    0.00    0.00                                                                                                    
                                                                                                                                                                              
HTTP Requests                                                                                                                                                                 
-------------                                                                                                                                                                 
                                                                                                                                                                              
GET /favicon.ico               404 Not Found                                                                                                                                  
GET /                          200 OK       
    检查连接,它按预期工作。 根据现有 VM 实例的快照创建新的 VM 实例:
gcloud compute disks snapshot instance-8 --snapshot-names=snapshot-1 --zone=europe-west3-a --storage-location=europe-west3
gcloud compute disks create instance-10 --size=10 --zone=europe-west3-a --source-snapshot=snapshot-1 --type=pd-standard
gcloud compute instances create instance-10 --zone=europe-west3-a --machine-type=e2-medium --tags=http-server,https-server --disk=name=instance-10,device-name=instance-10,mode=rw,boot=yes,auto-delete=yes --reservation-affinity=any
    使用虚拟页面启动嵌入式 php 网络服务器:
instance-10:~$ php -S localhost:8000
PHP 7.2.24-0ubuntu0.18.04.6 Development Server started at Mon Jul  6 17:42:59 2020
Listening on http://localhost:8000
Document root is /home/username
Press Ctrl-C to quit.
    开始ngrok:
instance-10:~$ ngrok http -host-header=rewrite localhost:8000
Your account 'XXX' is limited to 1 simultaneous ngrok client session.
Active ngrok client sessions in region 'us':
  - ts_1eK49pNAq8zIKDN2ikKdCvVhwHz (35.XXX.153.XXX)

ERR_NGROK_108
    instance-8 停止ngrok 并在instance-10 启动它:
instance-10:~$ ngrok http -host-header=rewrite localhost:8000
ngrok by @inconshreveable                                                                          (Ctrl+C to quit)
                                                                                                                   
Session Status                online                                                                               
Account                       XXX (Plan: Free)                                                            
Version                       2.3.35                                                                               
Region                        United States (us)                                                                   
Web Interface                 http://127.0.0.1:4040                                                                
Forwarding                    http://38c2f5d9f673.ngrok.io -> http://localhost:8000                                
Forwarding                    https://38c2f5d9f673.ngrok.io -> http://localhost:8000                               
                                                                                                                   
Connections                   ttl     opn     rt1     rt5     p50     p90                                          
                              4       0       0.34    0.39    0.00    0.00                                         
                                                                                                                   
HTTP Requests                                                                                                      
-------------                                                                                                      
                                                                                                                   
GET /favicon.ico               404 Not Found                                                                       
GET /                          200 OK                                                                              
    检查连接,它按预期工作。

当我在ngrokinstance-10 运行时使用旧链接检查与instance-8 已关闭ngrok 的连接时,我能够重现您的问题:

隧道 1537504102c2.ngrok.io 未找到

当我使用旧链接检查与 instance-10 已关闭 ngrok 的连接时,我得到了相同的结果,而 ngrokinstance-8 上运行。

我认为在您的情况下,ngrok 方面可能存在问题,您应该通过电子邮件contact@ngrok.com 与他们联系。

【讨论】:

以上是关于非抢占式 Google Compute Engine VM 上的 ngrok的主要内容,如果未能解决你的问题,请参考以下文章

ImportError:没有名为 google_compute_engine 的模块

操作系统中抢占式和非抢占式内核的区别

操作系统中抢占式和非抢占式内核的区别

keepalived的抢占与非抢占模式

项目 协程-实现非抢占式TCP服务器

项目 协程-实现非抢占式TCP服务器