Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Gunicorn Environment Variable Setting

I'm currently having difficulty passing environment variables into Gunicorn for my Django project. I'm on the latest 19.1 version. I have a wsgi.py file like so:

import os
import sys
from django.core.wsgi import get_wsgi_application

BASE_DIR = os.path.dirname(os.path.abspath(__file__))
PROJECT_DIR = os.path.abspath(os.path.join(BASE_DIR, '..'))

sys.path.append(PROJECT_DIR)
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "app.settings")

def application(environ, start_response):
    _application = get_wsgi_application()
    os.environ['SERVER_ENV'] = environ['SERVER_ENV']
    os.environ['SERVER_ID'] = environ['SERVER_ID']
    return _application(environ, start_response)

When I run gunicorn from the command line as:

SERVER_ENV=TEST SERVER_ID=TEST gunicorn -b 127.0.0.1:8080 --error-logfile - --access-logfile - app.wsgi:application

and I then pass a request to gunicorn I keep getting:

2014-08-01 08:39:17 [21462] [ERROR] Error handling request
Traceback (most recent call last):
  File "/opt/virtualenv/python-2.7.5/django-1.5.5/lib/python2.7/site-packages/gunicorn/workers/sync.py", line 93, in handle
    self.handle_request(listener, req, client, addr)
  File "/opt/virtualenv/python-2.7.5/django-1.5.5/lib/python2.7/site-packages/gunicorn/workers/sync.py", line 134, in handle_request
    respiter = self.wsgi(environ, resp.start_response)
  File "/opt/sites/itracker/wsgi.py", line 18, in application
    os.environ['SERVER_ENV'] = environ['SERVER_ENV']
KeyError: 'SERVER_ENV'

Printing out the environ values confirms that the environment variables are not being passed in. I've tried setting the environment variables in the virtualenv activation script and also in a dedicated gunicorn shell script and also by setting the environment variables using the --env flag but nothing seems to work.

Any ideas?

like image 204
Huw Avatar asked Aug 01 '14 08:08

Huw


People also ask

What is Gunicorn config?

Gunicorn reads configuration information from five places. Gunicorn first reads environment variables for some configuration settings. Gunicorn then reads configuration from a framework specific configuration file. Currently this only affects Paster applications.

What is Gunicorn default port?

The Gunicorn process will start and bind to all host IP addresses on port 8081.


1 Answers

I got a similar problem when deploying gunicorn.service. And I passed environment variables to it by a file:

<on gunicorn.service>
[Service]
...
EnvironmentFile=/pathto/somefilewith_secrets
...

For example (cat /etc/systemd/system/gunicorn.service)

[Unit]  
Description=gunicorn daemon  
After=network.target  
  
[Service]  
User=ubuntu
Group=ubuntu
WorkingDirectory=/home/ubuntu/10008/digichainOpen
EnvironmentFile=/home/ubuntu/10008/digichainOpen/.env
ExecStart=/home/ubuntu/.local/share/virtualenvs/digichainOpen-Zk2Jnvjv/bin/gunicorn \
          --worker-class=gevent --workers 4 \
          --bind unix:/home/ubuntu/10008/digichainOpen/gunicorn.sock digichainOpen.wsgi:application
            
[Install]  
WantedBy=multi-user.target  

and the .env file can be:

my_var=someValue
some_secret=secretvalue
another_secret=blah
like image 94
Waket Zheng Avatar answered Oct 12 '22 03:10

Waket Zheng