Nginx

在 GCE 上使用最簡單的 nginx centos 設置會導致“連接被拒絕”?

  • December 11, 2020

更新

我遵循了與以下相同的步驟,除了提供的通用 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 -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 我的伺服器,它會以預期的 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支持……我正在嘗試使用最簡單的案例來最小化變數,但我仍然發現自己“拒絕當我的網站由Google託管時,通過 IP 或域訪問我的網站時出現“連接”錯誤,當我讓它由其他 2 個提供商託管時,它工作得很好。結論?我一頭霧水……

我可以在您的問題中看到 3 個要點:nodejs 應用程序作為後端,nginx 不在埠 443 上偵聽,以及反向代理配置。讓我們分解它以查看孤立的每個點。

  1. nodejs 應用程序:嘗試從 localhost 訪問它並確認它正在正確回答

捲曲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 e 測試它

  1. 第三點是將 nginx 配置為反向代理,以便通過 HTTPS 公開您的應用程序。我認為上面的配置應該可以工作。如果不是,我建議您從 GoCD 閱讀此文件,該文件準確解釋了這種配置:

配置反向代理

引用自:https://serverfault.com/questions/1045598