简体   繁体   English

向 Apache 和 PHP 公开环境变量

[英]Expose environment variables to Apache and PHP

Background背景

I'm trying to use Wercker to run my test for a PHP application.我正在尝试使用Wercker来运行我的 PHP 应用程序测试。 Wercker uses Docker containers to setup a test environment to execute tests in. It uses Environment Variables to expose the connection params for any connected services like MySQL and Elasticsearch. Wercker 使用 Docker 容器来设置测试环境以在其中执行测试。它使用环境变量来公开任何连接的服务(如 MySQL 和 Elasticsearch)的连接参数。 Example MYSQL_PORT_3306_TCP_ADDR = 127.0.1.1示例 MYSQL_PORT_3306_TCP_ADDR = 127.0.1.1

My core Docker containers is running Ubuntu 14.04 with PHP and Apache already installed on the container.我的核心 Docker 容器运行 Ubuntu 14.04,容器上已经安装了 PHP 和 Apache。

Problem问题

I can't seem to access the Environment Variables via php $_SERVER or $_ENV when running via Apache.通过 Apache 运行时,我似乎无法通过 php $_SERVER 或 $_ENV 访问环境变量。 It works fine if I run the script via CLI php ./db_connect.php or if I run PHP using its build in server php -S localhost:8000 .如果我通过 CLI php ./db_connect.php运行脚本,或者如果我使用其在服务器php -S localhost:8000构建运行 PHP,它可以正常工作。 However If I try and access a page via the Apache virtual host, the Environment Variables are not available.但是,如果我尝试通过 Apache 虚拟主机访问页面,则环境变量不可用。

Progress进步

I have setup Apache with the mod used to allow environmental variables "I think"我已经使用 mod 设置了 Apache,用于允许环境变量“我认为”

sudo a2enmod env
sudo service apache2 restart

I'm trying to access the Environment Variables in my script.我正在尝试访问脚本中的环境变量。

$database_host      = $_SERVER["MYSQL_PORT_3306_TCP_ADDR"];
$database_username  = $_SERVER["MYSQL_ENV_MYSQL_USER"];
$database_password  = $_SERVER["MYSQL_ENV_MYSQL_PASSWORD"];
$database_name      = $_SERVER["MYSQL_ENV_MYSQL_DATABASE"];
$elasticsearch_host = $_SERVER["ELASTICSEARCH_PORT_9300_TCP_ADDR"];

I can add new variables in my .htaccess, I just don't get all the system environmental variables.我可以在我的 .htaccess 中添加新变量,我只是没有获得所有系统环境变量。

SetEnv TEST_VAR test

I have read this question How to get system environment variables into PHP while running CLI & Apache2Handler?我已经阅读了这个问题How to get system environment variables into PHP while running CLI & Apache2Handler? but i'm not sure what its suggesting to do.但我不确定它的建议是什么。

Question

How do I expose System Environment Variables to Apache and PHP?如何向 Apache 和 PHP 公开系统环境变量?

If you are using php official Docker image you have to explicitly pass environment variables from Apache to PHP.如果您使用的是php 官方 Docker 映像,则必须将环境变量从 Apache 显式传递到 PHP。 You can do something like this:你可以这样做:

In your Dockerfile:在您的 Dockerfile 中:

FROM php:7.2-apache
RUN echo 'SetEnv MYSQL_USER ${MYSQL_USER}' > /etc/apache2/conf-enabled/environment.conf

environment.conf is an arbitrary name, but it should be placed in /etc/apache2/conf-enabled/ . environment.conf是一个任意名称,但它应该放在/etc/apache2/conf-enabled/

In docker-compose.yml:在 docker-compose.yml 中:

version: '2'
services:
    yourservice:
        build: ./yourimage
        image: yourimage
        ports:
            - 8080:80
        volumes:
            - ../html:/var/www/html
        environment:
            MYSQL_USER: foo

In your PHP script:在您的 PHP 脚本中:

echo getenv('MYSQL_USER');

Here is the solution:这是解决方案:

Docker will pass these to apache but you have to configure apache to make them available to PHP. Docker 会将这些传递给 apache,但您必须配置 apache 以使它们可用于 PHP。

Setup the values in your local .env file在本地 .env 文件中设置值

MYSQL_PORT_3306_TCP_ADDR=1234
MYSQL_ENV_MYSQL_USER=development
MYSQL_ENV_MYSQL_PASSWORD=password    

Then add these as environment params in the docker-compose.yml file然后将这些作为环境参数添加到 docker-compose.yml 文件中

version: 2
services:
  web:
  build: php:5.6-apache
  environment:
    MYSQL_PORT_3306_TCP_ADDR:${MYSQL_PORT_3306_TCP_ADDR}
    MYSQL_ENV_MYSQL_USER: ${MYSQL_ENV_MYSQL_USER}
    MYSQL_ENV_MYSQL_PASSWORD: ${MYSQL_ENV_MYSQL_PASSWORD}

Then to pass these to PHP set these as environment params in your Virtual Host config然后将这些传递给 PHP,在您的虚拟主机配置中将它们设置为环境参数

<VirtualHost *:80>
    ServerName some-project

    ServerAdmin webmaster@localhost
    DocumentRoot /var/www/some-project

    # Set apache environment variables
    SetEnv MYSQL_PORT_3306_TCP_ADDR ${MYSQL_PORT_3306_TCP_ADDR}
    SetEnv MYSQL_ENV_MYSQL_USER ${MYSQL_ENV_MYSQL_USER}
    SetEnv MYSQL_ENV_MYSQL_PASSWORD ${MYSQL_ENV_MYSQL_PASSWORD}
</VirtualHost>

These will now be available to access in PHP via the $_SERVER super global array.这些现在可以通过 $_SERVER 超级全局数组在 PHP 中访问。

<?php
    echo $_SERVER['MYSQL_ENV_MYSQL_USER'];

if you're using php-fpm , you can pass env vars from OS to PHP-FPM through clear_env ini setting in a file like /path/to/php/fpm/pool.d/www.conf :如果您使用的是php-fpm ,您可以通过像/path/to/php/fpm/pool.d/www.conf这样的文件中的clear_env ini 设置将环境变量从操作系统传递到 PHP-FPM:

clear_env = no

it works with environment vars set via docker-compose.yml as below:它适用于通过docker-compose.yml设置的environment变量,如下所示:

version: "..."

services:
    php-fpm:
        image: php:7-fpm
        environment:
            MY_VAR: my-value

IMPORTANT: Of course, the risk is that your PHP-FPM will get access to all OS env vars.重要提示:当然,风险在于您的 PHP-FPM 将可以访问所有操作系统环境变量。 If passing all vars is a problem, you can also pass only specific vars via www.conf or another php ini config file:如果传递所有变量有问题,您还可以通过www.conf或另一个 php ini 配置文件仅传递特定变量:

; Pass environment variables like LD_LIBRARY_PATH. All $VARIABLEs are taken from
; the current environment.
env[MY_VAR] = $MY_VAR

With docker-compose you can retrieve the operating system's environment variables set with the environment option of the docker-compose.yml file through php's $_ENV variable.使用 docker-compose,您可以通过 php 的$_ENV变量检索使用 docker-compose.yml 文件的environment选项设置的操作系统环境变量。

version: 2
services:
  web:
    build: php:5.6-apache
    environment:
      MYSQL_USER: "user"
      MYSQL_PASSWORD: "passwd"

should give you应该给你

$_ENV['MYSQL_USER'] = user
$_ENV['MYSQL_PASSWORD'] = passwd

I'm not sure how Wercker maps environment variables to the containers, but there's this open issue that I think might help https://github.com/wercker/wercker/issues/63我不确定 Wercker 如何将环境变量映射到容器,但我认为有一个未解决的问题可能会有所帮助https://github.com/wercker/wercker/issues/63

您可以使用如下所示的 php 命令检查 get env

php -r "echo getenv('MYSQL_USER');"

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM