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


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>

我可以公开访问vhost内容。但是当我ssh到实例时尝试:wget xx.xx.xx.xx(公共ip),似乎没有解决。我需要一种方法来解决它本地生成pdf使用wkhtmltopdf

EC2实例不能通过它们自己的公共IP地址从实例本身访问。

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

您可以使用ec2metadata命令和--local-ipv4选项来获取实例的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-…是ec2为您的公共IP分配的主机名(您可以通过ec2metadata --public-hostname或在控制台中找到它,它被称为"公共DNS")。

如果您以这种方式配置DNS,并且您在VPC中启用了DNS主机名,那么如果从 VPC外部的查询,那么您的主机名将解析为外部的 IP地址,但如果从 VPC内部的查询,则将解析为内部的 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的公共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

如果您的公共主机名是指向"ec2-…"主机名的CNAME,则遵循此内部解析