我是否应该使用不同于“SetEnv”的策略来在 18.04 上设置 apache 环境变量?

我是否应该使用不同于“SetEnv”的策略来在 18.04 上设置 apache 环境变量?

我使用的是 Ubuntu 18.04、apache 2 和 Python 3.6。在我的 Python 项目设置文件中,我有

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': os.environ['DB_NAME'],
        'USER': os.environ['DB_USER'],
        'PASSWORD': os.environ['DB_PASS'],
        'HOST': os.environ['DB_SERVICE'],
        'PORT': os.environ['DB_PORT']
    }
}

在我的 Apache 配置文件 /etc/apache2/sites-available/000-default.conf 中,我设置了环境变量,如下所示

<VirtualHost *:80>
    # The ServerName directive sets the request scheme, hostname and port that
    # the server uses to identify itself. This is used when creating
    # redirection URLs. In the context of virtual hosts, the ServerName
    # specifies what hostname must appear in the request's Host: header to
    # match this virtual host. For the default virtual host (this file) this
    # value is not decisive as it is used as a last resort host regardless.
    # However, you must set it for any further virtual host explicitly.
    ServerName lab.chicommons.com

    ServerAdmin webmaster@localhost
    DocumentRoot /var/www/html/web

    SetEnv DB_NAME maps_data
    SetEnv DB_USER chicommons
    SetEnv DB_PASS ChiCommons1$
    SetEnv DB_SERVICE localhost
    SetEnv DB_PORT 3306

    # Available loglevels: trace8, ..., trace1, debug, info, notice, warn,
    # error, crit, alert, emerg.
    # It is also possible to configure the loglevel for particular
    # modules, e.g.
    LogLevel info

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

        #Alias /static /srv/rdmo/rdmo-app/static_root/
        #<Directory /srv/rdmo/rdmo-app/static_root/>
        #    Require all granted
        #</Directory>
    # For most configuration files from conf-available/, which are
    # enabled or disabled at a global level, it is possible to
    # include a line for only one particular virtual host. For example the
    # following line enables the CGI configuration for this host only
    # after it has been globally disabled with "a2disconf".
    #Include conf-available/serve-cgi-bin.conf

        WSGIDaemonProcess maps \
            home=/var/www/html/web python-home=/var/www/html/web/venv
        WSGIProcessGroup maps 
        WSGIScriptAlias / /var/www/html/web/maps/wsgi.py process-group=maps
        WSGIPassAuthorization On

        <Directory /var/www/html/web/maps>
            <Files wsgi.py>
                Require all granted
            </Files>
        </Directory>
</VirtualHost>

遗憾的是我的应用程序没有找到环境变量,给出错误

[Mon Apr 20 17:23:12.826760 2020] [wsgi:error] [pid 3706:tid 140680830412544]   File "<frozen importlib._bootstrap>", line 955, in _find_and_load_unlocked
[Mon Apr 20 17:23:12.826815 2020] [wsgi:error] [pid 3706:tid 140680830412544]   File "<frozen importlib._bootstrap>", line 665, in _load_unlocked
[Mon Apr 20 17:23:12.826887 2020] [wsgi:error] [pid 3706:tid 140680830412544]   File "<frozen importlib._bootstrap_external>", line 678, in exec_module
[Mon Apr 20 17:23:12.826983 2020] [wsgi:error] [pid 3706:tid 140680830412544]   File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
[Mon Apr 20 17:23:12.827042 2020] [wsgi:error] [pid 3706:tid 140680830412544]   File "/var/www/html/web/maps/settings.py", line 84, in <module>
[Mon Apr 20 17:23:12.827091 2020] [wsgi:error] [pid 3706:tid 140680830412544]     'NAME': os.environ['DB_NAME'],
[Mon Apr 20 17:23:12.827153 2020] [wsgi:error] [pid 3706:tid 140680830412544]   File "/usr/lib/python3.6/os.py", line 669, in __getitem__
[Mon Apr 20 17:23:12.827221 2020] [wsgi:error] [pid 3706:tid 140680830412544]     raise KeyError(key) from None
[Mon Apr 20 17:23:12.827285 2020] [wsgi:error] [pid 3706:tid 140680830412544] KeyError: 'DB_NAME'

我正在使用启动和停止 Apache

sudo systemctl restart apache2

答案1

您好,不确定这是否可行,但您可以在您的个人资料或 bashrc 中添加一些别名。

举个例子 :

sudo nano ~/.bashrc

在文件末尾创建你的别名 :

# MYSQL SITE X
alias DB_NAME='maps_data'
alias DB_USER='chicommons'
alias DB_PASS='ChiCommons1$'
alias DB_SERVICE='localhost'
alias DB_PORT='3306'

应用这个新的 bashrc 指令。

source ~/.bashrc

此致

答案2

在您的应用程序中,您正在调用 os.environ['DB_NAME'],但该映射对象包含来自您的进程所在的 shell 环境的值。

但是当您使用指令 WSGIDaemonProcess 时,您正在启动另一个守护进程,并且该进程不会继承由 SetEnv 定义的环境变量。

当使用 SetEnv 期望某些内容出现在 os.environ 中时,需要注意三个重要事项:

  1. os.environ 不应与 WSGI 环境对象(通常称为 env)相混淆。WSGI 环境对象完全不同,用于访问每个请求的信息。os.environ 用于访问 OS 级环境变量。
  2. os.environ 不会改变,因此不能用它来访问每个请求的环境变量,因为这些变量的值可能会随着每个请求而改变。例如,不要调用 os.environ['SSL_SESSION_ID'],因为 SSL_SESSION_ID 会随着每个客户端而改变。
  3. 如果您生成一个应用程序进程,但不作为处理请求的一部分,那么该应用程序进程将不会将每个请求的环境变量存储在操作系统级环境变量中。

因此,您最好直接在项目设置文件中定义您的值。然后,您可以使用 WSGIDaemonProcess 指令的选项最终使用不同的设置文件。

希望能帮助到你。

相关内容