无法从实例本身获取虚拟主机
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.com
或 www.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,则会遵循此内部解析。
我在 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
.
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.com
或 www.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,则会遵循此内部解析。