配置中的 Apache 2.4 环境变量

配置中的 Apache 2.4 环境变量

好的,我正在为 apache 构建一个 docker 镜像。我想允许用户使用环境变量指定自定义 apache 配置。

总结

问题可以简化为:如何使用环境变量来打印部分配置(而不仅仅是指令值)。像这样:

  <IfDefine HasCustomVHostConfig>
    ${APACHE_CUSTOM_VHOST_CONFIG}
  </IfDefine>

目前,环境变量的值似乎被打印出来,但 apache 忽略了最多的指令。


长话短说。

我们有 1) docker 入口点 2) apache 配置 3) 环境变量,其中包含该配置的一部分(可以由启动 docker 镜像的用户进行修改)。

1. Docker 入口点
# Apache gets grumpy about PID files pre-existing
rm -f /usr/local/apache2/logs/httpd.pid

# Read apache2 env vars
source /etc/apache2/envvars

# Build apachectl options array
APACHE_OPTS=(-DFOREGROUND)

# If custom config has been set, add an option flag we will check later in config
if [[ -v APACHE_CUSTOM_VHOST_CONFIG ]]; then
  APACHE_OPTS+=(-DHasCustomVHostConfig)
fi

# Run apache2 in foreground
/usr/sbin/apachectl "${APACHE_OPTS[@]}"
2. Apache 虚拟主机配置
<VirtualHost _default_:80>
  ServerSignature Off

  ErrorLog ${APACHE_LOG_DIR}/000-default-error.log
  CustomLog ${APACHE_LOG_DIR}/000-default-access.log combined

  DocumentRoot ${APACHE_DOCUMENT_ROOT}

  <IfDefine HasCustomVHostConfig>
    ${APACHE_CUSTOM_VHOST_CONFIG}
  </IfDefine>

  <Directory ${APACHE_DOCUMENT_ROOT}>
    Options FollowSymLinks
    AllowOverride all
    Require all granted
  </Directory>
</VirtualHost>

注意,此配置有一个IfDefine语句,它将检查我们在入口点设置的选项标志,如果设置了,则将打印环境变量。

测试

  1. 如果我将环境变量设置为不正确的配置,我将在 apache 启动期间清楚地看到错误,这意味着所有标志和 IfDefine 语句都在起作用。
  2. 如果我使用 mod_redirect 将环境变量设置为简单重定向,它就会起作用,这意味着 apache 能够应用用环境变量打印的配置。
  3. 如果我将环境变量设置为使用 mod_rewrite 的更复杂的重定向,或者使用 mod_proxy 和 mod_proxy_http 的代理配置 - apache 将忽略它。如果将相同的配置直接添加到配置中,apache 将拾取并应用它。

我在这里遗漏了什么?

相关内容