為什麼我無法連線至 EC2 執行個體上託管的網站?

4 分的閱讀內容
0

我無法連線至 Amazon Elastic Compute Cloud (Amazon EC2) 執行個體上託管的公有網站。

簡短描述

由於多種原因,EC2 執行個體上執行的網站可能會變得無法連線。若要解決此問題,請確認 EC2 執行個體上的組態設定是否正確。例如,如果您的執行個體無法正確啟動或沒有正確的 DNS 組態,則無法連線至該執行個體上託管的任何網站。

請使用本文中的步驟來檢查 EC2 執行個體的組態設定,並找出此問題的根本原因。

解決方法

**注意:**如您在執行 AWS Command Line Interface (AWS CLI) 命令時收到錯誤,請確定您使用的是最新版本的 AWS CLI

使用適用於 Linux 的 EC2 序列主控台對 Nitro 型執行個體類型進行疑難排解

如果適用於 Linux 的 EC2 序列主控台已開啟,可以用來對支援的 Nitro 型執行個體類型進行疑難排解。您可以使用序列主控台或 AWS CLI 存取序列主控台。使用 EC2 序列主控台時,不需要有效連線即可連線至執行個體。

在使用序列主控台進行疑難排解之前,請執行下列步驟:

  • 在帳戶層級授予對序列主控台的存取權
  • 建立 AWS Identity and Access Management (IAM) 政策,將存取權授予 IAM 使用者
  • 檢查執行個體包含至少一個密碼型使用者

檢查執行個體是否正在執行並且通過兩項狀態檢查

確定在 Amazon EC2 主控台中將此執行個體列為執行中。如果您的執行個體未執行或您遇到其他狀態檢查問題,請執行為什麼我的 EC2 Linux 執行個體無法連線且無法進行狀態檢查?中的步驟

檢查執行個體是否正確啟動

檢查執行個體的系統日誌中是否有啟動錯誤。

檢查執行個體的安全群組和網路 ACL 組態

檢查執行個體具有正確的 DNS 組態

檢查 Web 伺服器是否正在執行,且沒有作業系統層級防火牆阻止對連接埠的存取

網路連接埠是通訊端點,各種服務都向其傳送請求。這些請求包括使用者的網站連線請求。Web 伺服器會接聽連接埠 80 中是否有 HTTP 流量,並使用連接埠 443 來接收使用 TLS/SSL 加密的流量。如果 Web 伺服器未執行或防火牆封鎖這些連接埠,則使用者無法連線至您的網站。

若要檢查網站是否在本機執行,請從 EC2 執行個體託管網站中執行下列命令:

curl https://localhost

-或-

curl http://localhost:443

1.    透過 SSH 從遠端連線至執行個體

2.    檢查 Web 伺服器狀態。

  • 對於 RHEL 或 CentOS 系統,請使用命令 systemctl status httpd 來檢查 Web 伺服器的狀態。此指令會傳回 Web 伺服器處於非作用中狀態的資訊:
$ sudo systemctl status httpd
httpd.service - The Apache HTTP Server
Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled; vendor preset: disabled)
Active: inactive (dead)
  • 對於 Debian 或 Ubuntu 系統,請使用命令 systemctl status httpd 來檢查 Web 伺服器的狀態。Web 伺服器必須正在接聽連接埠 80 或 443。此指令會傳回 Web 伺服器處於非作用中狀態的資訊:
$ sudo systemctl status apache2
apache2.service - The Apache HTTP Server
Loaded: loaded (/lib/systemd/system/apache2.service; enabled; vendor preset: enabled)
Active: inactive (dead)

3.    若要重新啟動 Web 伺服器,請執行下列命令:

  • 對於 REHL 或 CentOS 系統:
$ sudo systemctl restart httpd
  • 對於 Debian 或 Ubuntu 系統,請執行下列命令:
$ sudo systemctl restart apache2

4.    確認 Web 伺服器現在正在執行:

  • 對於 REHL 或 CentOS 系統,請執行下列命令:
$ sudo systemctl status httpd
httpd.service - The Apache HTTP Server
Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled; vendor preset: disabled)
Active: active (running) since Thu 2020-11-19 14:40:15 UTC; 42s ago
  • 對於 Debian 或 Ubuntu 系統,請執行下列命令:
$ sudo systemctl status apache2
apache2.service - The Apache HTTP Server
Loaded: loaded (/lib/systemd/system/apache2.service; enabled; vendor preset: enabled)
Active: active (running)

**注意:**對於執行 SystemV 的較舊 Linux 系統,請執行此命令來檢查 Web 伺服器狀態。
對於 Debian 或 Ubuntu 系統,您必須將 httpd 取代為 apache2

$ sudo service httpd status
httpd is stopped

若要在 SystemV 上重新啟動停止的 Web 伺服器,請執行下列命令:

$ sudo service httpd restart
Stopping httpd:                                            [FAILED]
Starting httpd:                                            [  OK  ]

5.    執行下列命令以確認 Web 伺服器正在接聽連接埠 80 或 443 中是否有來自使用者的傳入連線請求:

  • 對於 REHL 或 CentOS 系統,請執行下列命令:
$ sudo netstat -tulpn | grep httpd
tcp        0      0 :::80                       :::*                        LISTEN      2961/httpd
  • 對於 Debian 或 Ubuntu 系統,請執行下列命令:
$ sudo netstat -tulpn | grep apache2
tcp6       0      0 :::80                   :::*                    LISTEN      2741/apache2

6.    驗證作業系統層級防火牆的狀態。如果發現作用中的防火牆,請確定它允許連接埠 80 和 443 上的請求。

**注意:**如果有多個介面正在執行,請透過執行下列命令確認 Web 伺服器正在接聽所有 IP:

cat /etc/httpd/conf/httpd.conf  | grep Listen

以下是成功輸出的範例:

Listen *:80

-或-

Listen *:443

Amazon Linux、CentOS 和 RHEL

1.    執行下列命令以檢查 iptables 規則是否封鎖連接埠 80 和 443 上的傳入請求:

$ sudo iptables -nvL
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination

2.    執行下列命令,允許連接埠 80 接受傳入的 HTTP 連線請求:

$ sudo iptables -A INPUT -p tcp --dport 80 --syn -m conntrack --ctstate NEW -j ACCEPT

3.    執行下列命令,允許連接埠 443 接受傳入的 HTTPS 連線請求:

$ sudo iptables -A INPUT -p tcp --dport 443 --syn -m conntrack --ctstate NEW -j ACCEPT

Amazon Linux 2023、Amazon Linux 2 和 RHEL 7 及更新版本

1.    執行下列命令以檢查 firewalld 是否正在執行:

$ sudo firewall-cmd --state
running

2.    如果 firewalld 正在執行,請執行下列命令以將其設定為允許連接埠 80 和 443 上的連線。下列範例中的最後一個命令會重新載入服務,以使新規則生效:

$ sudo firewall-cmd --add-service=http --permanent
success
$ sudo firewall-cmd --add-service=https --permanent
success
$ sudo firewall-cmd --reload
success

Debian 和 Ubuntu 伺服器

1.    執行下列命令以檢查 UFW 防火牆:

$ sudo ufw status verbose
Status: active

2.    如果 UFW 正在執行,請使用下列命令允許連接埠 80 和連接埠 443 上的傳入連線請求:

$ sudo ufw allow in 80/tcp
Rule added
Rule added (v6)
$ sudo ufw allow 443/tcp
Rule added
Rule added (v6)

檢查 Web 伺服器存取錯誤日誌中是否有問題。Web 伺服器日誌位於 /var/log。根據您的伺服器組態,此位置可能會變更。以下是預設 Web 伺服器日誌位置:

  • Amazon Linux 和 RHEL:/var/log/httpd
  • Debian 和 Ubuntu:/var/log/apache2

相關資訊

如何對 EC2 執行個體上託管的網站連線速度緩慢進行疑難排解?

AWS 官方
AWS 官方已更新 2 年前