【问题标题】:How to make environment variables available to Apache, started as a service?如何使 Apache 可以使用环境变量,作为服务启动?
【发布时间】:2018-07-19 22:47:42
【问题描述】:

我知道将一些环境变量添加到 /etc/environment 将使它们在系统范围内可用,将它们添加到 /etc/profile~/.bashrc 或等效项将使特定用户可用......然而,所有这些都适用于交互式会话。当 Apache 作为systemd 服务启动时,它是一个非交互式会话,因此它看不到那些环境变量。我可以让 Apache 解析一个包含类似行的 .env 文件

env1=foo
env2=bar
...

然后可以在我的 PHP 代码中使用 $_SERVER['foo'] 等访问它们。当然,我也想为其他 systemd 服务实现相同的目标,所以是否有任何特定文件提供环境变量服务?

【问题讨论】:

  • 有一堆库可以让 PHP 读取 .env 文件,所以这就足够了,或者它们是希望 Apache 读取它们的一些具体原因吗?
  • 不 @NigelRen 我不想让 Apache 专门阅读它们,我只想确保每个 Systemd 服务(也可能是 node.js 应用程序即服务)能够自动访问对他们

标签: php apache environment-variables


【解决方案1】:

您可以使用站点的 Apache 配置文件中的 SetEnv 指令为该站点设置环境变量,如下所示:

SetEnv DATABASE_NAME foo

这需要放在<VirtualHost> 指令中。

重新启动服务器后,应该可以通过$_ENV 超全局或getenv() 访问这些数据。这种方法的缺点是,如果您的应用程序包含任何不由 Apache 执行的内容,例如队列工作者或控制台命令,除非您将它们复制到适当的位置(例如,您的.bashrc)。

或者你可以使用像DotEnv这样的库。

【讨论】:

    【解决方案2】:

    您可以在 VirtualHost 指令中使用 auto_prepend_file 让 PHP 在每个请求之前包含一个文件:

    <VirtualHost *:80>
    ServerName myserver.com
    DocumentRoot /path/to/doc/root/
    
    php_value auto_prepend_file "/path/to/my/env_settings.php"
    
    </VirtualHost>
    

    'env_settings.php' 可以包含任何有效的 php,因此您应该能够设置您希望的任何变量,并使它们在全局范围内可用。

    【讨论】:

      【解决方案3】:

      Apache 有envvars 文件,从源代码构建时默认位于$prefix/bin/envvars。 Debian 将它放在 /etc/apache2 目录 afaik 中。在此文件中,您可以在httpd 进程启动之前修改环境,例如。 export env1=foo

      envvars 通常在 Apache 作为服务或使用 apachectl 命令自动启动时解释,而不是在直接调用 httpd 时解释。因此,如果您依赖于 envvars 中设置的环境变量,如果您有自制启动脚本,请确保包含它。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-03-16
        • 1970-01-01
        • 1970-01-01
        • 2019-09-02
        相关资源
        最近更新 更多