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

4 分钟阅读
0

无法连接到托管在 Amazon Elastic Compute Cloud(Amazon EC2)实例上的公共网站。

简短描述

EC2 实例上运行的网站可能由于多种原因而变得无法访问。若要解决此问题,请确认 EC2 实例上的配置设置是否正确。例如,如果实例未正确启动或其 DNS 配置不正确,则无法连接到该实例上托管的任何网站。

请使用本文中的步骤检查 EC2 实例的配置设置并找出此问题的根本原因。

解决方案

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

使用适用于 Linux 的 EC2 Serial Console 对基于 Nitro 的实例类型进行故障排除

如果启用了适用于 Linux 的 EC2 Serial Console,则可以将其用于对受支持的基于 Nitro 的实例类型进行故障排除。您可以使用串行控制台或者 AWS CLI 访问串行控制台。当您使用 EC2 Serial Console 时,无需有效的连接即可连接到您的实例。

在使用串行控制台(serial console)进行故障排除之前,请按照以下步骤进行操作:

  • 在账户级别授予对串行控制台的访问权限
  • 创建 AWS Identity and Access Management (IAM)策略,授予对 IAM 用户的访问权限
  • 检查实例是否至少包含一个基于密码的用户

检查实例是否正在运行并通过两项状态检查

确保该实例在 Amazon EC2 控制台中列为正在运行。如果实例未运行或者您遇到其他状态检查问题,请按照 Why is my EC2 Linux instance unreachable and failing its status checks? 中的步骤进行操作。

检查实例是否正确启动

检查实例的系统日志是否包含启动错误。

检查实例的安全组和网络 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 年前