Linux Apache CGI访问网站无法打开lib
Linux Apache CGI can't open lib when visiting the website
我正在使用 unixODBC 和 Apache CGI 在 Linux 上构建数据库网站。我在测试数据库的查询时出现如下问题
Connect Error
[01000] [unixODBC][Driver Manager]Can't open lib '/usr/local/lib/psqlodbcw.so' : file not found (0)
以上信息出现在我尝试使用Windows访问该网站的另一台计算机上。
http://serverIP/cgi-bin/website.cgi?first=1
奇怪的是,当我运行这个CGI文件直接放在Linux服务器上时,它执行正常。即成功连接数据库并查询输出结果。 isql
连接成功也证明可以连接数据库
等价于以下
root@VM-4-11-ubuntu:~# /var/www/cgi-bin/website.cgi
Content-type:text/html
<html>
<head>
<title>test button</title>
</head>
<body>
<p>Connected!</p>
<p>SELECT * FROM people WHERE id = 1;<p>
<p>id = 1 name = Tom</p>
</body>
</html>
// -----
root@VM-4-11-ubuntu:~# curl http://localhost/cgi-bin/website.cgi
<html>
<head>
<title>test button</title>
</head>
<body>
<p>Connect Error</p>
<p>[01000] [unixODBC][Driver Manager]Can't open lib '/usr/local/lib/psqlodbcw.so' : file not found (0)</p>
</body>
</html>
下面是输出错误信息的代码
// In DataBase's constructor
// ...
V_OD_erg = SQLConnect(V_OD_hdbc, dataSource, SQL_NTS,
usrName, SQL_NTS, password, SQL_NTS);
if ((V_OD_erg != SQL_SUCCESS) && (V_OD_erg != SQL_SUCCESS_WITH_INFO)) {
noErr = false;
printf("<p>Connect Error</p>\n");
showDBCErr(V_OD_erg);
}
// ...
void DataBase::showDBCErr(SQLRETURN retCode) {
HandleDiagnosticRecord(V_OD_hdbc, SQL_HANDLE_DBC, retCode);
}
// ...
void DataBase::HandleDiagnosticRecord(SQLHANDLE hHandle, SQLSMALLINT hType,
RETCODE RetCode) {
SQLSMALLINT iRec = 0;
SQLINTEGER iError;
SQLCHAR wszMessage[1000];
SQLCHAR wszState[SQL_SQLSTATE_SIZE + 1];
if (RetCode == SQL_INVALID_HANDLE) {
printf("<p>Invalid handle!</p>");
return;
}
while (SQLGetDiagRec(hType, hHandle, ++iRec, wszState, &iError, wszMessage,
(SQLSMALLINT)(sizeof(wszMessage) / sizeof(SQLCHAR)),
(SQLSMALLINT*)NULL) == SQL_SUCCESS) {
// Hide data truncated..
if (strcmp((const char*)wszState, "01004")) {
printf("<p>[%5.5s] %s (%d)</p>", wszState, wszMessage, iError);
}
}
}
// in /usr/local/etc/odbcinst.ini
[ODBC]
Trace=Yes
TraceFile=~/unixODBCLog/odbctrace.log
[GaussMPP]
Driver64=/usr/local/lib/psqlodbcw.so
setup=/usr/local/lib/psqlodbcw.so
// in ~/.bashrc
# ...
export LD_LIBRARY_PATH=/usr/local/lib/:$LD_LIBRARY_PATH
export ODBCSYSINI=/usr/local/etc
export ODBCINI=/usr/local/etc/odbc.ini
root@VM-4-11-ubuntu:~# odbcinst -j
unixODBC 2.3.7pre
DRIVERS............: /usr/local/etc/odbcinst.ini
SYSTEM DATA SOURCES: /usr/local/etc/odbc.ini
FILE DATA SOURCES..: /usr/local/etc/ODBCDataSources
USER DATA SOURCES..: /usr/local/etc/odbc.ini
SQLULEN Size.......: 8
SQLLEN Size........: 8
SQLSETPOSIROW Size.: 8
我不知道如何解决这个问题。如有必要,我可以提供更多信息。
好的,伙计们,我已经解决了这个问题。就像一些程序员老兄说的那样,“通常不要使用 root 用户进行任何类型的开发,这会给你一种错觉,以为一切正常”。当我将 tar
用作 ubuntu
(而不是 root
)时,系统显示相同的错误“找不到文件”。然后我意识到安装为root
的ODBC库可能对普通用户不可用。所以我重新安装为 ubuntu
。有效!
谢谢,@Some 程序员,@Alan Birtles,@Stephen Ostermiller
我正在使用 unixODBC 和 Apache CGI 在 Linux 上构建数据库网站。我在测试数据库的查询时出现如下问题
Connect Error
[01000] [unixODBC][Driver Manager]Can't open lib '/usr/local/lib/psqlodbcw.so' : file not found (0)
以上信息出现在我尝试使用Windows访问该网站的另一台计算机上。
http://serverIP/cgi-bin/website.cgi?first=1
奇怪的是,当我运行这个CGI文件直接放在Linux服务器上时,它执行正常。即成功连接数据库并查询输出结果。 isql
连接成功也证明可以连接数据库
等价于以下
root@VM-4-11-ubuntu:~# /var/www/cgi-bin/website.cgi
Content-type:text/html
<html>
<head>
<title>test button</title>
</head>
<body>
<p>Connected!</p>
<p>SELECT * FROM people WHERE id = 1;<p>
<p>id = 1 name = Tom</p>
</body>
</html>
// -----
root@VM-4-11-ubuntu:~# curl http://localhost/cgi-bin/website.cgi
<html>
<head>
<title>test button</title>
</head>
<body>
<p>Connect Error</p>
<p>[01000] [unixODBC][Driver Manager]Can't open lib '/usr/local/lib/psqlodbcw.so' : file not found (0)</p>
</body>
</html>
下面是输出错误信息的代码
// In DataBase's constructor
// ...
V_OD_erg = SQLConnect(V_OD_hdbc, dataSource, SQL_NTS,
usrName, SQL_NTS, password, SQL_NTS);
if ((V_OD_erg != SQL_SUCCESS) && (V_OD_erg != SQL_SUCCESS_WITH_INFO)) {
noErr = false;
printf("<p>Connect Error</p>\n");
showDBCErr(V_OD_erg);
}
// ...
void DataBase::showDBCErr(SQLRETURN retCode) {
HandleDiagnosticRecord(V_OD_hdbc, SQL_HANDLE_DBC, retCode);
}
// ...
void DataBase::HandleDiagnosticRecord(SQLHANDLE hHandle, SQLSMALLINT hType,
RETCODE RetCode) {
SQLSMALLINT iRec = 0;
SQLINTEGER iError;
SQLCHAR wszMessage[1000];
SQLCHAR wszState[SQL_SQLSTATE_SIZE + 1];
if (RetCode == SQL_INVALID_HANDLE) {
printf("<p>Invalid handle!</p>");
return;
}
while (SQLGetDiagRec(hType, hHandle, ++iRec, wszState, &iError, wszMessage,
(SQLSMALLINT)(sizeof(wszMessage) / sizeof(SQLCHAR)),
(SQLSMALLINT*)NULL) == SQL_SUCCESS) {
// Hide data truncated..
if (strcmp((const char*)wszState, "01004")) {
printf("<p>[%5.5s] %s (%d)</p>", wszState, wszMessage, iError);
}
}
}
// in /usr/local/etc/odbcinst.ini
[ODBC]
Trace=Yes
TraceFile=~/unixODBCLog/odbctrace.log
[GaussMPP]
Driver64=/usr/local/lib/psqlodbcw.so
setup=/usr/local/lib/psqlodbcw.so
// in ~/.bashrc
# ...
export LD_LIBRARY_PATH=/usr/local/lib/:$LD_LIBRARY_PATH
export ODBCSYSINI=/usr/local/etc
export ODBCINI=/usr/local/etc/odbc.ini
root@VM-4-11-ubuntu:~# odbcinst -j
unixODBC 2.3.7pre
DRIVERS............: /usr/local/etc/odbcinst.ini
SYSTEM DATA SOURCES: /usr/local/etc/odbc.ini
FILE DATA SOURCES..: /usr/local/etc/ODBCDataSources
USER DATA SOURCES..: /usr/local/etc/odbc.ini
SQLULEN Size.......: 8
SQLLEN Size........: 8
SQLSETPOSIROW Size.: 8
我不知道如何解决这个问题。如有必要,我可以提供更多信息。
好的,伙计们,我已经解决了这个问题。就像一些程序员老兄说的那样,“通常不要使用 root 用户进行任何类型的开发,这会给你一种错觉,以为一切正常”。当我将 tar
用作 ubuntu
(而不是 root
)时,系统显示相同的错误“找不到文件”。然后我意识到安装为root
的ODBC库可能对普通用户不可用。所以我重新安装为 ubuntu
。有效!
谢谢,@Some 程序员,@Alan Birtles,@Stephen Ostermiller