---
## 源码编译安装
### 编译安装的目的
* 针对硬件,发挥硬件最大性能
* 使在apache在服务器中添加补丁成为可能。
* 更好的整合程序,例如整合apache,php, mysql
> 补充:apache的性能主要依靠CPU和内存,使用gcc编译参数对其优化,性能提升并不明显。
### 编译环境说明
* 空间需求 源码70M,编译后 20M
* 编译要求 apache源码是由ANSIC语言编写,需要ANSIC编译器,因此可以使用gcc编译器
* apr和apr-util工具包需要时1.2以上版本
* apache本身并不需要perl,但有些支持脚本是由perl编写的
* APACI 自动配置样式接口(Apache AutoConf-style Interface),它本身并不对源码进行编译,而是检查编译环境,指定或禁止apache模块,设置安装路径,并创建make程序的描述文件MakeFile,方便make程序进行编译
### configure脚本和常见编译参数
可以将configure理解为APACI,如果一切顺利configure将会建立一系列MakeFile文件
#### 常见编译参数
```
--prefix apache 安装目录
--enable-module=so 使apahce以DSO方式加载模块
--enable-mods-shared=all 以共享方式编译全部模块(不包括核心模块)
--enable-modules=all/most 以静态方式编译所有模块
--with--mpm=worker 以worker方式运行
--enable-deflate 压缩后传输
--enable-proxy-fcgi
--enable-proxy fastcgi支持选项
--enable-rewrite 支持url重写
--enable-cgid
--enable-cgi
–-enable-headers 这个默认是开启的,提供允许对HTTP请求头的控制
-–enable-expires 激活彧通过配置文件控制HTTP的“Expires:”和“Cache-Control:”头内容,即对网站图片、js、css等内容,提供客户端浏览器缓存的设置。这个是apache调优的一个重要选项之一。
```
## 开始安装
apr[官网下载][1]或者使用国内的[镜像][5]
### 安装apr和apr-util 方式1
apr和apr-util作为httpd编译安装的一部分
```
tar -zxvf apr-1.4.6.tar.gz
tar -zxvf apr-util-1.5.2.tar.gz
cp -a apr-1.4.1 httpd-2.4.20/srclib/apr
cp -a apr-util-1.4.1 httpd-2.4.20/srclib/apr-util
```
`./configure`时,后面添加`--with-included-apr`选项
* 注意
经过测试,以上apr版本不支持event
使用apr-1.5.2和apr-util-1.5.2可支持event
---
### 安装apr和apr-util 方式2
#### apr和apr-util下载
版本:apr-1.4.6.tar.bz2
```
tar xf apr-1.4.6.tar.bz2
./configure --prefix=/usr/local/apr
make
make install
```
版本:apr-util-1.4.1.tar.bz2
```
tar xf apr-util-1.4.1.tar.bz2
./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr
make
make install
```
此处编译的apr不用输出头文件/库文件,只为httpd使用。
---
### 安装httpd
[apache官方下载站点][4]
[apache存档站点][3] **推荐**
2.4最新版[下载][2]
#### 编译环境
```
yum install -y gcc gcc++ zlib zlib-devel openssl openssl-devel pcre pcre-devel
```
#### 下载源码包
```
wget http://archive.apache.org/dist/httpd/httpd-2.4.23.tar.bz2
wget http://archive.apache.org/dist/httpd/httpd-2.4.23.tar.bz2.md5
```
#### 校验md5
```
md5sum -c httpd-2.4.23.tar.bz2.md5
httpd-2.4.23.tar.bz2: OK
```
### MPM静态和动态模块说明
#### 构建MPM为静态模块 --with-mpm=NAME
在构建时选择一种MPM,编译到服务器中。如果要改变MPM,必须重新构建。编译完成后,可以使用 ./httpd -l 来确定选择的MPM。
#### 构建 MPM 为动态模块 --enable-mpms-shared
在Unix或类似平台中,MPM可以构建为动态模块,与其它动态模块一样在运行时加载。在执行configure脚本时,使用--enable-mpms-shared选项即可启用此特性。当给出的参数为all时,所有此平台支持的MPM模块都会被安装。默认MPM,通过--with-mpm选项来指定。编辑LoadModule指令内容可以选择不同的MPM。
#### 编译
```
./configure \
--prefix=/usr/local/apache \
--with-mpm=prefork \
--enable-rewrite \
--enable-deflate \
--enable-so \
--enable-ssl \
--enable-cgid \
--enable-cgi \
--enable-modules=most \
--enable-mods-shared=most \
--enable-mpms-shared=all \
--with-included-apr \
--enable-headers
```
>[info] 如果启用fcgi,需要这两个选项
~~~
--enable-proxy
--enable-proxy-fcgi
~~~
如果,apr和apr-util是单独安装的,需指定以下选项,不使用`--with-included-apr`选项
```
--with-apr=/usr/local/apr \
--with-apr-util=/usr/local/apr-util
```
一切正常的话就可以执行make
```
make && make install
```
如果有多颗CPU,则可以使用多颗CPU来加快编译速度
~~~
make -j2
~~~
## 编译之后
### config.nice
这个文件是一个shell脚本,包含了最后一次成功运行configure命令的命令行脚本;如果再次编译,需要在原有的基础上增加模块,可以这样操作
~~~
./config.nice --enable-cache
~~~
### config.layout
为了更好控制编译过程中的文件位置和后继安装中的文件位置,默认使用的是Apache布局;
在编译时如果想使用,则使用`--enable-layout=Layout_ID`选项
### 清除调试符号
在GCC的默认情况下,大多数程序和库都是带有调试符号编译的,这些调试符号在调试程序时使用,它不但能给出内存地址,还能给出海署名。但对于生产系统的服务器是不必要的,因为调试符号的存在,apache会占用更多的内存。
#### 清除调试符号
~~~
strip /usr/local/apache/bin/httpd
~~~
清除后,从1.8M降到500K
> 注意
清除调试符号之后,不能在使用调试工具得到调试信息了。
## 可能出现的问题
**报错**
`util_pcre.c:128: error: 'PCRE_DUPNAMES' undeclared (first use in this function)`
网上说版本过低
下载pcre源码编译安装(编译选项默认)[官网][6]
[下载][7]
[pcre编译方法文档][8]
编译时,添加如下选项`--with-pcre=/usr/local/bin/pcre-config`(pcre编译安装默认生成的文件路径)
**注意**
多次编译时,注意使用`make distclean`清除编译缓存
[1]:http://apr.apache.org/
[2]:http://archive.apache.org/dist/httpd/httpd-2.4.23.tar.bz2
[3]:http://archive.apache.org/dist/httpd/
[4]:http://apache.org/dist/httpd/
[5]:http://mirrors.tuna.tsinghua.edu.cn/apache/apr/
[6]:http://www.pcre.org/
[7]:http://nchc.dl.sourceforge.net/project/pcre/pcre/8.35/pcre-8.35.tar.bz2
[8]:http://www.cnblogs.com/renhao/archive/2011/08/17/2143264.html
- 目录
- 离散的内容
- IO模型
- 网卡绑定
- ssh
- 硬件测试
- 硬件
- limits
- 网络流量
- 硬盘IO
- 硬盘
- tmux
- 主机名和域名
- http_proxy
- iptables
- 内核参数
- 块设备和字符设备
- 内存
- 虚拟内存并非交换分区
- 网络延时
- 概念
- 多核压缩
- linux基础
- SSH协议
- 软件管理
- yum
- 制作本地源 yum系列
- 制作本地源 apt系列
- apt
- 在 Linux 中移除从源代码安装的程序的一种简单的方法
- 其他
- 源码编译和二进制安装后更改配置
- DNS
- bind
- 守护进程
- 特殊权限
- limit.conf配置
- 网络
- shell-ok
- 变量ok
- 数组ok
- 系统变量和环境变量
- 运算符和计算-ok
- 条件测试-ok
- 选择-ok
- shell循环-ok
- 输出echo和printf-ok
- 技巧-ok
- pre-web
- http协议
- web服务器
- Apache
- apache安装
- yum安装
- 二进制安装
- 编译安装
- httpd命令
- 运行 监控apache
- apache配置文件
- 常用配置
- MPM多处理模块
- 编译模块
- apache模块
- apache核心模块
- apache标准模块
- apache第三方模块
- 虚拟主机
- 1
- CGI-FastCGI-SSI
- 别名和重定向
- apache应用
- 301重定向
- apache防盗链
- http转化为https
- 访问时间段控制
- 控制访问目录
- 限制指定USER_AGENT
- 不同客户端访问不同网页
- apache黑名单
- httpd之禁止解析php
- 不记录css/js/img的访问日志
- 浏览器端静态缓存
- apache访问日志自动切割
- order-require
- 压缩传输
- httpd-ssl
- apache代理
- 正向代理
- 反向代理
- apache调优
- httpd压力测试工具ab
- CGI测试
- php
- php原理
- httpd和php的结合方式
- php yum安装之DSO模式
- php 编译安装之DSO模式
- php-fpm详解
- php yum安装之php-fpm模式
- php 编译安装之FastCGI模式
- php扩展之mysql
- php扩展之gd
- php扩展之pcntl
- php扩展之xcache
- php扩展之ZendGuardLoader
- phpMyAdmin
- wordpress
- 数据库-mysql
- 数据库原理
- mysql数据库原理
- mysql源码编译安装
- mysql二进制包安装
- mysql命令行工具
- 更改密码
- 数据库授权grant
- mysql日志
- 命令
- 常用
- 小命令大作为
- awk 报告生成器
- 网络命令
- 命令查找
- 压缩归档命令
- 文件管理
- 文件管理命令
- 文件查看命令
- 目录管理命令
- 用户管理命令
- 用户权限管理
- curl
- cheat
- chrony
- command
- crontab任务计划
- cut
- date
- dd
- df
- echo
- find
- grep
- hash
- iftop
- kill pkill killall
- ls
- lsmod和modprobe
- lsof
- man
- mkpasswd
- mount
- mtr
- netstat
- nmap
- nc
- NTP
- passwd
- rm
- rdate
- pv
- sar系统活动情况报告
- sed文本处理命令
- setup
- screen
- shutdown
- sort 命令
- sudo
- tcpdump
- top
- uniq
- wget
- who
- xargs
- 监控
- zabbix邮件报警
- Redis
- redis安装
- redis数据类型和操作方法
- redis持久化和配置
- redis主从配置
- php连接redis
- redis实现session共享
- 安装测试
- redis设置密码
- ELK日志分析系统
- elasticsearch
- logstash
- logstash插件
- filebeat日志收集
- kibana
- jenkins
- jenkins安装与配置
- 案例1
- 案例2
- 案例3
- 代码仓库之svn
- svn服务端配置
- 常用操作
- svn备份
- LB集群
- LVS负载均衡集群
- ipvsadm使用方法
- LVS调度方法
- NAT原理
- NAT实践
- DR原理
- DR实践
- TUN原理
- LVS持久连接
- HA集群
- HPC集群
- 共享存储
- ftp协议
- vsftpd
- NFS
- 网站架构发展
- 文件同步
- rsync基本用法
- rsync安装和使用_拉取模式
- lsyncd安装和用法
- zabbix
- zabbix服务端安装
- zabbix客户端安装
- zabbix编译安装
- zabbix监控tomcat
- zabbix监控mysql
- gitlab
- supervisor
- nsq
- ruby
- nodejs
- consul
- mesos
- zookeeper
- rwho
- 对象存储
- 工具
- rclone
- minio
- linux 性能调优
- CPU
- 第一部分 CPU
- 安全