(Nginx +gunicorn)/Apache 不读取环境变量

Posted

技术标签:

【中文标题】(Nginx +gunicorn)/Apache 不读取环境变量【英文标题】:(Nginx +gunicorn)/Apache not reading environment variables 【发布时间】:2017-03-28 03:25:06 【问题描述】:

我得到:

[01000] [unixODBC][Driver Manager]Can't open lib '/usr/local/nz/lib64/libnzodbc.so' : file not found (0) (SQLDriverConnect)"

使用PyODBC 创建连接时出错。当我通过 Django 开发服务器使用它时,这很好用。但是通过使用它。 Gunicornnginx,失败了。

我过去(在配置开发服务器时)遇到过这个问题:

    缺少 UnixODBC 所需的一些库。由于它正在与 Django 开发服务器一起使用,因此这不是问题 当环境变量 PATHLD_LIBRARY_PATH 没有我的驱动程序的路径时。

我认为最有可能是第二个原因。我尝试在/etc/profile/etc/environment 中设置环境变量,但没有运气。有人知道这里可能出了什么问题吗?

编辑:它与Gunicorn 无关,因为它直接运行gunicorn 服务器使用:

gunicorn --bind 0.0.0.0:8000 my_project.wsgi:application

工作正常。 问题在于通过 wsgi 与 Nginx 通信时。


所有必需的环境方法都设置正确:

mquadri@MY_HOST:/tmp/webadmin$ env
LD_LIBRARY_PATH=/usr/local/nz/lib64
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/usr/local/nz/bin64
NZ_ODBC_INI_PATH=/home/mquadri/CONFIG
HOME=/home/mquadri
ODBCINI=/home/mquadri/CONFIG/odbc.ini
NETEZZA=/usr/local/nz

ldd 的输出以防有人发现它有用(此处列出的所有这些文件都已经存在)

mquadri@MY_HOST:/tmp/webadmin$ ldd /usr/local/nz/lib64/libnzodbc.so
    linux-vdso.so.1 =>  (0x00007fff96dfa000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f286f0f1000)
    libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f286edeb000)
    libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f286ebcc000)
    libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f286e9c8000)
    libkrb5.so.3 => /usr/local/nz/lib64/libkrb5.so.3 (0x00007f286e7e8000)
    libkrb5support.so.0 => /usr/local/nz/lib64/libkrb5support.so.0 (0x00007f286e6da000)
    libcom_err.so.3 => /usr/local/nz/lib64/libcom_err.so.3 (0x00007f286e5d7000)
    libk5crypto.so.3 => /usr/local/nz/lib64/libk5crypto.so.3 (0x00007f286e494000)
    /lib64/ld-linux-x86-64.so.2 (0x00007f286f806000)
    libresolv.so.2 => /lib/x86_64-linux-gnu/libresolv.so.2 (0x00007f286e278000)

编辑 2:如果我在 settings.py 中显式设置这些环境变量,开发服务器运行正常,但 nginx 提供 Internal Server Error

【问题讨论】:

【参考方案1】:

后来我尝试使用 Apache 并发现相同的行为。经过大量研究,我发现 apache 不读取系统环境变量。为了使用一些环境变量,你需要在它的apache2/envars中定义它。我将我的变量添加到文件中:

export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:/usr/local/nz/lib64"
export PATH="$PATH:/usr/local/nz/bin64"
export NETEZZA="/usr/local/nz"
export NZ_ODBC_INI_PATH="/etc"

【讨论】:

以上是关于(Nginx +gunicorn)/Apache 不读取环境变量的主要内容,如果未能解决你的问题,请参考以下文章

Django 可以单独在 Gunicorn 上运行(没有 Apache 或 nginx)吗?

python+django+gunicorn+nginx的配置

python+django+gunicorn+nginx的配置

nginx+gunicorn+flask部属web时,使用nginx如何指定多个静态文件路径

通过 Gunicorn/Nginx 使用 Django 的站点框架运行多个站点

我需要使用 apache 或 nginx 来托管服务器吗?