将 systemd 用于 Apache 环境变量或 SetEnv?

Jef*_*Wen 6 php redhat centos systemd apache-2.4

我的系统:

  1. CentOS 7.2.1511(核心)
  2. 阿帕奇 2.4.6

我有很多环境变量想添加到 Apache 中。

我目前正在通过添加到我的/etc/httpd/conf.d/vhosts.conf文件中来做到这一点:

SetEnv API_USERNAME 'my_special_username'
SetEnv API_PASSWORD 'my_special_password'
Run Code Online (Sandbox Code Playgroud)

我可以通过以下方式访问 PHP 中的两个环境变量:

echo $_SERVER['API_USERNAME'];
echo $_SERVER['API_PASSWORD'];
// or
echo getenv('API_USERNAME');
echo getenv('API_PASSWORD');
Run Code Online (Sandbox Code Playgroud)

最近,我发现我还可以通过添加环境变量systemd

我创建文件/etc/systemd/system/httpd.service.d/envvars.conf

[Service]
Environment="API_USERNAME=my_special_username"
Environment="API_PASSWORD=my_special_password"
Run Code Online (Sandbox Code Playgroud)

其次是

systemctl daemon-reload

systemctl restart httpd

我可以通过以下方式访问 PHP 中的两个环境变量:

echo getenv('API_USERNAME');
echo getenv('API_PASSWORD');
// $_SERVER does not work when I specify environment variables in systemd
echo $_SERVER['API_USERNAME']; // returns blank
echo $_SERVER['API_PASSWORD']; // returns blank
Run Code Online (Sandbox Code Playgroud)

在安全性或最佳实践方面,最好使用 SetEnv 或systemd将我的 Apache 环境变量添加到配置文件中吗?或者没关系?

小智 1

我同意 Tvon 的说法,并且想更具体地补充一点,systemd 确实是放置这些 Apache 环境变量的错误位置。使用 Systemd 的其他应用程序或进程不需要了解这些变量。

我还会考虑您是否会在同一台服务器上托管多个 PHP 站点,如果是的话,而不是将所有内容都放在其中

/etc/httpd/conf.d/vhosts.conf
Run Code Online (Sandbox Code Playgroud)

我还会考虑使用站点可用方法,又名“debian-way”

如何配置 Apache(可用站点与 httpd.conf)

以下方法基于 Centos 指南https://www.digitalocean.com/community/tutorials/how-to-set-up-apache-virtual-hosts-on-centos-7#step-four-%E2%80 %94-创建新的虚拟主机文件

sudo mkdir /etc/httpd/sites-available
sudo mkdir /etc/httpd/sites-enabled
Run Code Online (Sandbox Code Playgroud)

告诉 Apache 在启用站点的目录中查找虚拟主机。通过编辑 Apache 的主配置文件并添加一行声明附加配置文件的可选目录:

sudo nano /etc/httpd/conf/httpd.conf
Run Code Online (Sandbox Code Playgroud)

在文件末尾添加一行 IncludeOptionalsites-enabled/*.conf

保存并关闭文件。然后创建虚拟主机文件。

sudo nano /etc/httpd/sites-available/example.com.conf

<VirtualHost *:80>

</VirtualHost>
Run Code Online (Sandbox Code Playgroud)

然后为您的第一个网站添加directives

<VirtualHost *:80>
    ServerName www.example.com
    ServerAlias example.com

    SetEnv API_USERNAME 'my_special_username'
    SetEnv API_PASSWORD 'my_special_password'

    DocumentRoot /var/www/example.com/public_html
    ErrorLog /var/www/example.com/error.log
    CustomLog /var/www/example.com/requests.log combined

</VirtualHost>
Run Code Online (Sandbox Code Playgroud)

保存并关闭文件。然后为您的第二个网站制作一个名为 example2.com.conf 的副本

sudo cp /etc/httpd/sites-available/example.com.conf /etc/httpd/sites-available/example2.com.conf
Run Code Online (Sandbox Code Playgroud)

编辑文件并进行相关更改

sudo nano /etc/httpd/sites-available/example2.com.conf

<VirtualHost *:80>
    ServerName www.example2.com
    ServerAlias example2.com

    SetEnv API_USERNAME 'my_other_special_username'
    SetEnv API_PASSWORD 'my_other_special_password'

    DocumentRoot /var/www/example2.com/public_html
    ErrorLog /var/www/example2.com/error.log
    CustomLog /var/www/example2.com/requests.log combined

</VirtualHost>
Run Code Online (Sandbox Code Playgroud)

然后,您需要通过创建从站点启用目录到站点可用目录的符号链接来启用站点

sudo ln -s /etc/httpd/sites-available/example.com.conf /etc/httpd/sites-enabled/example.com.conf
sudo ln -s /etc/httpd/sites-available/example2.com.conf /etc/httpd/sites-enabled/example2.com.conf
Run Code Online (Sandbox Code Playgroud)

然后重新启动apache(通常我会先进行configtest看看是否有错误)

sudo apachectl configtest
Run Code Online (Sandbox Code Playgroud)

如果一切顺利的话

sudo apachectl restart
Run Code Online (Sandbox Code Playgroud)

此方法的其他好处是您可以创建现有配置的新版本,并使用符号链接来回指向新配置或在必要时启用/禁用网站的任何问题。