编译安装apache-2.4.18

apache安装时, 必须要apr和apr-util, 这两个包是必须的

当下载apache的版本过高, 如: apache-2.4.18, 那么要求的apr或apu=apr-util版本将至少在1.4 later, 原来的1.3将不能使用.
这时,就只有重新下载并安装高版本的apr, apu的源码包, 这两个软件都支持relocate, 安装时指定: ./configure --prefix=/usr/local/apr154类似的

报错configure: error: pcre-config for libpcre not found.
什么是pcre: pc-re: perl compatible regular expressions 与perl兼容的正则表达式.
为什么需要pcre? 因为http的编译选项中有--with-rewrite=shared, 地址重写, 需要正则支持.
perl语言兼容正则表达式,是一个用C语言编写的正则表达式函数库

当安装号pcre210后, 仍然报错找不到pcre-config?
[root@localhost pcre210]# ls
bin include lib share
[root@localhost pcre210]# cd bin
[root@localhost bin]# ls
pcre2-config pcre2grep pcre2test
[root@localhost bin]# cp pcre2-config pcre2-config.bak
[root@localhost bin]# mv pcre2-config pcre-config
[root@localhost bin]#
原因是: BECAUSE 这时候的configure只认 pcre-config这个配置文件名, 所以改一下 pcre2-config-->pcre-config文件名称就好了.

./configure会自动忽略错误的配置参数, 所以要判断 配置/编译/安装过程是否正确, ** 都可以在命令执行完毕后检查一下: echo $?

这时, httpd完整的编译命令就是
/configure --with-apr=/usr/local/apr-152 --with-apr-util=/usr/local/apr-util-154 --with-pcre=/usr/local/pcre210 --enable-dav --disabe-usrdir --enable-so --enable-deflate=shared --enable-expires=shared --enable-rewrite=shared
指定文件的时候, 不一定非要指定到精确的路径, 只要指定到它的 "安装目录"就可以.

但是! 将pcre2-config改名为pcre-config出现很多关于util-pcre的错误,而且是文件内部 关于函数的错误 ,这个就很麻烦了!###

错误如下所示:
server/.libs/libmain.a(util_pcre.o): In function ap_regfree': /opt/httpd-2.4.18/server/util_pcre.c:104: undefined reference to pcre_free'
至此, 感觉有时候,自己编译安装,而且需要的支持功能更多的时候, 还是比较麻烦的.

所以, 如果没有特殊的需求, 还是yum安装比较容易, 因为自己手动的来解决dependencies确实比较麻烦的
看看安装一些较低版本的apache怎么样?

下载httpd-2.2.31的源码包中, 就已经包含了 srclib/apr, apr-util, pcre目录,以及相对应的安装文件.
而httpd-2.4.18中的srclib/目录下, 就没有apr, apu, pcre...

配置./configure httpd的三个方面中, 实际上最重要的是: 启用哪些功能? --enable部分

其中 --prefix, --sysconfdir等部分保持默认的就可以,
    --enable...启用功能, 如--enable-rewrite=shared
    而--with...是为了支持enable功能,而必须要提供的库和配置文件, 比如,你--enable-rewrite就需要提供--with-pcre=PATH, 但是
        如果你不需要rewrite功能,大可不必提供--with-pcre.
            ** 而且, 如果源码包中本身就包含了相应的 --enable支持包/库(一般在 srclib/ 目录中, 那么甚至可以不用指定 --with-pcre等等)

总之, 用httpd-2.2.31源码安装就很容易安装成功, 而且不必自己去下载寻找额外的支持包/库.
./configure --enable-dav --enable-so --enable-deflate=shared --enable-expires=shared --enable-rewrite=shared

xargs命令: /usr/bin/xargs

场景: 有些命令支持通配符, 有些命令不支持通配符. 在不支持通配符的命令中, 要一次性操作多个对象:文件, 参数等等, 就可以使用xargs
命令, 将文件列表/ 参数列表传递给后面的 命令, 让命令循环处理 列表中的 文件/参数对象.
如: rpm -e apr* 这样的命令是错误的, 提示 没有apr* 这样的包
要批量卸载rpm包, 就要用xargs:
rpm -qa| grep apr | xargs rpm -e [--nodeps]

实际操作显示:

[root@localhost Desktop]# rpm -qa | grep apr
apr-devel-1.3.9-5.el6_2.i686
apr-util-pgsql-1.3.9-3.el6_0.1.i686
apr-util-odbc-1.3.9-3.el6_0.1.i686
apr-util-sqlite-1.3.9-3.el6_0.1.i686
apr-util-mysql-1.3.9-3.el6_0.1.i686
apr-util-ldap-1.3.9-3.el6_0.1.i686
apr-util-devel-1.3.9-3.el6_0.1.i686
[root@localhost Desktop]# rpm -qa | grep apr |xargs rpm -e 
error: Failed dependencies:
	apr-devel is needed by (installed) httpd-devel-2.2.15-47.el6.centos.i686
	apr-util-devel is needed by (installed) httpd-devel-2.2.15-47.el6.centos.i686
[root@localhost Desktop]# rpm -qa | grep apr |xargs rpm -e --nodeps
[root@localhost Desktop]# rpm -qa | grep apr
[root@localhost Desktop]# 

用xargs批量更改件名称

  • mv 命令只能一个文件一个文件的更改名称, 也不接受通配符*
  • 要批量更改名称,xargs命令 的 **-i **参数是必不可少的, 它表示用后面给定的符号 来代替前面的文件列表
  • 其中 -p是询问-yes or -no, -t是打印要执行的命令
  • 替换符合好像只能是大括号 {}, 不能是?, [], ()等等.
    [root@localhost Desktop]# ls | xargs -t -p -i  mv {} {}.bak
    ## 如果不加 -t 将不 **打印** 要执行的命令
    ## 如果不加 -p, 将不 **提示prompt** 是否 -y, -n
    ## 如果不加 -i, 将出错,因为 -i是替换!
-p     **Prompt** the user about whether to run each command line and read a line from the terminal.  Only run the command line if the re-
              sponse starts with ‘y’ or ‘Y’.  **Implies -t**.
       --verbose
       -t     **Print**  the command line on the standard error output before executing it.

使用xargs的一点心得: 最好是切换到你要操作的目录中,否则可能会带来麻烦
如下面的例子:

[root@localhost pcre]# ls bin |grep pcre2 |xargs -p -i rm {} 
rm pcre2-config.bak ?...y
rm pcre2grep ?...rm: cannot remove `pcre2-config.bak': No such file or directory
y
rm pcre2test ?...rm: cannot remove `pcre2grep': No such file or directory
y
rm: cannot remove `pcre2test': No such file or directory
[root@localhost pcre]# ls bin
pcre2-config.bak  pcre2grep  pcre2test  pcre-config
[root@localhost pcre]# cd bin
[root@localhost bin]# ls
pcre2-config.bak  pcre2grep  pcre2test  pcre-config
[root@localhost bin]# ls |grep pcre2 |xargs -p -i rm {} 
rm pcre2-config.bak ?...y
rm pcre2grep ?...y
rm pcre2test ?...y
[root@localhost bin]# ls
pcre-config
[root@localhost bin]# 
#本来是想批量删除pcre/bin下的pcre2...文件, 结果在xargs -p -i rm {}中,由于在pcre目录中, 而要删除的文件在pcre/bin中,
## 自然就在pcre目录下找不到pcre2...文件, 而报错了

文件的mime类型

mime(Content-type)格式: "text/plain; charset=utf-8"
主要有: text/plain, text/html, text/javascript
application/x-bzip2, application/x-symlink, application/x-rpm..
image/png, image/jpeg..
audio/mpeg,...
video/3gpp...

file 命令

    file命令是用来查看文件属性和文件元信息的工具,参数有:
        -i  用来查看mime信息
        -L    直接显示symlink目标的信息
        -b    不显示文件/对象名称

man命令

man命令要想有条目,需要满足条件: 要有对应的文件: /usr/share/man/man?/cmd.?.gz , 其中man下有多个目录man1, man2, man3..., 然后
还要有对应的文件, 如 man1/tree.1.gz, man2/tree.2.gz , 不只是文件名,还要求其文件格式 也 是真正的 gz格式

shell如何处理多个参数?

-----使用循环内shift------

    #! /bin/bash
    ## 下面这段代码打印出大于0 的脚本参数.
    # shift 从左到右依次循环处理参数, 在事先不知道参数个数的情况下很有用

    while test $# -gt 0 ; do 
        if test $1 -gt 0; then
            echo $1
        fi        
        shift    
    done

使用apache-2.2.31源码编译安装时, 虽然源码包中包含srclib/pcre, 但是在编译该pcre时提示错误: 找不到/build/ltlib.mk

Makefile:7: /build/ltlib.mk: No such file or directory
make: *** No rule to make target `/build/ltlib.mk'. Stop.

这时, 由于pcre是为了支持rewrite功能的, 所以, 把 --enable-rewrite=shared这个选项去掉, 可以成功安装apache!

但是, 总觉的没道理啊,

于是决心重新来一遍, 重新安装pcre和apache.

  1. 删除已经安装好了的apache : 由于是编译安装的, 所以就直接删除 /usr/local/apache2这个目录就好了

  2. 重新安装pcre,因为这个是rewrite模块生效的 不可绕过的障碍, 这次, 将原来编译生成的目标文件:包括 *.o, *.lo等等, 都清除:
    make clean

  3. 重新进行编译/安装, make && manke install, 这次顺利通过编译和安装! 在/usr/local/pcre下有了 **pcre-config **文件!

posted @ 2015-12-17 11:03  noitanym  阅读(1535)  评论(0编辑  收藏  举报