跳至内容

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

4 分钟阅读
0

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

简短描述

要解决无法访问的网站问题,请验证您是否正确配置了 EC2 实例的网站配置。您的实例上的 Web 服务器设置不正确,会阻止访问该实例上托管的所有网站。

解决方法

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

检查 Amazon EC2 控制台以验证该实例是否正在运行。要对状态检查问题进行故障排除,请参阅为什么我的 EC2 Linux 实例无法访问并且其状态检查失败?

此外,使用实例控制台输出实例的屏幕截图检查实例是否正确启动。

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

验证以下实例配置:

验证网站的 DNS 配置是否正确

验证您网站的以下 DNS 配置:

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

要检查您的网络端口配置和 Web 服务器,请完成以下步骤:

  1. 使用 SSH会话管理器(AWS Systems Manager 的一项功能)连接到实例。如果您无法使用 SSH 或会话管理器连接到基于 AWS Nitro System 构建的实例,请使用 EC2 Serial Console

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

    curl https://localhost

    -或-

    curl http://localhost:443

    **注意:**如果您在使用 curl 时遇到问题,请检查实例的 Web 服务器和应用程序配置是否存在问题。

  3. 要检查 Web 服务器服务状态,请根据您运行的操作系统 (OS) 运行以下命令。
    Red Hat Enterprise Linux (RHEL)、CentOS、Fedora 和 Amazon Linux:

    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:

    sudo systemctl status apache2.service

    输出示例:

    The Apache HTTP Server
    Loaded: loaded (/lib/systemd/system/apache2.service; disabled; vendor
    preset: disabled)
    Active: inactive (dead)

    在命令输出中,检查**非活动(失效)**状态。
    如果您的 Linux 系统运行 System V,请运行以下命令来检查 Web 服务器状态:

    sudo service httpd status

    **注意:**如果您运行 Debian 或 Ubuntu,请将 httpd 替换为 apache2
    输出示例:

    httpd is stopped
  4. 要启动 Web 服务器并使服务在服务器启动时启动,请根据您的操作系统运行以下命令:
    RHEL、CentOS、Fedora 和 Amazon Linux:

    sudo systemctl start httpd; sudo systemctl enable httpd

    Debian 或 Ubuntu:

    sudo systemctl start apache2; sudo systemctl enable apache2
  5. 要验证 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)

    要为在 System V 上运行的系统启动已停止的 Web 服务器服务,请运行以下命令:

    sudo service httpd start

    输出示例:

    Starting httpd:                                            [  OK  ]
  6. 要确认 Web 服务器是否正在侦听入站用户连接请求,请运行以下命令:

    sudo netstat -tulpn|grep -i :80
    tcp6       0      0 :::80                   :::*                    LISTEN      11993/httpd

    **注意:**运行前面的命令两次。第二次,将 80 替换为 443。Web 服务器侦听端口 80 上的 HTTP 流量以及端口 443 上通过 TLS/SSL 加密的流量。
    如果您运行多个接口,请运行以下命令以确认 Web 服务器是否正在侦听所有 IP 地址:

    cat /etc/httpd/conf/httpd.conf  | grep Listen

    输出示例:

    Listen *:80
    Listen *:443
  7. 如果使用操作系统防火墙,请确保其允许端口 80 和 443 上的请求。

  8. (可选)要验证 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

    在前面的输出示例中,规则仅允许互联网控制消息协议 (ICMP)、本地主机和端口 22/TCP (SSH)。这些规则阻止与 TCP 端口 80 或 443 的入站连接。

  9. 要配置 iptables 规则以允许端口 80 和 443 接受入站 HTTP 和 HTTPS 连接请求,请运行以下命令:

    iptables -I INPUT -p tcp --match multiport --dports 80,443 -j ACCEPT

    输出示例:

    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

检查 AL2023、AL2 和 RHEL 7 及更高版本的配置

对于 Amazon Linux 2023 (AL2023)、Amazon Linux 2 (AL2) 和 RHEL 实例,运行以下命令以检查 firewalld 服务是否正在运行:

sudo firewall-cmd --state

输出示例:

running

如果 firewalld 服务正在运行,请运行以下命令,以允许通过 TCP 端口 80 和 443 进行连接:

sudo firewall-cmd --add-service=http --permanent
sudo firewall-cmd --add-service=https --permanent
sudo firewall-cmd --reload

**注意:**如果您之前添加了规则,则 reload 命令会重新加载服务并使规则生效。

对于每条命令,验证输出是否与以下示例类似:

success

检查 Debian 和 Ubuntu 服务器的配置

完成以下步骤:

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

    sudo ufw status verbose

    输出示例:

    Status:  active
  2. 如果您正在运行 UFW,请使用以下命令允许在所需的 TCP 端口上发出入站连接请求:
    TCP 端口 80:

    sudo ufw allow in 80/tcp

    TCP 端口 443:

    sudo ufw allow 443/tcp
  3. 对于每条命令,验证输出是否与以下示例类似:

    Rule added
    Rule added (v6)

要进一步排除故障,请查看位于 /var/log 的 Web 服务器访问错误日志中是否存在问题。以下为默认的 Web 服务器日志位置:

  • 对于 Amazon Linux 和 RHEL,使用 /var/log/httpd
  • 对于 Debian 和 Ubuntu,使用 /var/log/apache2

**注意:**Web 服务器日志的位置取决于您的服务器配置。

相关信息

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

AWS 官方已更新 7 个月前