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

4 分钟阅读
0

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

简短描述

要解决网站无法访问的错误,请检查您的 EC2 实例上的配置设置是否正确。例如,如果实例的 DNS 配置不正确,则您将无法连接到该实例上托管的任何网站。

解决方法

**注意:**如果您在运行 AWS 命令行界面 (AWS CLI) 命令时收到错误,请参阅 AWS CLI 错误故障排除。此外,请确保您使用的是最新版本的 AWS CLI

使用 SSHSSM 会话管理器连接到实例。如果这两种方法都不可用,请使用 EC2 Serial Console 连接到基于 Nitro 系统构建的实例。

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

确保实例在 Amazon EC2 控制台中处于正在运行状态。如果您遇到状态检查问题,请按照“为什么我的 EC2 Linux 实例无法访问并且其状态检查失败?”中的步骤进行操作检查实例是否正确启动。有关详细信息,请参阅实例控制台输出捕获无法访问的实例的屏幕截图

检查实例的系统日志中是否存在启动错误。

使用以下方法检查是否存在启动错误:

检查实例的安全组和网络 ACL 配置

使用以下方法检查您的实例的配置:

检查实例的 DNS 配置是否正确

使用以下方法检查您的实例的配置:

检查 Web 服务器是否正在运行,并且没有操作系统级别的防火墙阻止访问端口

网络端口是各种服务向其发送请求的通信端点。这些请求包括用户的网站连接请求。Web 服务器侦听端口 80 上的 HTTP 流量,使用端口 443 侦听通过 TLS/SSL 加密的流量。如果 Web 服务器未运行或者防火墙阻止了这些端口,则用户将无法连接到您的网站。完成以下步骤:

  1. 要检查网站是否在本地运行,请从 EC2 实例托管网站运行以下命令:

    curl https://localhost

    -或-

    curl http://localhost:443

    **注意:**如果您在使用 curl 时遇到问题,请检查实例的 Web 托管服务器是否存在问题。此外,请检查实例中的应用程序配置。
    使用 SSH、SSM 会话管理器或 EC2 Serial Console 连接到您的实例

  2. 检查 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)
  3. 要启动 Web 服务器并激活服务,使其在服务器启动时启动,请运行以下命令:
    对于 RHEL、CentOS、Fedora 和 Amazon Linux 系统:

    $ sudo systemctl start httpd; sudo systemctl enable httpd

    对于 Debian 或 Ubuntu 系统:

    $ sudo systemctl start apache2; sudo systemctl enable apache2
  4. 验证 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  ]
  5. 要确认 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
  6. 验证操作系统级别防火墙的状态。如果发现活动防火墙,请确保其允许端口 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 服务器

完成以下步骤:

  1. 要检查是否存在简单防火墙 (UFW),请运行以下命令:

    $ sudo ufw status verbose
    Status:  active
  2. 如果 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 服务器日志的位置取决于您的服务器配置。

相关信息

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

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