Я использую 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
Привет, не уверен, что это поможет, но вы можете добавить псевдоним в свой профиль или 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
С уважением
В своем приложении вы вызываете os.environ ['DB_NAME'], но этот объект отображения содержит значения, поступающие из среды оболочки, из которой существует ваш процесс.
Но когда вы используете директиву WSGIDaemonProcess, вы запускаете другой процесс-демон, и этот процесс не наследует переменные среды, определенные SetEnv.
При использовании SetEnv при ожидании того, что что-то появится в os.environ, следует помнить о трех важных предостережениях:
Поэтому вам лучше определять свои значения непосредственно в файле настроек вашего проекта. Затем вы можете использовать параметры директивы WSGIDaemonProcess, чтобы в конечном итоге использовать другие файлы настроек.
Надеюсь, это поможет.