為什麼我無法連線至 EC2 執行個體上託管的網站?
我無法連線至 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 執行個體無法連線且無法進行狀態檢查?中的步驟
檢查執行個體是否正確啟動
檢查執行個體的系統日誌中是否有啟動錯誤。
- 如果您看到核心程序危急錯誤,請參閱在升級核心程序或重新啟動 EC2 Linux 執行個體後,為什麼看到「核心程序危急」錯誤?
- 對於其他作業系統錯誤,請參閱如何對由於作業系統出現問題而未能通過執行個體狀態檢查的 EC2 Linux 執行個體進行疑難排解?
檢查執行個體的安全群組和網路 ACL 組態
- 確定執行個體的關聯安全群組和網路 ACL 允許連接埠 80 和 443 上的流量。
- 確定執行個體子網路的路由表中具有連至網際網路閘道的預設路由。
檢查執行個體具有正確的 DNS 組態
- 如果您的網站使用 Route 53 DNS 服務,請檢查您是否已設定正確 DNS 記錄。
- 確定為此執行個體指派了彈性 IP 地址。如果您停止並啟動您的執行個體,Elastic IP 地址仍會與此執行個體關聯。
- 確定將公有 IP 地址或彈性 IP 地址映射至 A 記錄。
檢查 Web 伺服器是否正在執行,且沒有作業系統層級防火牆阻止對連接埠的存取
網路連接埠是通訊端點,各種服務都向其傳送請求。這些請求包括使用者的網站連線請求。Web 伺服器會接聽連接埠 80 中是否有 HTTP 流量,並使用連接埠 443 來接收使用 TLS/SSL 加密的流量。如果 Web 伺服器未執行或防火牆封鎖這些連接埠,則使用者無法連線至您的網站。
若要檢查網站是否在本機執行,請從 EC2 執行個體託管網站中執行下列命令:
curl https://localhost
-或-
curl http://localhost:443
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
相關資訊
相關內容
- 已提問 5 個月前lg...
- 已提問 1 年前lg...
- 已提問 5 個月前lg...
- 已提問 10 個月前lg...
- 已提問 9 個月前lg...
- AWS 官方已更新 8 個月前
- AWS 官方已更新 1 年前
- AWS 官方已更新 7 個月前