事情是这样的,我需要在cgi程序里面调用一个shell的命令,这个shell命令的执行依赖于一个外部的库,我是手动安装的这个库,然后为这个库设置了 LD_LIBRARY_PATH 环境变量,现在是shell里面,这个命令的执行没有任何问题,但是在apache服务器里面使用cgi程序调用执行,就出现了奇怪的错误,见下面的详细问题描述。
详细问题描述:
[0]操作系统: ubuntu desktop edition 9.04
apache 版本: apache2
CGI 程序编写语言: python 2.6.5
外部程序库: BALL 1.2 (生物化学算法库)
[1]如何设置 LD_LIBRARY_PATH 环境变量
大家可能知道,在ubuntu 8.10 以上的版本中, LD_LIBRARY_PATH 环境变量被取消了,传统的设置方法没有用,我是通过下面的方法来设置的:
代码: 全选
zzm@zzm-desktop:~$ echo STARTUP=\"/usr/bin/env LD_LIBRARY_PATH=\${LD_LIBRARY_PATH} \${STARTUP}\" | sudo tee /etc/X11/Xsession.d/90preserve_ld_library_path
zzm@zzm-desktop:~$ sudo reboot
[2]apache配置
代码: 全选
zzm@zzm-desktop:/etc/apache2$ more httpd.conf
DirectoryIndex index.html index.html.var index.htm
AddType text/html .htm .html .py
AddHandler cgi-script .cgi .py
zzm@zzm-desktop:/etc/apache2$ more sites-available/default
<VirtualHost *:80>
ServerAdmin [email protected]
SetEnv LD_LIBRARY_PATH /home/zzm/ProgramFiles/BALL/BALL-1.2/lib/Linux-i386-g++_4.1.3
DocumentRoot /var/www
<Directory />
Options FollowSymLinks
AllowOverride None
</Directory>
<Directory /var/www/>
Options Indexes FollowSymLinks MultiViews ExecCGI
AllowOverride None
Order allow,deny
allow from all
AddHandler mod_python .py
PythonHandler mod_python.publisher
PythonDebug on
</Directory>
ScriptAlias /cgi-bin/ /var/www/cgi-bin/
<Directory "/var/www/cgi-bin">
AllowOverride None
Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
Order allow,deny
Allow from all
AddHandler cgi-script .cgi .py
</Directory>
ErrorLog /var/log/apache2/error.log
# Possible values include: debug, info, notice, warn, error, crit,
# alert, emerg.
LogLevel warn
CustomLog /var/log/apache2/access.log combined
Alias /doc/ "/usr/share/doc/"
<Directory "/usr/share/doc/">
Options Indexes MultiViews FollowSymLinks
AllowOverride None
Order deny,allow
Deny from all
Allow from 127.0.0.0/255.0.0.0 ::1/128
</Directory>
</VirtualHost>
代码: 全选
#!/usr/bin/python
# -*- coding: utf-8 -*-
import cgi
import cgitb
import os,sys,re
cgitb.enable()
server_line = 'Content-type: text/html\n'
def main():
print server_line
cmd = '/home/zzm/ProgramFiles/BALL/BALL-1.2/lcs/lcs -i 1dwd.pdb'
aa = os.popen(cmd).read()
print aa
if __name__ == '__main__':
main()
代码: 全选
<... 略 ...>
cgitb.enable()
server_line = 'Content-type: text/html\n'
# 显示设置环境变量
os.environ['LD_LIBRARY_PATH'] = '/home/zzm/ProgramFiles/BALL/BALL-1.2/lib/Linux-i386-g++_4.1.3:/usr/local/lib'
def main():
<... 略 ...>
1. shell中执行此命令的结果
代码: 全选
zzm@zzm-desktop:/var/www/cgi-bin$ /home/zzm/ProgramFiles/BALL/BALL-1.2/lcs/lcs -i 1dwd.pdb
Grid space: 1
Number of pockets: 3
Density: 0.5
SSS threshold: 6
Grid Size: (62 46 54)
Grid origin: (-31 -23 -27)
Mass center: (41.5615 20.6018 19.6968)
Number of grid points: 154008
Number of redundant pockets 364
Done!
Total used time: 0.860006 seconds
代码: 全选
Grid space: 1 Number of pockets: 3 Density: 0.5 SSS threshold: 6
3. shell中执行此cgi程序的运行结果
代码: 全选
zzm@zzm-desktop:/var/www/cgi-bin$ python test.cgi
Content-type: text/html
Grid space: 1
Number of pockets: 3
Density: 0.5
SSS threshold: 6
Grid Size: (62 46 54)
Grid origin: (-31 -23 -27)
Mass center: (41.5615 20.6018 19.6968)
Number of grid points: 154008
Number of redundant pockets 364
Done!
Total used time: 1.03 seconds
代码: 全选
zzm@zzm-desktop:~$ lcs -i 1dwd.pdb
lcs: error while loading shared libraries: libBALL.so: cannot open shared object file: No such file or directory
代码: 全选
[Wed Sep 01 14:12:57 2010] [error] [client 127.0.0.1] , referer: http://localhost/test.html
[Wed Sep 01 14:12:57 2010] [error] [client 127.0.0.1] ---------------------------------------------------, referer: http://localhost/test.html
[Wed Sep 01 14:12:57 2010] [error] [client 127.0.0.1] , referer: http://localhost/test.html
[Wed Sep 01 14:12:57 2010] [error] [client 127.0.0.1] FATAL: uncaught exception!, referer: http://localhost/test.html
[Wed Sep 01 14:12:57 2010] [error] [client 127.0.0.1] , referer: http://localhost/test.html
[Wed Sep 01 14:12:57 2010] [error] [client 127.0.0.1] ---------------------------------------------------, referer: http://localhost/test.html
[Wed Sep 01 14:12:57 2010] [error] [client 127.0.0.1] , referer: http://localhost/test.html
[Wed Sep 01 14:12:57 2010] [error] [client 127.0.0.1] ---------------------------------------------------, referer: http://localhost/test.html
[Wed Sep 01 14:12:57 2010] [error] [client 127.0.0.1] , referer: http://localhost/test.html
以上就是所有的错误信息,我是在sites-available/default中使用 SetEnv 来配置的shell环境变量,似乎传递过去了,但是如同上面提到的那样,程序执行一半就停止了,这是为什么呢?
另外,我试验了在 httpd.conf 和 default 文件里面分别都配置了 SetEnv 和 PassEnv, 如下:
代码: 全选
zzm@zzm-desktop:/etc/apache2$ more httpd.conf
DirectoryIndex index.html index.html.var index.htm
AddType text/html .htm .html .py
AddHandler cgi-script .cgi .py
SetEnv LD_LIBRARY_PATH /home/zzm/ProgramFiles/BALL/BALL-1.2/lib/Linux-i386-g++_4.1.3
PassEnv LD_LIBRARY_PATH
zzm@zzm-desktop:/etc/apache2/sites-available$ more default
<VirtualHost *:80>
ServerAdmin [email protected]
SetEnv LD_LIBRARY_PATH /home/zzm/ProgramFiles/BALL/BALL-1.2/lib/Linux-i386-g++_4.1.3
PassEnv LD_LIBRARY_PATH
<... 以下省略 ...>
代码: 全选
$ sudo /etc/init.d/apache2 restart
* Restarting web server apache2
[Wed Sep 01 14:41:15 2010] [warn] PassEnv variable LD_LIBRARY_PATH was undefined
[Wed Sep 01 14:41:15 2010] [warn] PassEnv variable LD_LIBRARY_PATH was undefined
apache2: Could not reliably determine the server's fully qualified domain name, using 127.0.1.1 for ServerName
... waiting [Wed Sep 01 14:41:16 2010] [warn] PassEnv variable LD_LIBRARY_PATH was undefined
[Wed Sep 01 14:41:16 2010] [warn] PassEnv variable LD_LIBRARY_PATH was undefined
apache2: Could not reliably determine the server's fully qualified domain name, using 127.0.1.1 for ServerName [ OK ]