为什么无法连接到托管在 EC2 实例上的网站?
无法连接到托管在 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? 中的步骤进行操作。
检查实例是否正确启动
检查实例的系统日志是否包含启动错误。
- 如果看到内核崩溃错误,请参阅 Why do I see a "Kernel panic" error after I upgrade the kernel or reboot my EC2 Linux instance?
- 有关其他操作系统错误,请参阅 How do I troubleshoot an EC2 Linux instance that failed the instance status check due to operating system issues?
检查实例的安全组和网络 ACL 配置
- 确保实例的关联安全组和网络 ACL 允许端口 80 和 443 上的流量。
- 确保实例子网的路由表具有通往互联网网关的默认路由。
检查实例的 DNS 配置是否正确
- 如果您的网站使用 Route 53 DNS 服务,请检查您是否正确配置了 DNS 记录。
- 确保为该实例分配了弹性 IP 地址。如果停止并启动您的实例,则弹性 IP 地址仍与该实例关联。
- 确保将公有 IP 地址或弹性 IP 地址映射到 A 记录。
检查 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
相关信息
相关内容
- AWS 官方已更新 1 年前
- AWS 官方已更新 1 年前
- AWS 官方已更新 8 个月前