为什么我无法连接到托管在我的 EC2 实例上的网站?
我无法连接到托管在 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 实例无法访问并且其中一项或两项状态检查均未通过?中的操作
检查实例是否正确启动
检查实例的系统日志中有无启动错误。
- 如果您发现内核崩溃错误,请参阅在升级内核或尝试重启 EC2 Linux 实例后,我收到“内核崩溃”错误。如何修复此问题?
- 对于其他操作系统错误,请参阅因操作系统问题,我的 EC2 Linux 实例的实例状态检查失败。如何排查此问题?
检查实例的安全组和网络 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 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
相关信息
相关内容
- 已提问 4 个月前lg...
- 已提问 3 个月前lg...
- 已提问 19 天前lg...
- 已提问 21 天前lg...
- AWS 官方已更新 1 年前
- AWS 官方已更新 1 年前
- AWS 官方已更新 2 年前