Eros Live ? Use PassEnv to Pass Environment V...
今天在迁移服务器的时候遇到一个很诡异的问题,原来一切正常的程序在新的服务器上中文乱码。
一段 ruby 写的 cgi script 通过 DBI 访问 oracle 数据库, 将查询得到的记录输出到页面。数据库编码是 gbk, 需要通过 Iconv.conv('utf-8', 'gbk', str) 将字符串转换成 utf-8 输出。oracle 相关的环境变量已经设置好。
export LANG=zh_CN.UTF-8
export NLS_LANG=American_America.zhs16cgb231280
export ORACLE_HOME=/home/oracle/oracle/product/10.2.0/client_1
export LD_LIBRARY_PATH=/home/oracle/oracle/product/10.2.0/client_1/lib:$LD_LIBRARY_PATH
在 shell 里执行该 cgi script 中文能够正常显示,但是通过 apache (非root, oracle用户)执行却出现乱码,而且在 apache 下中文都变成了问号。
初步判断是数据库中的字符在目标字符集下没有对应的代码,通常情况就是 iso-8859-1, 那么估计是设置的 oracle 客户端字符集环境变量没有被带到 apache 执行环境中。在网上 google 到如下:
see http://lamp.linux.gov.cn/Apache/ApacheMenu/mod/mod_env.html#passenv
PassEnv 指令
说明
传送shell中的环境变量语法
PassEnv env-variable [env-variable] ...
作用域
server config, virtual host, directory, .htaccess覆盖项
FileInfo状态
基本(B)模块
mod_env从调用
httpd
进程所在的shell中,指定一个或者更多个环境变量,传送到CGI脚本和SSI页面。例如:示例
PassEnv LD_LIBRARY_PATH
SetEnv 指令
说明
设置环境变量语法
SetEnv env-variable value
作用域
server config, virtual host, directory, .htaccess覆盖项
FileInfo状态
基本(B)模块
mod_env设置一个环境变量,该变量将会传送到CGI脚本和SSI页面。例如:
示例
SetEnv SPECIAL_PATH /foo/bin
这样在 $APACHE_HOME/conf/httpd.conf 中加入
PassEnv ORACLE_HOME
PassEnv LD_LIBRARY_PATH
PassEnv LANG
PassEnv NLS_LANG
或
SetEnv LANG zh_CN.UTF-8
SetEnv NLS_LANG American_America.zhs16cgb231280
SetEnv ORACLE_HOME /home/oracle/oracle/product/10.2.0/client_1
SetEnv LD_LIBRARY_PATH /home/oracle/oracle/product/10.2.0/client_1/lib:$LD_LIBRARY_PATH
问题都得到了解决