Complete a 3 Question Survey and Earn a re:Post Badge
Help improve AWS Support Official channel in re:Post and share your experience - complete a quick three-question survey to earn a re:Post badge!
为什么无法连接到托管在 EC2 实例上的网站?
无法连接到托管在 Amazon Elastic Compute Cloud(Amazon EC2)实例上的公共网站。
简短描述
要解决网站无法访问的错误,请检查您的 EC2 实例上的配置设置是否正确。例如,如果实例的 DNS 配置不正确,则您将无法连接到该实例上托管的任何网站。
解决方法
**注意:**如果您在运行 AWS 命令行界面 (AWS CLI) 命令时收到错误,请参阅 AWS CLI 错误故障排除。此外,请确保您使用的是最新版本的 AWS CLI。
使用 SSH 或 SSM 会话管理器连接到实例。如果这两种方法都不可用,请使用 EC2 Serial Console 连接到基于 Nitro 系统构建的实例。
检查实例是否正在运行且通过了两项状态检查
确保实例在 Amazon EC2 控制台中处于正在运行状态。如果您遇到状态检查问题,请按照“为什么我的 EC2 Linux 实例无法访问并且其状态检查失败?”中的步骤进行操作检查实例是否正确启动。有关详细信息,请参阅实例控制台输出或捕获无法访问的实例的屏幕截图。
检查实例的系统日志中是否存在启动错误。
使用以下方法检查是否存在启动错误:
- 如果您收到内核崩溃错误,请参阅如何解决 EC2 实例的“Kernel panic - not syncing”(内核崩溃 - 未同步)错误?
- 有关其他操作系统错误,请参阅如何对因操作系统问题而未能通过实例状态检查的 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
**注意:**如果您在使用 curl 时遇到问题,请检查实例的 Web 托管服务器是否存在问题。此外,请检查实例中的应用程序配置。
使用 SSH、SSM 会话管理器或 EC2 Serial Console 连接到您的实例。 -
检查 Web 服务器的服务状态。
对于 RHEL、CentOS、Fedora 和 Amazon Linux 系统,运行 systemctl status httpd 命令来检查 Web 服务器的状态。该命令会返回 Web 服务器处于非活动状态的信息:$ sudo systemctl status 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 apache2 命令来检查 Web 服务器的状态。Web 服务器必须侦听端口 80 或者 443。该命令会返回 Web 服务器处于非活动状态的信息:
$ sudo systemctl status apache2.service The Apache HTTP ServerLoaded: loaded (/lib/systemd/system/apache2.service; disabled; vendor preset: disabled) Active: inactive (dead)
-
要启动 Web 服务器并激活服务,使其在服务器启动时启动,请运行以下命令:
对于 RHEL、CentOS、Fedora 和 Amazon Linux 系统:$ sudo systemctl start httpd; sudo systemctl enable httpd
对于 Debian 或 Ubuntu 系统:
$ sudo systemctl start apache2; sudo systemctl enable apache2
-
验证 Web 服务器服务是否正在运行且已激活:
对于 RHEL、CentOS、Fedora 和 Amazon Linux 系统,运行以下命令:$ sudo systemctl status httpd.service The Apache HTTP ServerLoaded: loaded (/usr/lib/systemd/system/httpd.service; enabled; vendor preset: disabled)Active: active (running)
对于 Debian 或 Ubuntu 系统,运行以下命令:
$ sudo systemctl status apache2.service The Apache HTTP ServerLoaded: loaded (/lib/systemd/system/apache2.service; enabled; vendor preset: enabled)Active: active (running)
**注意:**对于运行 SystemV 的 Linux 系统,请运行以下命令来检查 Web 服务器的状态。
对于 Debian 或 Ubuntu 系统,必须将 httpd 替换为 apache2:$ sudo service httpd statushttpd is stopped
要在 SystemV 上启动已停止的 Web 服务器服务,请运行以下命令:
$ sudo service httpd start Starting httpd: [ OK ]
-
要确认 Web 服务器是否正在侦听端口 80 或 443 上来自用户的传入连接请求,请运行以下命令:
$ sudo netstat -tulpn | grep -iP 'httpd|apache2' tcp 0 0 :::80 :::* LISTEN 2961/httpd
**注意:**如果有多个接口正在运行,请确认 Web 服务器是否正在侦听所有 IP 地址,然后运行以下命令:
cat /etc/httpd/conf/httpd.conf | grep Listen
以下是示例输出:
Listen *:80
-或-
Listen *:443
-
验证操作系统级别防火墙的状态。如果发现活动防火墙,请确保其允许端口 80 和 443 上的请求。
(可选)要检查 iptables 规则是否会阻止端口 80 和 443 上的传入请求,请运行以下命令:$ sudo iptables -vnL Chain INPUT (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination 35 10863 ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED 0 0 ACCEPT icmp -- * * 0.0.0.0/0 0.0.0.0/0 0 0 ACCEPT all -- lo * 0.0.0.0/0 0.0.0.0/0 0 0 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:22 0 0 REJECT all -- * * 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
上述 IPtables 命令的输出显示,仅允许 ICMP、本地主机和端口 22/TCP (SSH) 上的传入请求。这意味着到端口 80/TCP 和 443/TCP 的入站连接将被阻止或拒绝。
要允许端口 80 和 443 接受传入的 HTTP 和 HTTPS 连接请求,请运行以下命令:$ iptables -I INPUT -p tcp --match multiport --dports 80,443 -j ACCEPT
以下输出显示多端口规则已添加到 Web 服务器服务端口 80/TCP 和 443/TCP。
Chain INPUT (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination 0 0 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 multiport dports 80,443 486 104K ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED 0 0 ACCEPT icmp -- * * 0.0.0.0/0 0.0.0.0/0 0 0 ACCEPT all -- lo * 0.0.0.0/0 0.0.0.0/0 0 0 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:22 0 0 REJECT all -- * * 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
对于 Amazon Linux 2023、Amazon Linux 2 和 RHEL 7 及更高版本
要确认 firewalld 服务是否正在运行,请运行以下命令:
$ sudo firewall-cmd --staterunning
如果 firewalld 服务正在运行,请运行以下命令,以允许通过端口 80/TCP 和 443/TCP 进行连接。示例中的最后一个命令会重新加载服务,以使新添加的规则生效:
$ sudo firewall-cmd --add-service=http --permanent success $ sudo firewall-cmd --add-service=https --permanent success $ sudo firewall-cmd --reload success
对于 Debian 和 Ubuntu 服务器
完成以下步骤:
-
要检查是否存在简单防火墙 (UFW),请运行以下命令:
$ sudo ufw status verbose Status: active
-
如果 UFW 正在运行,请使用以下命令来允许传入连接请求通过端口 80/TCP 和端口 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
**注意:**Web 服务器日志的位置取决于您的服务器配置。