為什麼我無法連線到託管在 EC2 執行個體上的網站?
我無法連線到託管在 Amazon Elastic Compute Cloud (Amazon EC2) 執行個體上的公有網站。
簡短描述
若要解決無法存取的網站問題,請確認您是否正確設定了 EC2 執行個體的網站設定。執行個體上的 Web 伺服器設定不正確,會導致無法存取其上託管的所有網站。
解決方法
確認執行個體是否正在執行,並通過了兩個狀態檢查
請檢查 Amazon EC2 主控台,以確認該執行個體是否正在執行。若要對狀態檢查問題進行疑難排解,請參閱為什麼我的 EC2 Linux 執行個體無法連線且狀態檢查失敗?
此外,請使用執行個體主控台輸出和執行個體的螢幕截圖,檢查執行個體是否已正確啟動。
檢查執行個體的安全群組和網路 ACL 組態
確認下列執行個體組態:
- 關聯的安全群組和網路存取控制清單 (網路 ACL) 允許連接埠 80 和 443 上的流量。
- 執行個體子網路中的路由表具有到網際網路閘道的預設路由。
確認網站是否具有正確的 DNS 設定
確認您網站的以下 DNS 組態:
- 如果網站使用 Amazon Route 53 DNS 服務,則您已正確設定 DNS 記錄。
- 您為此執行個體指派了彈性 IP 位址。
**注意:**即使您停止並啟動執行個體,彈性 IP 位址仍然與該執行個體相關聯。 - 您已將公用 IP 位址或彈性 IP 位址對應到 A 記錄。
確認 Web 伺服器是否正在運行,並且沒有作業系統防火牆阻止對連接埠的存取
若要檢查您的網路連接埠組態和 Web 伺服器,請完成下列步驟:
-
使用 SSH 或 Session Manager (AWS Systems Manager 的一項功能) 連線到該執行個體。如果您無法使用 SSH 或 Session Manager 連線至根據 AWS Nitro System建置的執行個體,請使用 EC2 序列主控台。
-
若要檢查網站是否在本機執行,請從 EC2 執行個體託管網站中執行下列命令:
curl https://localhost
- 或 -
curl http://localhost:443
**注意:**如果您在使用 curl 時遇到問題,請檢查執行個體的 Web 伺服器和應用程式組態是否有問題。
-
若要檢查 Web 伺服器服務狀態,請根據您執行的作業系統 (OS) 執行下列命令。
Red Hat Enterprise Linux (RHEL)、CentOS、Fedora 與 Amazon Linux:sudo systemctl status httpd.service
輸出範例:
The Apache HTTP Server Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled; vendor preset: disabled) Active: inactive (dead)
Debian 和 Ubuntu:
sudo systemctl status apache2.service
輸出範例:
The Apache HTTP Server Loaded: loaded (/lib/systemd/system/apache2.service; disabled; vendor preset: disabled) Active: inactive (dead)
在命令輸出中,檢查**非作用中 (死亡) **狀態。
如果您的 Linux 系統執行 System V,請執行下列命令來檢查 Web 伺服器狀態:sudo service httpd status
**注意:**如果您執行的是 Debian 或 Ubuntu,請將 httpd 替換為 apache2。
輸出範例:httpd is stopped
-
若要啟動 Web 伺服器並將服務設定為在啟動時啟動,請根據您的作業系統執行以下命令:
RHEL、CentOS、Fedora 和 Amazon Linux:sudo systemctl start httpd; sudo systemctl enable httpd
Debian 或 Ubuntu:
sudo systemctl start apache2; sudo systemctl enable apache2
-
若要確認 Web 伺服器服務是否正在執行並啟動,請根據您的作業系統執行以下命令:
RHEL、CentOS、Fedora 和 Amazon Linux:sudo systemctl status httpd.service
輸出範例:
The Apache HTTP ServerLoaded: loaded (/usr/lib/systemd/system/httpd.service; enabled; vendor preset: disabled) Active: active (running)
Debian 或 Ubuntu:
sudo systemctl status apache2.service
輸出範例:
The Apache HTTP ServerLoaded: loaded (/lib/systemd/system/apache2.service; enabled; vendor preset: enabled) Active: active (running)
若要為在 System V 上執行的系統啟動已停止的 Web 伺服器服務,請執行下列命令:
sudo service httpd start
輸出範例:
Starting httpd: [ OK ]
-
若要確認 Web 伺服器是否正在接聽傳入使用者連線請求,請執行下列命令:
sudo netstat -tulpn|grep -i :80 tcp6 0 0 :::80 :::* LISTEN 11993/httpd
**注意:**執行上述命令兩次。第二次,將 80 替換為 443。Web 伺服器在連接埠 80 上接聽 HTTP 流量,在連接埠 443 上接聽使用 TLS/SSL 加密的流量。
如果您執行多個介面,請執行下列命令來確認 Web 伺服器是否正在接聽所有 IP 位址:cat /etc/httpd/conf/httpd.conf | grep Listen
輸出範例:
Listen *:80
Listen *:443
-
如果您使用作業系統防火牆,請確認它允許連接埠 80 和 443 上的請求。
-
(選用) 若要確認 iptables 規則是否允許連接埠 80 和 443 上的傳入請求,請執行下列命令:
sudo iptables -vnL
輸出範例:
Chain INPUT (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination 35 10863 ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED 0 0 ACCEPT icmp -- * * 0.0.0.0/0 0.0.0.0/0 0 0 ACCEPT all -- lo * 0.0.0.0/0 0.0.0.0/0 0 0 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:22 0 0 REJECT all -- * * 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
在上述輸出範例中,規則僅允許網際網路控制訊息通訊協定 (ICMP)、localhost 和連接埠 22/TCP (SSH)。這些規則會封鎖到 TCP 連接埠 80 或 443 的傳入連線。
-
若要設定 iptables 規則以允許連接埠 80 和 443 接受傳入 HTTP 和 HTTPS 連線請求,請執行下列命令:
iptables -I INPUT -p tcp --match multiport --dports 80,443 -j ACCEPT
輸出範例:
Chain INPUT (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination 0 0 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 multiport dports 80,443 486 104K ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED 0 0 ACCEPT icmp -- * * 0.0.0.0/0 0.0.0.0/0 0 0 ACCEPT all -- lo * 0.0.0.0/0 0.0.0.0/0 0 0 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:22 0 0 REJECT all -- * * 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
檢查 AL2023、AL2 和 RHEL 7 及更新版本的組態
對於 Amazon Linux 2023 (AL2023)、Amazon Linux 2 (AL2) 和 RHEL 執行個體,請執行下列命令來檢查 firewalld 服務是否正在執行:
sudo firewall-cmd --state
輸出範例:
running
如果 firewalld 服務正在執行,請執行下列命令以允許 TCP 連接埠 80 和 443 上的連線:
sudo firewall-cmd --add-service=http --permanent
sudo firewall-cmd --add-service=https --permanent
sudo firewall-cmd --reload
**注意:**如果您先前新增了規則,則 reload 命令會重新載入服務並使規則生效。
對於每個命令,請確認輸出是否類似於以下範例:
success
檢查 Debian 和 Ubuntu 伺服器的組態
請完成下列步驟:
-
若要檢查簡單防火牆 (UFW),請執行以下命令:
sudo ufw status verbose
輸出範例:
Status: active
-
如果您正在執行 UFW,請使用以下命令允許所需 TCP 連接埠上的傳入連線請求:
TCP 連接埠 80:sudo ufw allow in 80/tcp
TCP 連接埠 443:
sudo ufw allow 443/tcp
-
對於每個命令,請確認輸出是否類似於以下範例:
Rule added Rule added (v6)
若要進一步進行疑難排解,請檢查 /var/log 上的 Web 伺服器存取錯誤日誌以尋找問題。使用以下預設 Web 伺服器日誌位置:
- 若是 Amazon Linux 和 RHEL,請使用 /var/log/httpd。
- 若是 Debian 和 Ubuntu,請使用 /var/log/apache2。
注意: Web 伺服器記錄位置取決於您的伺服器組態。
相關資訊
相關內容
- 已提問 9 個月前
- 已提問 2 年前
- 已提問 1 年前