我在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是否存在某种通配符配置,因此无需指定ServerName或IP
编辑:根据Jorge的建议,我已将以下内容添加到我的启动脚本中,它就像一个魅力!
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
答案 0 :(得分:1)
您的部分问题可以通过(我相信)“VirtualHost *:80”告诉它监听该计算机的所有网络接口,而不管网络设备分配的IP地址。不过,我可能会在你的问题中遗漏一些东西。
根据我的记忆,ServerName字段指定虚拟主机应响应的主机请求。如果该字段显示whateverdomain.com,则虚拟主机将响应请求whateverdomain.com的请求。如果该字段显示* .whateverdomain.com,它将响应对whateverdomain.com的任何子域的请求。对于虚拟主机,您可能希望限制每个虚拟主机响应的域。重叠可能会导致错误 - 不知道。
答案 1 :(得分:0)
我不确定ServerName
标记是否有通配符可以执行您想要的操作,但如果您不介意编写一些脚本,则可以使用this post中描述的命令:
curl http://169.254.169.254/latest/meta-data/public-ipv4
运行此命令将返回实例的当前IP地址。您可以创建一个在启动时运行此命令的小脚本,读取结果,编辑包含虚拟服务器的Apache .conf
文件(我建议使用单独的文件而不是使用httpd.conf本身)正则表达式然后重启你的httpd。
还有另一种更简单的解决方案。 AWS's Elastic IP。是的,维护成本很高,但实际上并没有那么多,它让您的生活变得如此简单,您所要做的就是通过AWS控制台将弹性IP设置为您的实例,每次重启IP时都会相同。如果这种替代方案不便宜,我公司就会实施第一种方法。我建议你至少看看它。