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

4 分钟阅读
0

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

简短描述

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

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

解决方法

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

使用适用于 Linux 的 EC2 Serial Console 排查基于 Nitro 的实例类型问题

如果您已为 Linux 启用 EC2 Serial Console,则可以使用它来排查受支持的基于 Nitro 的实例类型的问题。您可以使用串行控制台或 AWS CLI 来访问串行控制台。使用 EC2 Serial Console 时,您不需要有效的连接即可连接到您的实例。

在使用串行控制台进行问题排查之前,请先执行以下操作:

  • 在账户级别授予对串行控制台的访问权限
  • 创建 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.    检查 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 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

相关信息

如何对 EC2 实例上托管的网站的连接缓慢问题进行排查?

相关视频

AWS 官方
AWS 官方已更新 10 个月前