【问题标题】:Environment variables not being set after configuring Nginx and Gunicorn (Django app on Ubuntu machine)配置 Nginx 和 Gunicorn 后未设置环境变量(Ubuntu 机器上的 Django 应用程序)
【发布时间】:2016-03-14 21:18:58
【问题描述】:

我刚刚使用 Nginx(反向代理)为 Django Web 应用程序设置了 Gunicorn。根据gunicorn.log,该组合似乎正在正确启动。请注意,我没有使用主管。

但奇怪的是,我的环境变量(设置在.profile)根本没有被拾取! printenv 表明它们存在。我尝试过的一些事情是将环境变量放入/etc/default/nginx 并重新启动nginx、etc/environment.profilenginx.confgunicorn.conf 等。它只是不起作用!

顺便说一句,它在安装和配置 nginx 之前 完美运行,即当我只是运行时:gunicorn --bind 0.0.0.0:8080 --env DJANGO_SETTINGS_MODULE=myproject.settings myproject.wsgi:application

现在看来是nginx:

删除从其父进程继承的所有环境变量 除了 TZ 变量

来源:http://nginx.org/en/docs/ngx_core_module.html#env 这可能是我尝试的任何东西都没有接近工作的原因吗?但如果是这样,我想这些添加到 nginx.conf 中的变量应该已经被拾取了。尽管如此,使用echo $envvar 在命令行上会产生正确的值,这告诉我变量可能已设置,但被绕过或忽略。请注意,USER env 变量也显示为 None,而 print TERM 打印的是 linux


wsgi.py

import os
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "myproject.settings")
from django.core.wsgi import get_wsgi_application
from dj_static import Cling
application = Cling(get_wsgi_application())

gunicorn.conf:

description "Gunicorn application server handling myproject"

start on runlevel [2345]
stop on runlevel [!2345]

respawn
setuid myuser
setgid www-data
chdir /home/myuser/directory/myproject/

exec /home/myuser/.virtualenvs/myvirtualenv/bin/gunicorn --chdir=/home/myuser/directory/ --workers 3 --bind unix:/home/myuser/directory/myproject/myproject.sock --env DJANGO_SETTINGS_MODULE=myproject.settings myproject.wsgi:application

/etc/nginx/sites-available/myproject:

server {
    listen 80;
    server_name myapp.cloudapp.net;

    location = /favicon.ico { access_log off; log_not_found off; }
    location /static/ {
        root /home/myuser/directory/myproject;
    }

    location / {
        include proxy_params;
        proxy_pass http://unix:/home/myuser/directory/myproject/myproject.sock;
    }
}

注意:如果需要,请向我索取更多信息。

【问题讨论】:

  • 我们能否看到“应用程序”启动代码(通常称为wsgi.py)以及您如何称呼它(gunicorn ...),以及任何其他非机密来源。更多详细信息,例如运行代码的“用户”是什么,如果您使用的是 supervisord,很高兴知道。 -- 更多关于如何运行代码的细节也会很有用
  • nginx “运行” gunicorn 还是仅仅使用套接字/端口并代理它?如果它“使用”它,那么我不需要查看您的 nginx 配置文件。如果它确实“运行”它,那么,是的。
  • 我能看到/想到的唯一想法是您的 myuser 没有您所说的环境变量。试试这个: sudo su myuser && env 如果他们在那里;我们还有另一个问题,如果不是,您需要将其添加到该用户的个人资料中,而不是您当前的登录用户
  • usermod -d /home/myuser myuser 然后将其添加到 vim /home/myuser/.profile - 如果它们不是太多的话,您可以随时将其添加到您的 gunicorn.conf 中。由您决定。跨度>
  • 你是说这个sudo su myuser && env 现在可以工作了吗?那只独角兽没有捡起来?

标签: python django ubuntu nginx gunicorn


【解决方案1】:

因此,设置 gunicorn 可以轻松查看的环境变量的密封(希望)方法是按如下方式编辑 gunicorn.conf:

exec /home/myuser/.virtualenvs/myvirtualenv/bin/gunicorn --chdir=/home/myuser/directory/ --workers 3 --bind unix:/home/myuser/directory/myproject/myproject.sock -e var1=value1 -e var2=value2 myproject.wsgi:application

到目前为止,这对我很有帮助。如果我遇到任何问题,我会更新这个答案。

【讨论】:

    猜你喜欢
    • 2014-09-24
    • 2018-02-11
    • 2014-12-17
    • 1970-01-01
    • 1970-01-01
    • 2019-01-18
    • 1970-01-01
    • 2020-08-10
    • 1970-01-01
    相关资源
    最近更新 更多