如何对 EC2 实例上托管的无响应网站进行故障排除?

上次更新时间:2021 年 5 月 6 日

我无法连接到托管在 Amazon Elastic Compute Cloud(Amazon EC2)实例上的公共网站。如何解决此问题?

简短描述

由于多种原因,在 EC2 实例上运行的网站可能无法访问。检查以下内容以确保实例上的配置设置正确:

  • 验证实例正在运行并通过两种状态检查。
  • 验证实例正确启动。
  • 验证实例的安全组和网络访问控制列表 (ACL) 配置。
  • 验证实例具有正确的 DNS 配置。
  • 验证 Web 服务器正在运行,并且没有操作系统级防火墙阻挡对端口的访问。

注意:如果您已为 Linux 启用 EC2 串行控制台,可以使用它来排查受支持的基于 Nitroa 的实例类型问题。串行控制台可帮助您排查启动问题、网络配置和 SSH 配置问题。串行控制台无需网络连接即可连接到您的实例。您可以使用 Amazon EC2 控制台或 AWS 命令行界面 (AWS CLI) 访问串行控制台。

在使用串行控制台之前,请在账户层面授予对串行控制台的访问权限。然后,创建 AWS Identity and Access Management(IAM)策略,授予对 IAM 用户的访问权限。此外,每个使用串行控制台的实例都必须至少包含一个基于密码的用户。如果您的实例无法访问,并且尚未配置对串行控制台的访问权限,请按照方法 2、3 或 4 中的说明进行操作。有关为 Linux 配置 EC2 串行控制台的信息,请参阅配置对 EC2 串行控制台的访问权限

注意:如果在运行 AWS CLI 命令时遇到错误,请确保您使用的是最新版本的 AWS CLI

解决方法

验证实例正在运行并通过两种状态检查

确保该实例在 Amazon EC2 控制台中列为正在运行状态。

有关解决状态检查问题的信息,请参阅为什么我的 EC2 Linux 实例无法访问,并且无法通过一项或两项状态检查?

验证实例正确启动

验证实例的安全组和网络 ACL 配置

验证实例具有正确的 DNS 配置

验证 Web 服务器正在运行,并且没有操作系统级防火墙阻挡对端口的访问

网络端口是各种服务向其发送请求的通信终端节点。这些请求包括用户的网站连接请求。Web 服务器通常在端口 80 上侦听 HTTP 流量,并将端口 443 用于使用 TLS/SSL 加密的流量。如果 Web 服务器未运行,或防火墙屏蔽了这些端口,则用户将无法连接到您的网站。

1.    通过 SSH 远程连接到实例

2.    运行 systemctl status httpd 命令以验证 Web 服务器的状态。Web 服务器必须在端口 80 或端口 443 上侦听。在以下示例中,该命令返回 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)

3.    要重新启动 Web 服务器,请运行以下命令:

$ sudo systemctl restart  httpd

4.    运行以下命令以验证 Web 服务器现在正在运行:

$ 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

注意:对于运行 SystemV 的旧版 Linux 系统,请使用以下命令验证 Web 服务器状态:

$ sudo service httpd status
httpd is stopped

要在 SystemV 上重新启动已停止的 Web 服务器,请使用以下命令:

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

5.    运行以下命令以确认 Web 服务器在端口 80 或 443 上侦听来自用户的传入连接请求:

$ sudo netstat -tulpn | grep httpd
tcp        0      0 :::80                       :::*                        LISTEN      2961/httpd

6.    验证操作系统级防火墙的状态。如果找到活动防火墙,请确保它允许端口 80 和 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 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

这篇文章对您有帮助吗?


您是否需要账单或技术支持?