(Nginx +gunicorn)/Apache 不读取环境变量
(Nginx +gunicorn)/Apache not reading environment variables
我得到:
[01000] [unixODBC][Driver Manager]Can't open lib '/usr/local/nz/lib64/libnzodbc.so' : file not found (0) (SQLDriverConnect)"
使用 PyODBC
创建连接时出错。当我通过 Django 开发服务器使用它时,它工作正常。但是通过使用它。 Gunicorn
和 Nginx
,它失败了。
我过去曾遇到过这个问题(在配置开发服务器时):
- 缺少 UnixODBC 所需的一些库。因为,它正在与 Django 开发服务器一起工作,所以这不是问题
- 当环境变量
PATH
和 LD_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
。
后来我尝试使用 Apache 并发现了相同的行为。在做了大量研究后,我发现 apache 不读取系统环境 vaiables。为了使用一些环境变量,需要在其定义: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"
我得到:
[01000] [unixODBC][Driver Manager]Can't open lib '/usr/local/nz/lib64/libnzodbc.so' : file not found (0) (SQLDriverConnect)"
使用 PyODBC
创建连接时出错。当我通过 Django 开发服务器使用它时,它工作正常。但是通过使用它。 Gunicorn
和 Nginx
,它失败了。
我过去曾遇到过这个问题(在配置开发服务器时):
- 缺少 UnixODBC 所需的一些库。因为,它正在与 Django 开发服务器一起工作,所以这不是问题
- 当环境变量
PATH
和LD_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
。
后来我尝试使用 Apache 并发现了相同的行为。在做了大量研究后,我发现 apache 不读取系统环境 vaiables。为了使用一些环境变量,需要在其定义: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"