Perl配置以及升级导致的问题

2016-11-23 09:44:42来源:作者:阿蒙的礼物人点击

第七城市

备注:以下文字是配置Perl过程中的笔记,尚不系统,仅供备查。

参考: https://amon.org/perl.html

要让CGI程序能正常运作,必须配置Apache以允许CGI的执行,配置Apache(httpd.conf)设置cgi目录的方法如下。

方法一:ScriptAlias

ScriptAlias指令使Apache允许执行一个特定目录中的CGI程序。当客户端请求此特定目录中的资源时,Apache假定其中所有的文件都是CGI程序并试图运行它。

配置参考如下:

<IfModule alias_module> ScriptAlias /cgi-bin/ "/usr/local/apache2/cgi-bin/"</IfModule> <Directory "/usr/local/apache2/cgi-bin"> AllowOverride None Options None Order allow,deny Allow from all #千万别忘了这个配置</Directory>

如果Apache被安装到默认位置,默认的配置文件httpd.conf中就会有上述配置。ScriptAlias与Alias指令非常相似,都是定义了映射到一个特定目录的URL前缀,两者一般都用于指定位于DocumentRoot以外的目录,其不同之处是ScriptAlias又多了一层含义,即URL前缀后面的任何文件都被视为CGI程序。所以,上述例子会指示Apache:任何以/cgi-bin/开头的资源都将映射到/usr/local/apache2/cgi-bin/目录中,且视之为CGI程序。

例如,如果有URL为 http://www.example.com/cgi-bin/test.pl的请求,Apache会试图执行/usr/local/apache2/cgi-bin/test.pl文件并返回其输出。当然,这个文件必须存在而且可执行,并以特定的方法产生输出,否则Apache返回一个出错消息。

方法二:ScriptAlias目录以外的CGI

由于安全原因,CGI程序通常被限制在ScriptAlias指定的目录中,这样,管理员就可以严格控制谁可以使用CGI程序。但是,如果采取了恰当的安全措施,则没有理由不允许其他目录中的CGI程序运行。比如,你可能希望用户在UserDir指定的宿主目录中存放页面,而他们有自己的CGI程序,但无权访问cgi-bin目录,这样,就产生了运行其他目录中CGI程序的需求。

允许CGI在任意目录执行需要两个步骤:

#第一步:指定特定文件后缀为CGI文件(即,告诉服务器哪些文件是CGI文件)。

有2种方法:方法一是定义MIME类型为application/x-httpd-cgi,方法二是使用 AddHandler 或 SetHandler 指令

例如,下面的AddHandler指令告诉服务器所有带有cgi或pl后缀的文件是CGI程序。(添加到配置文件的最后面即可)

AddType application/x-httpd-cgi .cgi .pl #方法一AddHandler cgi-script .cgi .pl #方法二

#第二步:设置CGI的目录属性,必须在Options指令中启用ExecCGI选项。

可以在主配置文件中,使用Options指令显式地允许特定目录中CGI的执行:

<Directory "/usr/local/apache2/cgi-bin"> Options ExecCGI AllowOverride None Order allow,deny Allow from all</Directory> 方法三:.htaccess文件

.htaccess指南示范了怎样在没有权限修改httpd.conf文件的情况下激活CGI程序。

#用户目录

为了允许用户目录中所有以”.cgi”结尾的文件作为CGI程序执行,你可以使用以下配置:

<Directory /home/*/public_html> Options +ExecCGI AddHandler cgi-script .cgi </Directory>

如果你想在用户目录中指定一个cgi-bin子目录,其中所有的文件都被当作CGI程序,你可以这样配置:

<Directory /home/*/public_html/cgi-bin> Options ExecCGI SetHandler cgi-script </Directory>

#编写CGI程序

编写CGI程序和”常规”程序之间有两个主要的不同。

首先,在CGI程序的所有输出前面必须有一个HTTP的MIME类型的头,对客户端指明所接收内容的类型,大多数情况下,像这样:

Content-type: text/html

其次,输出要求是HTML形式的,或者是浏览器可以显示的其他某种形式。多数情况下,输出是HTML形式的,但偶然也会输出一个gif图片或者其他非HTML的内容。

除了这两点,编写CGI程序和编写其他程序大致相同。

#第一个CGI程序

这个CGI程序的例子在浏览器中打印一行文字。把下列存为first.pl文件,并放在你的cgi-bin目录中。

#!/usr/bin/perl print "Content-type: text/html/n/n"; print "Hello, World.";

即使不熟悉Perl语言,你也应该能看出它干了什么。第一行,告诉Apache这个文件可以用/usr/bin/perl(或者任何你正在使用的shell)解释并执行。第二行,打印上述要求的内容类型说明,并带有两个换行,在头后面留出空行,以示HTTP头的结束。第三行,打印文字”Hello, World.”。程序到此结束。

打开你喜欢的浏览器并输入地址:

http://www.example.com/cgi-bin/first.pl

或者是你存放程序的其他位置,就可以在浏览器窗口中看到一行:Hello, World. 。虽然并不怎么激动人心,但是一旦这个程序能正常运行,那么就可能运行其他任何程序。

升级

如果你对perl模块版本要求比较高,希望是新版的那么请按照以下安装:

yum install perlyum install cpan

CentOS7.0默认内置Perl5.16.3,一般情况下不需要升级,而且升级可能导致一系列问题。

因为部署 《怎样通过SNI实现一个独立IP安装多个SSL证书》在编译关键包gnutls-3.5.1的时候,提示至少需要Perl5.18.0才能支持。所以有以下的琢磨。

以下经实测完全正常。

1. 先安装所有关于Perl的包: yum install perl* 2. 从源码编译安装Perl:

下载: http://www.cpan.org/src/5.0/

最新版是perl-5.25.1(2016-05-20),但是下载后编译时提示此版不适合生产环境。所以选择安装perl-5.24.0(2016-05-09)。

wget http://www.cpan.org/src/5.0/perl-5.24.0.tar.gztar zxvf perl-5.24.0.tar.gz && cd perl-5.24.0mkdir -p /usr/local/perlls /usr/local/./Configure -des -Dprefix=/usr/local/perl -Dusethreads -Uinstalluserbinperl -Dcc=gccmake && make test && make install

输出:

... /usr/local/perl/man/man1/zipdetails.1 /usr/local/perl/man/man1/zipdetails.1

安装完成后 perl 所在目录为 /usr/local/perl,perl 执行文件在 /usr/local/bin里。

替换系统原有的版本:

mv /usr/bin/perl /usr/bin/perl.bakln -s /usr/local/perl/bin/perl /usr/bin/perl

查看版本:

perl -v

输出:

This is perl 5, version 24, subversion 0 (v5.24.0) built for x86_64-linuxCopyright 1987-2016, Larry WallPerl may be copied only under the terms of either the Artistic License or theGNU General Public License, which may be found in the Perl 5 source kit.Complete documentation for Perl, including FAQ lists, should be found onthis system using "man perl" or "perldoc perl". If you have access to theInternet, point your browser at http://www.perl.org/, the Perl Home Page.

编辑一个简单的测试脚本test:

#!/usr/local/bin/perlprint "Hello, world!/n";

退出,输入:

perl test

如果输出“Hello,world!”,表面Perl运转正常。

参考: http://akinlau.com/linux%E4%B8%8B%E7%BC%96%E8%AF%91%E5%AE%89%E8%A3%85perl5-16-1/

Perl升级成功!

3. 报错处理 报错1:进入服务器时,Can’t locate local/lib.pm Can't locate local/lib.pm in @INC (you may need to install the local::lib module) (@INC contains: /usr/local/perl/lib/site_perl/5.24.0/x86_64-linux /usr/local/perl/lib/site_perl/5.24.0 /usr/local/perl/lib/5.24.0/x86_64-linux /usr/local/perl/lib/5.24.0 .).BEGIN failed--compilation aborted.

参考: http://stackoverflow.com/questions/16702642/cant-locate-local-lib-pm-in-inc-at-usr-share-perl-5-14-cpan-firsttime-pm

参考: https://github.com/jordansissel/fpm/issues/485

执行命令:

cpanm local::lib.pm

再次进入shell时,输出:

Attempting to create directory /root/perl5 报错2:Can’t locate Text/Unidecode.pm

执行命令:

cpanm Text/Unidecode.pm

1和2这种报错都是因为Perl升级导致的,找不到就重新CPAN安装。

参考: http://amon.org/how-to-install-perl-modules-using-cpan.html

报错3:autoreconf时报错

执行命令:

autoreconf -i && automake && autoconf

报错:

This Perl not built to support threadsCompilation failed in require at /usr/share/automake-1.13/Automake/ChannelDefs.pm line 23....

因为Perl5.8.0之后的版本,默认配置都是不启用多线程。threads模块也从CPAN下载装好了也没有用。只能重新编译。

参考: http://blog.csdn.net/zzq900503/article/details/16948349

参考: http://blog.csdn.net/zzq900503/article/details/12910619

在设置配置时用以下这句,而不是默认配置:

./Configure -des -Dprefix=/usr/local/perl -Dusethreads -Uinstalluserbinperl -Dcc=gcc 报错4:因为Perl版本升级导致autoreconf时报错

执行命令:

autoreconf -i && automake && autoconf

报错:

...Unescaped left brace in regex is deprecated, passed through in regex; marked by <-- HERE in m//${ <-- HERE ([^ /t=:+{}]+)}/ at /usr/bin/automake line 3935....

原因:

“In perl v5.22, using a literal { in a regular expression was deprecated, and will emit a warning if it isn’t escaped: /{. In v5.26, this won’t just warn, it’ll cause a syntax error.

The author of the software will need to fix this before the 5.26 release. For now, you can safely ignore this warning.”

参考: http://unix.stackexchange.com/questions/238539/automake-error-unescaped-left-brace-in-regex-is-deprecated

参考: http://search.cpan.org/dist/perl-5.22.0/pod/perldelta.pod#A_literal_%22{%22_should_now_be_escaped_in_a_pattern

这就需要升级automake和autoconf。

升级autoconf

参考: http://zhaohe162.blog.163.com/blog/static/3821679720147276238862/

查看版本:

rpm -qf /usr/bin/autoconf

输出:

autoconf-2.63-5.1.el6.noarch

首先卸载当前版本:

rpm -e --nodeps autoconf-2.63

安装最新版本

wget ftp://ftp.gnu.org/gnu/autoconf/autoconf-2.69.tar.gztar zxvf autoconf-2.69.tar.gz && cd autoconf-2.69./configure --prefix=/usr/make && make install

查看当前版本:

/usr/bin/autoconf -V

输出:

autoconf (GNU Autoconf) 2.69Copyright (C) 2012 Free Software Foundation, Inc.License GPLv3+/Autoconf: GNU GPL version 3 or later<http://gnu.org/licenses/gpl.html>, <http://gnu.org/licenses/exceptions.html>This is free software: you are free to change and redistribute it.There is NO WARRANTY, to the extent permitted by law.Written by David J. MacKenzie and Akim Demaille.

至此,autoconf已升级到2.69。

升级automake

参考: http://man.chinaunix.net/linux/lfs/htmlbook/chapter06/automake.html

查看版本:

rpm -qf /usr/bin/automake

输出:

automake-1.13.4-3.el7.noarch

首先卸载当前版本:

rpm -e --nodeps automake-1.13.4

下载: ftp://ftp.gnu.org/gnu/automake/

最新版是automake-1.15(2015-01-05)

wget ftp://ftp.gnu.org/gnu/automake/automake-1.15.tar.gztar zxvf automake-1.15.tar.gz && cd automake-1.15./configuremake && make install

查看当前版本:

automake --version

输出:

Unescaped left brace in regex is deprecated, passed through in regex; marked by <-- HERE in m//${ <-- HERE ([^ /t=:+{}]+)}/ at /usr/local/bin/automake line 3936.automake (GNU automake) 1.15Copyright (C) 2014 Free Software Foundation, Inc.License GPLv2+: GNU GPL version 2 or later <http://gnu.org/licenses/gpl-2.0.html>This is free software: you are free to change and redistribute it.There is NO WARRANTY, to the extent permitted by law.Written by Tom Tromey <tromey@redhat.com> and Alexandre Duret-Lutz <adl@gnu.org>.

参考: http://serverfault.com/questions/731539/automake-error-unescaped-left-brace-in-regex-is-deprecated/731569

参考: https://github.com/perl-carton/carton/pull/204/commits/8ab892dc80b8b33ae3bc4a01e5e90c6f3a5b3488

参考: https://github.com/cmhughes/latexindent.pl/commit/ce8113329500adb5a65cbccbd9192a05a74f9842

所以只需要 /usr/local/bin/automake 的第3936行的 { 之前添加一个 / ,注意有2个 { 。

$text =~ s//$/{([^ /t=:+/{}]+)}/substitute_ac_subst_variables_worker ($1)/ge;

查看当前版本:

automake --version

输出:

automake (GNU automake) 1.15Copyright (C) 2014 Free Software Foundation, Inc.License GPLv2+: GNU GPL version 2 or later <http://gnu.org/licenses/gpl-2.0.html>This is free software: you are free to change and redistribute it.There is NO WARRANTY, to the extent permitted by law.Written by Tom Tromey <tromey@redhat.com> and Alexandre Duret-Lutz <adl@gnu.org>.

至此,autoconf已升级到1.15。

检查 /etc/ld.so.conf 有没有 /usr/local/lib 这一行,没有的话 添加,并执行:

ldconfig

Perl升级导致的问题,也会影响通过 git clone 方式编译安装过程,必须升级 automake 和 autoconf 才能解决,。参考 《怎样在CentOS上编译安装Apache+OpenSSL+MySQL+PHP7+GD》中 nghttp2 的编译安装过程中出现2个和字符有关的报错。

报错:macro ‘AM_PATH_XML2’ not found in library

重新编译spdylay时autoreconf,输入:

autoreconf -i

输出:

configure.ac:184: warning: macro 'AM_PATH_XML2' not found in libraryconfigure.ac:184: error: possibly undefined macro: AM_PATH_XML2 If this token and others are legitimate, please use m4_pattern_allow. See the Autoconf documentation.autoreconf: /usr/bin/autoconf failed with exit status: 1

参考: http://stackoverflow.com/questions/1429896/how-to-point-autoconf-automake-to-non-standard-packages

建议A:安装CPPPUNIT:

yum -y install cppunit-devel

建议B:

export ACLOCAL_PATH="/usr/share/aclocal/:/usr/local/share/aclocal"

至少报错消失,稍后再确认。

报错:lib/Makefile.am:35: error: Libtool library used but ‘LIBTOOL’ is undefined

重新编译nghttp2时autoreconf,输入:

autoreconf -i

输出:

...lib/Makefile.am:35: error: Libtool library used but 'LIBTOOL' is undefinedlib/Makefile.am:35: The usual way to define 'LIBTOOL' is to add 'LT_INIT'lib/Makefile.am:35: to 'configure.ac' and run 'aclocal' and 'autoconf' again.lib/Makefile.am:35: If 'LT_INIT' is in 'configure.ac', make surelib/Makefile.am:35: its definition is in aclocal's search path.src/Makefile.am:156: error: library used but 'RANLIB' is undefinedsrc/Makefile.am:156: The usual way to define 'RANLIB' is to add 'AC_PROG_RANLIB'src/Makefile.am:156: to 'configure.ac' and run 'autoconf' again.src/Makefile.am:231: error: Libtool library used but 'LIBTOOL' is undefinedsrc/Makefile.am:231: The usual way to define 'LIBTOOL' is to add 'LT_INIT'src/Makefile.am:231: to 'configure.ac' and run 'aclocal' and 'autoconf' again.src/Makefile.am:231: If 'LT_INIT' is in 'configure.ac', make suresrc/Makefile.am:231: its definition is in aclocal's search path.third-party/Makefile.am:30: error: Libtool library used but 'LIBTOOL' is undefinedthird-party/Makefile.am:30: The usual way to define 'LIBTOOL' is to add 'LT_INIT'third-party/Makefile.am:30: to 'configure.ac' and run 'aclocal' and 'autoconf' again.third-party/Makefile.am:30: If 'LT_INIT' is in 'configure.ac', make surethird-party/Makefile.am:30: its definition is in aclocal's search path.autoreconf: automake failed with exit status: 1

参考: http://www.2cto.com/os/201308/237954.html

参考: http://stackoverflow.com/questions/15703522/libtool-library-used-but-libtool-is-undefined

参考: http://stackoverflow.com/questions/18978252/error-libtool-library-used-but-libtool-is-undefined/18980043#18980043

参考: http://stackoverflow.com/questions/24233721/build-m4-autoconf-automake-libtool-on-unix

参考: http://www.cnblogs.com/subo_peng/p/4688265.html

查看aclocal的路径:

aclocal --print-ac-dir

输出:

/usr/local/share/aclocal

在 Makefile.am 的末尾添加:

ACLOCAL_AMFLAGS = -I m4

然后运行:

aclocallibtoolize

如果报错:

aclocallibtoolize

运行:

autoreconf -ivf

报错消失。

第七城市

最新文章

123

最新摄影

微信扫一扫

第七城市微信公众平台