我在EC2实例上有一个用户数据脚本,该脚本在启动时为Flask Rest API安装和配置apache。所有文件都是从我的 Git 存储库中提取的,VirtualHost 配置如下:
<VirtualHost *:80>
ServerName *
ServerAdmin admin@mywebsite.com
WSGIPassAuthorization On
WSGIScriptAlias / /var/www/FlaskApi/flaskapi.wsgi
<Directory /var/www/FlaskApi/FlaskApi/>
Order allow,deny
Allow from all
</Directory>
Alias /static /var/www/FlaskApi/FlaskApi/static
<Directory /var/www/FlaskApi/FlaskApi/static/>
Order allow,deny
Allow from all
</Directory>
ErrorLog ${APACHE_LOG_DIR}/error.log
LogLevel warn
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
但是,在启动时,无法知道实例将获得哪个公共 IP 地址,因此我想知道 VirtualHost 是否有某种通配符配置,因此无需指定服务器名称或 IP。
编辑:根据豪尔赫的建议,我已将以下内容添加到我的启动脚本中,它就像一个魅力!
ip=$(curl http://169.254.169.254/latest/meta-data/public-ipv4)
sudo sed -i "s/replace/$ip/g" /etc/apache2/sites-enabled/FlaskApi.conf
部分问题可以通过以下事实来回答:(我相信)"VirtualHost *:80"告诉它侦听该机器的所有网络接口,而不管网络设备的分配IP地址如何。 不过,我可能在你的问题中遗漏了一些东西。
据我所知,ServerName 字段指定虚拟主机应响应的主机请求。 如果该字段显示 whateverdomain.com,则虚拟主机将响应请求 whateverdomain.com 的请求。 如果字段显示 *.whateverdomain.com,它将响应对 whateverdomain.com 的任何子域的请求。 对于虚拟主机,您可能希望限制每个虚拟主机响应的域。 重叠可能会导致错误 - 不知道。
我不确定ServerName
标签是否有通配符来做你想做的事情,但如果你不介意做一些脚本编辑,你可以使用这篇文章中描述的命令:
curl http://169.254.169.254/latest/meta-data/public-ipv4
运行此选项将返回实例的当前 IP 地址。您可以创建一个在启动时运行此命令的小脚本,读取结果,使用正则表达式编辑包含虚拟服务器的 Apache .conf
文件(我建议使用单独的文件而不是使用 httpd.conf 本身),然后重新启动 httpd。
还有另一种更简单的解决方案。AWS 的弹性 IP。是的,维护需要花钱,但实际上并没有那么多,它使您的生活变得更加轻松,您所要做的就是通过 AWS 控制台为您的实例设置弹性 IP,每次重新启动您的 IP 时都会相同。如果这种替代方案不便宜,我的公司就会实施第一种方法。我建议你至少看一看。