使用当前的ec2公共IP配置apache虚拟主机

时间:2017-11-07 19:22:16

标签: python apache amazon-ec2 flask

我在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

2 个答案:

答案 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时都会相同。如果这种替代方案不便宜,我公司就会实施第一种方法。我建议你至少看看它。