今天在AS3上安装个extman,结果连首页都打不开,提示错误如下:
 
":flock" is not exported by the  Can't continue after import errors at /usr/local/apache2/htdocs/extman/libs/Ext/Utils.pm line 15 BEGIN failed--compilation aborted at  

/usr/local/apache2/htdocs/extman/libs/Ext/Utils.pm line 15. Compilation failed in require at /usr/local/apache2/htdocs/extman/libs/Ext/CGI.pm line 18. BEGIN failed--compilation  

aborted at /usr/local/apache2/htdocs/extman/libs/Ext/CGI.pm line 18. Compilation failed in require at /usr/local/apache2/htdocs/extman/libs/Ext/MgrApp.pm line 22. BEGIN failed-

-compilation aborted at /usr/local/apache2/htdocs/extman/libs/Ext/MgrApp.pm line 22. Compilation failed in require at /usr/local/apache2/htdocs/extman/libs/Ext/MgrApp/Login.pm  

line 19. BEGIN failed--compilation aborted at /usr/local/apache2/htdocs/extman/libs/Ext/MgrApp/Login.pm line 19. Compilation failed in require at  

/usr/local/apache2/htdocs/extman/cgi/index.cgi line 19.

网上搜了一下,有同样的问题,却没有人解答。自己看了看程序里面的代码
/usr/local/apache2/htdocs/extman/libs/Ext/Utils.pm line 15
这里的内容是use Fcntl qw(SEEK_CUR :flock);
查了一下,这个函数是perl的文件锁功能。但是我之前在redhat AS4和AS5的机器上都没有遇到此问题,猜想可能是perl的版本低,与extman的程序中存在不兼容的情况。于是升级perl
系统中自带的perl是5.8.0的。为了安全起见。自己源码安装一个新的perl
./Configure -des -Dprefix=/usr/local/perl  
make && make install
安装好后运行
/usr/local/bin/perl -V
来看看,确认版本是否正确。
[@131.163 httpd-2.2.8]# /usr/local/bin/perl -V
Summary of my perl5 (revision 5 version 10 subversion 0) configuration:
  Platform:
安装好后需要安装DBI,DBD等perl模块,可以用在线安装的方法。
/usr/local/bin/perl -MCPAN -eshell

然后在cpan>>提示符下输入install DBI即可安装DBI模块,安装其他模块也类似,需要注意的是某些模块的名称是DBD::mysql这样的格式, 不要忘记中间的两个冒号
安装DBD::mysql的时候需要mysql的库文件和头文件,对于rpm包的mysql可以安装mysql-devel来解决
如果mysql是源码安装的,需要手动指定库文件的路径。这时用在线安装的方法无法成功。只能退出后手动安装。
wget [url]http://search.cpan.org/CPAN/authors/id/C/CA/CAPTTOFU/DBD-mysql-4.007.tar.gz[/url]
tar zxvf DBD-mysql-4.007.tar.gz
cd DBD-mysql-4.007
usr/local/bin/perl Makefile.PL \
--cflags=-I/usr/local/mysql/include/mysql \
--libs="-L/usr/local/mysql/lib/mysql -lmysqlclient -lz" \
--mysql_config=/usr/local/mysql/bin/mysql_config
make
make install
 
 
这里有3个参数来指定mysql的头文件,库函数文件,以及配置文件的位置。
安装完成后用/usr/local/bin/perdoc -l DBD::mysql看看是否正确安装了
apache以前编译的时候没有打开suexec功能。在编译的时候在configure后面加上--enable-suexec参数,可以打开suexec功能。但是我不想重新编译
那么可以用模块的形式来增加这个功能。
首先是找到原来编译apache的源码目录,如果没有了,可以重新下载一个相同版本的apache的源码解压缩开
先进行清理
make distclean

然后找一下mod_suexec.c的目录
find . -name "mod_suexec.c"
./modules/generators/mod_suexec.c


切换到mod_suexec.c的目录中执行:
cd ./modules/generators/mod_suexec.c
/usr/local/apache2/bin/apxs -c mod_suexec.c
/usr/local/apache2/bin/apxs -i -a -n suexec ./.libs/mod_suexec.so
退回到apache2的源码目录中执行:
#./configure --enable-suexec --with-suexec-caller=daemon

注。这里不要忘记了--with-suexec-caller=daemon,否则到后面你又要重新来过
#make suexec

#make install-suexec
此时mod_suexec.so就已经生成并且被安装到apache的modules目录下了,并且httpd.conf中也自动添加了
LoadModule suexec_module              modules/mod_suexec.so
检查一下上述改动是否已经成功
[@131.163 httpd-2.2.8]# ls /usr/local/apache2/modules/ -l
total 36
-rw-r--r--    1 root     root         8998 Jun 18 17:35 httpd.exp
-rwxr-xr-x    1 root     root        22509 Jun 18 17:38 mod_suexec.so

如果没有mod_suexec.so,则需要手动从源码目录中将它复制过去,如果源码目录中没有,则要检查上面的编译过程中是否正确。
[@131.163 httpd-2.2.8]# grep "mod_suexec.so" /usr/local/apache2/conf/httpd.conf
LoadModule suexec_module      modules/mod_suexec.so
如果没有这一行则手动添加到httpd.conf中
重启apache就可以启用suexec了! 这里建议用apachectl stop;apachectl start而不是apachectl restart的方法,后者有可能导致apache无法正常启动
前面perl的新版本安装好了。那么如何让它发挥作用呢,方法很多了,有人喜欢把/usr/bin/perl删除,然后做一个/usr/local/bin/perl->/usr/bin/perl的软链接
但是我是在生产环境上,为了不干扰原来的程序。就辛苦一下吧。进入到extman的cgi目录下,打开出现文章开头错误提示的cgi文件,如index.cgi
修改第一行
#!/usr/bin/perl
这里就是定义的perl的解释器。把这个改成我们自己编译的perl的版本#!/usr/local/bin/perl
然后再次刷新页面。终于可以成功显示出extman的界面了。(眼泪哗哗的)
对于其他报错的页面都可以同样的办法。如果要看extman的图形日志还需要安装rrdtool。