在 GCE 上,使用最简单的 nginx centos 设置时什么会导致“连接被拒绝”?

在 GCE 上,使用最简单的 nginx centos 设置时什么会导致“连接被拒绝”?

更新

我按照下面相同的步骤操作,但使用的是提供的通用 VPS(不是 Google),并且它按预期工作,包括未列出的步骤,例如使用 Certbot 启用 HTTPS...所以我的推测是 GCE 中有一些我误解/误用/没有执行的特殊配置,这导致了下面描述的问题。 你知道 GCE 中可能是什么吗?

设置

我有一个安装了 Debian 的 Google Cloud Compute Engine 实例。在设置此 GCE 实例期间,我默认通过提供的 GCE 防火墙选项允许 HTTP 和 HTTPS 流量。我通过 SSH 进入 GCE 实例并执行以下操作:

GCE http/https 权限授予的屏幕截图GCE 允许交通的证据

1.)安装 nginx 和 ufw

sudo apt install nginx ufw

2.)启用 UFW 规则以允许 HTTP、HTTPS 和 SSH 连接

sudo ufw allow (http/https/ssh)
sudo systemctl enable ufw
sudo systemctl start ufw

3.)启用 nginx,保留默认配置

sudo systemctl enable nginx
sudo nginx -t ( returned "ok" results )
sudo systemctl start nginx

4.)确保我的域名指向正确的 IP

测试

卷曲测试

当我访问域名时,仍然会收到“domain.com 拒绝连接”错误如果我执行

curl localhost

我得到了预期的默认内容如果我输入

Netstat 检查

netstat -a

我可以看到我正在通过正确的端口监听外界的声音

tcp        0      0 0.0.0.0:http            0.0.0.0:*               LISTEN     
tcp        0      0 0.0.0.0:ssh             0.0.0.0:*               LISTEN  

UFW 检查

如果我检查防火墙规则,我会看到以下内容

sudo ufw status
SSH                        ALLOW       Anywhere                  
224.0.0.251 mDNS           ALLOW       Anywhere                  
22                         ALLOW       Anywhere                  
80                         ALLOW       Anywhere                  
443                        ALLOW       Anywhere                  
3000                       ALLOW       Anywhere                  
SSH (v6)                   ALLOW       Anywhere (v6)             
ff02::fb mDNS              ALLOW       Anywhere (v6)             
22 (v6)                    ALLOW       Anywhere (v6)             
80 (v6)                    ALLOW       Anywhere (v6)             
443 (v6)                   ALLOW       Anywhere (v6)             
3000 (v6)                  ALLOW       Anywhere (v6)  

我相信这表明我的端口已正确打开。

Ping 检查

我可以通过域名 ping 我的服务器并且它会正确返回预期的 IP。

Pinging FizzBuzz.app [cor.rec.t.IP] with 32 bytes of data:
Reply from cor.rec.t.IP: bytes=32 time=33ms TTL=57
Reply from cor.rec.t.IP: bytes=32 time=33ms TTL=57
Reply from cor.rec.t.IP: bytes=32 time=33ms TTL=57
Reply from cor.rec.t.IP: bytes=32 time=34ms TTL=57

Ping statistics for cor.rec.t.IP:
    Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
    Minimum = 33ms, Maximum = 34ms, Average = 33ms

日志检查

当我访问 /var/log/nginx/error.log 时,它是空的(访问域名后出现失败结果)

当我访问 /var/log/nginx/access.log 时,它有一个条目,用于检查“curl localhost”是否有效(它确实有效)

据我所知,nginx 没有显示任何错误。

结论

截至目前,除了直接向 Google 支持部门付费之外,我已经用尽了所有可能的途径来解决这个问题……我试图使用最简单的用例来尽量减少变量,但当我通过 IP 或域访问由 Google 托管的网站时,仍然会发现“拒绝连接”错误,而当我由其他 2 个提供商托管时,它运行正常。结论?我很困惑……

答案1

我发现您的问题主要有 3 个要点:nodejs 应用作为后端、nginx 未监听端口 443 以及反向代理配置。让我们逐一分析每个要点。

  1. nodejs 应用程序:尝试从本地主机访问它并确认它能正确响应

卷曲http://127.0.0.1/3000

  1. nginx 没有监听端口 443:您必须在 nginx 上为此配置一个服务器块,并且从 HTTP 重定向到 HTTPS 也是一个好主意:
server {
    listen 80 default_server;
    server_name fizzbuzz.app www.fizzbuzz.app;
    return 301 https://fizzbuzz.app$request_uri;
}


server {
    listen 8443 ssl;
    server_name fizzbuzz.app www.fizzbuzz.app;

    index index.html index.htm;

    access_log /var/log/nginx/fizzbuzz-access.log;
    error_log /var/log/nginx/fizzbuzz-error.log error;

     location / {
        proxy_pass http://127.0.0.1:3000;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_set_header Host $host;
        proxy_cache_bypass $http_upgrade;
     }

    ssl_certificate     /etc/ssl/certs/fizzbuzz.app-fullchain.pem;
    ssl_certificate_key /etc/ssl/private/fizzbuzz.app.key;
}

为了颁发证书,我建议您使用 certbot 或一个 ACME 脚本。

例如,使用 acme.sh,您可以使用以下命令颁发证书:

/root/.acme.sh/acme.sh --issue --nginx -d fuzzbuzz.app -d www.fuzzbuzz.ap

/root/.acme.sh/acme.sh --install-cert -d fuzzbuzz.app -d www.fuzzbuzz.app \
--cert-file /etc/ssl/certs/fuzzbuzz.app.crt \
--key-file /etc/ssl/certs/fuzzbuzz.app.key \
--fullchain-file ${CERTS_DIR}/fuzzbuzz.app-fullchain.pem \
--log /var/log/acme_log \
--reloadcmd "systemctl restart nginx"

颁发证书并将其放置到位后,重新启动 nginx 并进行测试

  1. 第三点是将 nginx 配置为反向代理,以便通过 HTTPS 公开您的应用程序。我认为上述配置应该可以工作。如果不行,我建议您阅读 GoCD 的这份文档,其中准确解释了这种配置:

配置反向代理

答案2

我想到了!!!

.APP!一直以来都是 .app TLD!!!

我正要去购买一个随机域名,为评论者提供名称和 IP,我选择了一个 .app 域名只是为了好玩(为这次测试想了一个愚蠢的名字),然后我看到了这样一段话:“.APP 是一个安全的命名空间。您现在可以购买 Foobarington.app,但需要 SSL 证书才能连接网站。了解有关安全命名空间以及如何获取 SSL 证书的更多信息

所以!当我尝试将我的 .app 域指向服务器时,它无法加载,因为那时我的服务器没有 SSL 证书。我打算使用 CertBot 来获取证书,但他们最初需要 http 访问权限才能执行自动证书授予操作。

我需要弄清楚如何让 Certbot(或等效解决方案)使用此 TLD 类型和主机为我运行,但肯定是我拥有的 TLD 类型导致了这个问题!

相关内容