无法从实例本身获取虚拟主机

Unable to wget virtualhost from instance itself

我在 Ec2 实例上设置了 LAMP 并设置了一个虚拟主机,例如

<VirtualHost *:80 >
    ServerName xx.xx.xx.xx
    ServerAdmin test@example.com
    DocumentRoot /var/www/dir1

..
..
</VirtualHost>

我只能public访问虚拟主机内容。但是当我 ssh 到实例并且 尝试:wget xx.xx.xx.xx (public ip),好像没有解决。我需要一种方法在本地解决它以使用 wkhtmltopdf .

生成 pdf

EC2 实例无法通过其自身的 public IP 地址从实例本身访问。

Internet 网关在您分配的 public IP 和实际绑定到您的堆栈的私有 IP 之间进行静态 1:1 网络地址转换。使用其 public IP 访问您的实例需要通过 Internet 网关的发夹连接,这是不受支持的。

您可以使用带有 --local-ipv4 选项的 ec2metadata 命令来获取实例的 IP 地址,并将其直接包含在命令行中:

$ wget http://$(ec2metadata --local-ipv4)/path/goes/here 

或者,稍微高级一些...您可以更改 DNS 的配置方式,只要您的主机名不在区域顶点(例如,这适用于 api.example.comwww.example.com 但不是裸域 example.com).

如果您将 DNS 配置为使用 CNAME 记录,则类似这样...

www CNAME ec2-54-xx-xx-xx.compute-1.amazonaws.com.

...其中 ec2-... 是您的 public IP 的 EC2 分配主机名(您可以使用 ec2metadata --public-hostname 或在控制台中找到它,它被称为 "public DNS").

如果您以这种方式配置 DNS,并且您有 enabled DNS hostnames in your VPC,那么如果从 外部查询,您的主机名将解析为您的 外部 IP 地址 您的 VPC,但如果从 inside 您的 VPC 查询,将解析为您的 internal IP 地址。 (这也适用于 EC2 Classic)。

使用此配置,您可以使用主机名在内部访问您的实例,但外部查找也可以继续工作。

为了向那些可能不熟悉此功能的人说明这一点:

从VPC内部查询,解析为私有地址:

$ dig ec2-54-xxx-xxx-xxx.compute-1.amazonaws.com
ec2-54-xxx-xxx-xxx.compute-1.amazonaws.com. 60 IN A 172.31.yyy.yyy

从 VPC 外部查询,使用 Google 的 public DNS 服务器:

$ dig @8.8.8.8 ec2-54-xxx-xxx-xxx.compute-1.amazonaws.com
ec2-54-xxx-xxxx-xxxx.compute-1.amazonaws.com. 21599 IN A 54.xxx.xxx.xxx

如果您的 public 主机名是指向 "ec2-..." 主机名的 CNAME,则会遵循此内部解析。