我在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.com
或www.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,则遵循此内部解析