为什么我无法连接到托管在我的 EC2 实例上的网站?

上次更新日期:2022 年 5 月 16 日

我无法连接到托管在 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.    运行 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 上的请求。

注意:如果有多个接口在运行,请运行以下命令确认 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 2 和 RHEL 7 及更高版本:

1.    运行以下命令检查防火墙是否正在运行:

$ 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

这篇文章对您有帮助吗?


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