Apache 安装 静态编译 动态编译

时间:2021-08-18 09:19:36

2014-09-19 09:53 (分类:Linux)

排名第一的web服务器。

(linux环境:CentOS release 6.5 (Final))

安装出错:如下

configure: error: APR not found . Please read the documentation

什么是APR?

APR(Apache portable Run-time libraries,Apache可移植运行库)的目的如其名称一样,主要为上层的应用程序提供一个可以跨越多操作系统平台使用的底层支持接口库。

随着Apache的进一步开 发,Apache组织决定将这些通用的函数独立出来并发展成为一个新的项目。这样,APR的开发就从Apache中独立出来,Apache仅仅是使用 APR而已。目前APR主要还是由Apache使用,不过由于APR的较好的移植性。

apache 的apr项目目前有三部分组成,分别是apr、apr-util、apr-iconv

1.apr中包含了一些通用的开发组件,包括mmap,DSO等等
2.apr-util该目录中也是包含了一些常用的开发组件。这些组件与apr目录下的相比,它们与apache的关系更加密切一些。比如存储段和存储段组,加密等等。
3.apr-iconv包中的文件主要用于实现iconv编码。目前的大部分编码转换过程都是与本地编码相关的。在进行转换之前必须能够正确地设置本地编码。因此假如两个非本地编码A和B需要转换,则转换过程大致为A->Local以及Local->B或者B->Local以及Local->A。

1.解决apr not found问题

# 编译和安装  apr-1.4.5

[root@xxx apr-1.4.5]# ./configure --prefix=/usr/local/apr
[root@xxx apr-1.4.5]# make
[root@xxx apr-1.4.5]# make install

2.解决APR-util not found问题

[root@xxx test]# tar -zxf apr-util-1.3.12.tar.gz
 [root@xxx apr-util-1.3.12]#./configure --with-apr=/usr/local/apr 
 [root@xxx apr-util-1.3.12]# make
 [root@xxx apr-util-1.3.12]# make install

3.解决pcre问题

[root@xt test]#unzip -o pcre-8.10.zip
 [root@xt test]#cd pcre-8.10  
[root@xt pcre-8.10]#./configure --prefix=/usr/local/pcre  
[root@xt pcre-8.10]#make && make install

3.1
下载pcre-8.20编译安装,make时报错:  *** [pcrecpp.lo] Error 1
 这里记录下,这个错误是缺少安装gcc-c++,只需
yum -y install gcc-c++
对pcre-8.20重新configure,make && make install通过

4.最后安装Apache
Apache文档目录下
cd httpd-2.4.3 
./configure --prefix=/usr/local/apache

在命令后加以下参数

--with-apr=/usr/local/apr

--with-apr-util=/usr/local/apr-util/

--with-pcre=/usr/local/pcre

最后
make 
make install

成功编译完成Apache安装~

启动Apache
service httpd start                    http服务启动
chkcongfig httpd on              设置httpd每次开机自己启动,但并不现在就启动

(如果启动没有成功,看下防火墙是否开启,

*关闭SElinux方法
.修改文件:/etc/selinux/config,将  SELINUX=disabled  然后重启系统
.运行命令:setup,进入”防火墙配置“,在selinux栏,选择”禁用 
.运行命令:setenforce 0          不需要重启)

*关闭iptable   
service iptables stop        
chkconfig iptables off

有时在 执行  service httpd start时出现以下报错

httpd:unrecognized service

解决方法

将apache安装为系统服务

# cp /usr/local/apache2/bin/apachectl /etc/rc.d/init.d/httpd

然后 vi /etc/rc.d/init.d/httpd 添加(#!/bin/sh下面)

# chkconfig: 2345 50 90

# description: Activates/Deactivates Apache Web Server(此处为描述)

参数说明:2345表示在2345这四种启动级别里面加载这个服务,50表示启动(开机时)顺序号,90表示关闭(关机时)顺序号

最后,运行chkconfig把Apache添加到系统的启动服务组里面:

# chkconfig --add httpd

# chkconfig httpd on
然后再service httpd start

apache 的静态编译 和  动态编译

Apache拥有4层结构,从核心到外层的module。
而外层的module可以用通过静态和动态两种方式与Apache共同工作。这也就引入下文的“动态”和“静态”两种编译安装方式:

一、静态编译:
静态编译:  编译的时候,所有的模块自己编译进 httpd 这个文件中 ,启动Apache的时候这些模块就已经加载进来了,可以直接来使用,而不用再 httpd.conf 中在 LoadModule 来加载,只要在 <ifmodule></ifmodule> 中来配置就可以了。

二、动态编译:

就是编译的时候,使用--enable-mods-shared=[module]或者--enable-[module]=shared 来动态编译。那么什么是动态? 静态是直接编译进httpd中, 那么动态显然就不编译进去了,也就是你启动的时候根本不会加载这个模块, 而是给你一个module.so 文件,你一定要使用Loadmodule 这个语法来加载,这个模块才有效。

说明:

--enable-mods-shared=all    动态加载所有标准模块(并不是说apache所有的模块都已经通过这条命令被加载进来了)

 --enable-modules=all             静态加载所有模块,由于编译参数中使用了动态加载所有标准模块,所         以其它需要被编译进来的模块都会以动态加载模块方式进行编译。

enable-so 选项:让 Apache 可以支持DSO模式,但是不实际编译任何动态模块;
        注意,这里采用的是 Apache2.0 的语法。如果Apache 是1.3版本,应改为–enable-module=so

总结三点:

1) 如果编译参数中有--enable-mods-shared=all 或者--enable-mods-shared=most,那么所有(大多数)--enable-[module]都将会以动态模式来编译,
   除非特别指定--enable-[module]=static 为静态编译 
./configure --prefix=/app/apache2
--enable-mods-shared=all
--enable-cache=static
--enable-disk-cache=static

2)如果编译参数中有--enable-modules=all | most    指定所有静态方式的话  
           还可以用--enable-[module]=shared来动态加载模块。

./configure --prefix=/app/apache2
--enable-modules=all 
--enable-cache=shared
--enable-mem-cache=shared

3)特别注意如果编译参数中既有--enable-mods=all静态编译又有--enable-mods-shared=all动态编译,那么最终会使用动态编译。

官方说是静态编译比动态编译性能要好5%左右

 

推荐静态编译所有模块,但保留动态加载选项--enable-so,之后还是可以在配置文件中动态加载自己编译的模块。

./configure --prefix=/app/apache2
--enable-modules=all
--enable-cache=static
--enable-mem-cache=static
--enable-file-cache=static
--enable-disk-cache=static
--enable-ssl=satic
--enable-so

举例:
1.安装不带任何参数,只是指定一个安装目录 (静态编译)
/configure --prefix=/app/apache2

来看看默认静态编译安装有哪些模块
         # httpd -l

Compiled in modules:

core.c

mod_authn_file.c

mod_authn_default.c

mod_authz_host.c

mod_authz_groupfile.c

mod_authz_user.c

mod_authz_default.c

mod_auth_basic.c

mod_include.c

mod_filter.c

mod_log_config.c

mod_env.c

mod_setenvif.c

mod_version.c

prefork.c

http_core.c

mod_mime.c

mod_status.c

mod_autoindex.c

mod_asis.c

mod_cgi.c

mod_cgid.c

mod_negotiation.c

mod_dir.c

mod_actions.c

mod_userdir.c

mod_alias.c

mod_so.c

2.第二次安装使用动态编译安装,参数也只是多了一个
./configure --prefix=/app/apache2 --enable-mods-shared=all

看一下结果
# httpd -l

Compiled in modules:

core.c

prefork.c

http_core.c
             mod_so.c

只有几个核心的模块,也就是说这4个被静态编译进httpd主文件,
随着主进程的开启就直接启动模块了。

再查看httpd.conf配置文件中包含了以下LoadModule 模块的行,共有51个,
这些模块的路径都在modules/ 目录下,这些就是被动态加载的模块,
如果你不需要某个模块,只要在行首加#就可以。
但这51个模块并不是apache的所有模块,
这一点需要搞清楚,在这51个模块之外的其他所有模块都需要在编译参数中明确指定,后面会讲到这一点。

LoadModule authn_file_module modules/mod_authn_file.so

LoadModule authn_dbm_module modules/mod_authn_dbm.so

LoadModule authn_anon_module modules/mod_authn_anon.so

LoadModule authn_dbd_module modules/mod_authn_dbd.so

LoadModule authn_default_module modules/mod_authn_default.so

LoadModule authz_host_module modules/mod_authz_host.so
……
……共51个