Следует ли мне использовать стратегию, отличную от SetEnv, для установки переменных среды apache 18.04?

Я использую 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
задан 22 April 2020 в 23:02

2 ответа

Привет, не уверен, что это поможет, но вы можете добавить псевдоним в свой профиль или 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

С уважением

0
ответ дан 27 April 2020 в 16:07

В своем приложении вы вызываете os.environ ['DB_NAME'], но этот объект отображения содержит значения, поступающие из среды оболочки, из которой существует ваш процесс.

Но когда вы используете директиву WSGIDaemonProcess, вы запускаете другой процесс-демон, и этот процесс не наследует переменные среды, определенные SetEnv.

При использовании SetEnv при ожидании того, что что-то появится в os.environ, следует помнить о трех важных предостережениях:

  1. os.environ не следует путать с объектом среды WSGI, который часто называют env. Объект среды WSGI - это что-то совершенно другой, и предназначен для доступа к информации по запросу. os.environ предназначен для доступа к переменным среды уровня ОС.
  2. os.environ не изменяется, поэтому его нельзя использовать для доступа по запросу. переменные среды, значения которых могут изменяться для каждого запроса. За например, не вызывайте os.environ ['SSL_SESSION_ID'], потому что SSL_SESSION_ID изменения для каждого клиента.
  3. Если вы запускаете процесс приложения, но не как часть обработки запроса, тогда этот процесс приложения не будет иметь переменных среды для каждого запроса хранятся внутри переменных среды на уровне ОС.

Поэтому вам лучше определять свои значения непосредственно в файле настроек вашего проекта. Затем вы можете использовать параметры директивы WSGIDaemonProcess, чтобы в конечном итоге использовать другие файлы настроек.

Надеюсь, это поможет.

0
ответ дан 28 April 2020 в 10:53

Другие вопросы по тегам:

Похожие вопросы: