[toc]
1 Apache的特点
2 Apache的应用场合
- 使用Apache云行静态HTML页、图片(处理静态小文件能力不及Nginx);
- 使用Apache结合PHP引擎运行PHP、Perl等程序,LAMP被称为经典组合;
- 使用Apache结合Tomcate、Resin运行JSP、JAVA等程序,称为中小企业的首选;
- 使用Apache作代理、负载均衡、rewrite规则过滤等等。
3 源码安装Apache
3.1 下载和校验
[root@localhost tools]# wget http://archive.apache.org/dist/httpd/httpd-2.2.22.tar.gz
从另外的站点下载MD5校验文件:
[root@localhost tools]# wget http://archive.apache.org/dist/httpd/httpd-2.2.22.tar.gz.md5
校验文件
[root@localhost tools]# cat httpd-2.2.22.tar.gz.md5
d77fa5af23df96a8af68ea8114fa6ce1 *httpd-2.2.22.tar.gz
[root@localhost tools]# md5sum httpd-2.2.22.tar.gz
d77fa5af23df96a8af68ea8114fa6ce1 httpd-2.2.22.tar.gz
结果一致可以说明下载的文件包没问题
3.2 安装Apache
3.2.1 安装编译器
yum install -y gcc
3.2.2 源码编译安装Apache2.2
[root@localhost ~]# cd httpd-2.2.22/
[root@localhost httpd-2.2.22]# ./configure \
--prefix=/usr/local/apache2.2.22 \
--enable-deflate \
--enable-expires \
--enable-headers \
--enable-modules=most \
--enable-so \
--with-mpm=worker \
--enable-rewrite
[root@localhost httpd-2.2.22]# make $$ make install
[root@localhost httpd-2.2.22]# ln -s /usr/local/apache2.2.22/ /usr/local/apache
参数解释:
- --prefix=/usr/local/apache2.2.22 表示制定apache安装路径为/usr/local/apache2.2.22;如果不指定安装路径,则默认安装路径为/usr/local/apache2;
- --enable-deflate 提供对内容的压缩传输编码支持,一般html、js、css等内容的站点,使用此参数功能会大大提高传输速度,提升访问者访问体验;在生产环境中,这是一个重要的调优参数;
- --enable-expires 激活允许通过配置文件控制HTTP的 "Exprise:" 和 "Cache-Control"头内容,即对网站图片、js、css等内容,提供在客户端浏览器的缓存设置;在生产环境中,这是一个重要的调优参数;
- --enable-headers 提供允许对HTTP请求头的控制;
- --enable-modules=most
- --enable-so 激活apache服务的DSO(全称Dynamix Shared Object,动态共享对象)支持,即在以后可以以DSO的方式编译安装共享模块,这个模块本身不能以DSO方式编译;
- --with-mpm=worker 选择apache mpm的模式作为worker模式,因为worker模式是更过的使用多线程来处理请求,所以可以处理更多的并发请求,而系统资源的开销小于基于进程的MPMpreforl;如果不指定此参数,默认的模式是prefork模式;在生产环境中,这是一个重要的调优参数;
- --enable-rewrite 提供基于URL规则的重写;即根据已知URL地址,转换其他想要的URL地址。伪静态网页就是这个模块实现的。在生产环境中,这是必须要用的重要功能;
另外:
- 在安装apache时,如果忘记以上模块,可以之后通过dso的方式编译安装;
- 以上参数不是必须的,只是参考参数;比如prefork模式,虽然消耗资源,但是更稳定,因此选择prefork的模式而不选择worker也是可取的。
报错处理:
编译报错:
configure: error: mod_deflate has been requested but can not be built due to prerequisite failures
解决方法:
yum install -y zlib-devel
3.2.3 检查apache编译安装情况
[root@localhost httpd-2.2.22]# cd /usr/local/apache
查看编译内容:
[root@localhost apache]# ./bin/apachectl -l
列出基于当前配置加载的所有模块:
[root@localhost apache]# ./bin/apachectl -M
httpd: Could not reliably determine the server's fully qualified domain name, using 192.168.23.131 for ServerName
Loaded Modules:
core_module (static)
authn_file_module (static)
authn_dbm_module (static)
authn_anon_module (static)
authn_dbd_module (static)
...
static代表是静态的编译安装,使用mod_so加载的是动态的;
启动、停止、重启
./bin/apachectl [start | stop | restart]
apachectl会去调用 bin/httpd 脚本
查询
[root@localhost apache]# netstat -ntl | grep :80
tcp6 0 0 :::80 :::* LISTEN
[root@localhost apache]# lsof -i tcp:80
3.3 apache配置
3.3.1 apache目录结构
[root@localhost apache2.2.22]# tree
.
├── bin
│ ├── ab # apache http 服务器性能测试工具;同类软件还有jmeter、loadrunner、webbench;
│ ├── apachectl # apache启动命令;
│ ├── apxs # apxs 是一个作为apache HTTP 服务器编译和安装扩展模块的工具,在进行DSO方式模块编译时会用到;
# 在编译php时,会用到:--with-apxs2=/usr/local/apache/bin/apxs
│ ├── htcacheclean # 清理磁盘缓冲区的命令,需要在编译时制定相关参数才能使用;一般很少使用;
│ ├── htpasswd # 建立和更新基本认证文件;配置nagios时会用到;
│ ├── httpd # 时papche的控制命令程序,apachectl 执行时会调用 httpd
│ └── rotatelogs # apache 自带的日志轮询命令;
├── conf
│ ├── extra # 额外的 Apache 配置文件目录,例如:虚拟主机的配置文件 httpd-vhosts.conf
│ ├── httpd.conf # Apache 的主配置文件
│ ├── magic
│ ├── mime.types
│ └── original
├── error
├── htdocs # 这是编译安装时 apache 的默认站点目录
│ └── index.html # 默认的文件首页
├── icons
├── include
├── lib
├── logs
│ ├── access_log # Apache 的默认访问日志文件
│ ├── cgisock.1270
│ ├── error_log # Apache 的错误日志文件
│ └── httpd.pid # HTTP 服务的pid文件,httpd进程启动后,会把主进程的ID号写到此文件
├── man
├── manual
└── modules # Apache 的模块目录,比如 php、memcache 等模块编译后都在这里
3.3.2 httpd.conf
1 ServerRoot "/usr/local/apache2.2.22" # Apache 的根目录,应只能 root 访问
2 Listen 80 # Apache 监听的端口;
# 默认为80端口,如果同时监控81端口,可以增加一行 Listen 81
3 <IfModule !mpm_netware_module>
4 <IfModule !mpm_winnt_module>
5 User daemon # Apache 的用户,默认为 daemon,建议修改下
6 Group daemon # Apache 的用户组,默认为 daemon,建议修改下
7 </IfModule>
8 </IfModule>
9 ServerAdmin you@example.com # 系统管理员的信箱,当网站出现故障时,页面会显示该邮箱
10 DocumentRoot "/usr/local/apache2.2.22/htdocs" # Apache 的默认 web 站点目录路径结尾不要添加斜线
11 <Directory /> # 这将禁止访问文件系统所在的目录,并添加你希望允许访问的目录块
12 Options FollowSymLinks # FollowSymLinks 表示允许使用符号链接,没加的选项默认为禁用
13 AllowOverride None # 表示禁止用户对目录配置文件(.htaccess进行修改)重载,普通站点目录此项建议不开
14 Order deny,allow # 以 deny 方式优先处理,没有明确说明拒绝的话都将通过,即允许未被明确决绝的访问(从后往前读);
15 Deny from all # 明确指出,拒绝所有访问;
16 </Directory>
17 <Directory "/usr/local/apache2.2.22/htdocs"> # 设置 /usr/local/apache2.2.22/htdocs 目录权限
18 Options Indexes FollowSymLinks # FollowSymLinks 表示禁止使用符号链接
# Indexes 表示允许目录浏览
# 这很危险,应改为 Options -Indexes FollowSymLinks 或 Options FollowSymLinks 取消目录列表(浏览)功能;
19 AllowOverride None # 表示禁止用户读目录配置文件(.htaccess进行修改)重载,不建议开启;
# 有时开发在这里会有需求,一般禁止,又SA来控制这里;
20 Order allow,deny # 以 allow 方式优先处理,没有明确说明允许的话都将拒绝访问,即拒绝未被明确允许的;
21 Allow from all # 允许所有的访问,因为是提供给所有人的 web 访问服务,所以此处权限要开放;
22 </Directory>
23 <IfModule dir_module>
24 DirectoryIndex index.html # 配置默认的 Apache 首页文件,如虚拟主机没有此配置项,默认应用这里的配置;
# 首页文件可以有多个,每个文件用空格分开,调用时,优先匹配靠前的文件;
25 </IfModule>
26 <FilesMatch "^\.ht"> # 防止 .htaccess 和 .htpasswd 等重要的隐藏文件被 web 用户查看;
27 Order allow,deny
28 Deny from all
29 Satisfy All
30 </FilesMatch>
31 ErrorLog "logs/error_log" # 错误日志路径 logs 为 Apache 安装目录的相对路径;
32 LogLevel warn
33 <IfModule log_config_module>
34 LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined # 访问日志的格式
35 LogFormat "%h %l %u %t \"%r\" %>s %b" common # 普通访问日志格式
36 <IfModule logio_module>
37 LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %I %O" combinedio
38 </IfModule>
39 CustomLog "logs/access_log" common # 默认站点访问日志配置
40 </IfModule>
41 <IfModule alias_module>
42 ScriptAlias /cgi-bin/ "/usr/local/apache2.2.22/cgi-bin/" # 配置 cgi 别名
43 </IfModule>
44 <IfModule cgid_module>
45 </IfModule>
46 <Directory "/usr/local/apache2.2.22/cgi-bin"> # 允许 cgi 路径访问
47 AllowOverride None
48 Options None
49 Order allow,deny
50 Allow from all
51 </Directory>
52 DefaultType text/plain # DefaultType:定义当不确定 MIME 类型时服务器提供的默认 MIME 类型;
# 如果你的服务主要包含 test 或 HTML 文档,“text/plain” 是一个好的选择;
53 <IfModule mime_module>
54 TypesConfig conf/mime.types
55 AddType application/x-compress .Z # AddEncoding 允许你在信息传送中使用(Mosaic/X 2.1+)解压信息
# 注意不是所有的浏览器都支持这个选项。
56 AddType application/x-gzip .gz .tgz
57 </IfModule>
58 <IfModule ssl_module>
59 SSLRandomSeed startup builtin
60 SSLRandomSeed connect builtin
61 </IfModule>
启动时报错:
httpd: Could not reliably determine the server's fully qualified domain name, using localhost.localdomain for ServerName
原因:
配置文件中ServerName项没有配置,不会影响httpd服务启动,一般配置为 127.0.0.1:80
4 apache应用
4.1 虚拟主机
开启虚拟主机配置
1. 备份配置文件
[root@localhost apache]# cp conf/httpd.conf conf/httpd.conf.ray.20180421
2. vim conf/httpd.conf
395 # Virtual hosts
396 Include conf/extra/httpd-vhosts.conf
4.1.1 基于域名的虚拟主机
[root@localhost apache]# pwd
/usr/local/apache
备份配置文件
[root@localhost apache]# cp conf/extra/httpd-vhosts.conf conf/extra/httpd-vhosts.conf.ray.20180421
[root@localhost apache]# vim conf/extra/httpd-vhosts.conf
1 NameVirtualHost *:80 # 这里表示使用基于域名的虚拟主机配置,这是产品环境下最常用的配置;
# *:80 中的 * 表示监听本机所有IP地址,80 表示在80端口上提供http服务;
# 如果改 * 为具体IP ,表示监听本机指定IP地址的服务请求;
2 <VirtualHost *:80> # 定义一个虚拟主机,监听本机所有IP地址80端口上提供的http服务请求;
3 ServerAdmin wangkuncoin@163.com # 配置管理员的邮箱
4 DocumentRoot "/var/www/blog" # 提供服务器的程序目录,保存网页代码的位置
5 ServerName blog.coin.org # 配置提供服务的域名,如果是生产环境,需要把该域名解析到服务器上配置的外网VIP或IP上;
# 如果是测试环境,在本机做hosts即可;
6 ServerAlias coin.org # 配置虚拟主机别名,比如输入coin.org,也会响应blog.coin.org;
# 多个别名可以使用空格隔开;
# 此功能需要apache_mod_alias模块支持,默认会安装该模块;
7 ErrorLog "logs/blog.coin.org-error_log" # 错误日志输出位置
8 CustomLog "logs/blog.coin.org-access_log" common # 访问日志输出位置
9
10 <Directory "/var/www/blog">
11 Options -Indexes FollowSymLinks
12 AllowOverride None
13 Order allow,deny
14 Allow from all
15 </Directory>
16 </VirtualHost>
17
18
19 <VirtualHost *:80>
20 ServerAdmin wangkuncoin@163.com
21 DocumentRoot "/var/www/blog"
22 ServerName bbs.coin.org
23 ServerAlias coin.org
24 ErrorLog "logs/bbs.coin.org-error_log"
25 CustomLog "logs/bbs.coin.org-access_log" common
26
27 <Directory "/var/www/bbs">
28 Options -Indexes FollowSymLinks
29 AllowOverride None
30 Order allow,deny
31 Allow from all
32 </Directory>
33 </VirtualHost>
[root@localhost apache]# mkdir -pv /var/www/blog
mkdir: 已创建目录 "/var/www"
mkdir: 已创建目录 "/var/www/blog"
[root@localhost apache]# mkdir /var/www/bbs
生成网页
[root@localhost apache]# echo "<html><body><h1>blog.coin.org</h1></body></html>" > /var/www/blog/index.html
[root@localhost apache]# echo "<html><body><h1>bbs.coin.org</h1></body></html>" > /var/www/bbs/index.html
Driectory 标签的 Options 参数解释:
None:不支持任何选项
Indexes:无index.html时,列出所有网页文件,禁用
FollowSymLinks:存在软链接网页文件时,是否只可以访问对应源网页文件的内容,禁用
SymLinksifOwnerMatch:允许访问软链接,但所属必须和运行httpd进程的所属一致
Includes:允许执行服务器端包含(SSI格式的网页文件),禁用
ExecCGI:允许运行CGI脚本
MultiViews:内容协商机制(根据客户端的语言不同显示不同的网页),多视图;禁用
All:启用所有选项
4.1.2 基于IP的虚拟主机配置(生产环境基本不使用,了解就行)
1. 修改 httpd-vhosts.conf 配置文件中的 第一行注释掉,并将 VirtualHost 标签内的 * 改为ip地址
[root@localhost apache]# vim conf/extra/httpd-vhosts.conf
1 # NameVirtualHost *:80
2 <VirtualHost 192.168.23.131:80>
19 <VirtualHost 192.168.23.132:80>
2. 添加一个新的IP地址:
[root@localhost apache]# ifconfig ens33:1 192.168.23.132 netmask 255.255.255.0 up
3. 此时该服务就拥有两个ip地址:
192.168.23.131
192.168.23.132
4. graceful httpd服务
4.1.3 基于端口的虚拟主机配置(生产环境基本不使用,一般对公司内部人员提供访问)
1. 在 httpd.conf 中增加监听端口
[root@localhost apache]# vim conf/httpd.conf
40 Listen 80
41 Listen 8000
2. 修改 httpd-vhosts.conf 配置文件中的 第一行注释掉,并将 VirtualHost 标签内的端口改为对应的监听端口
[root@localhost apache]# vim conf/extra/httpd-vhosts.conf
1 # NameVirtualHost *:80
2 <VirtualHost *:80>
19 <VirtualHost *:8000>
3. graceful httpd服务
4. 检查 http服务端口,此时应该有两个端口
[root@localhost apache]# netstat -anltp | grep httpd
tcp6 0 0 :::80 :::* LISTEN 1143/httpd
tcp6 0 0 :::8000 :::* LISTEN 1143/httpd
4.1.4 多端口多域名虚拟主机
emm~~~~~~
4.2 检查apache配置语法
[root@localhost apache]# ./bin/apachectl -t
Syntax OK
# 这是生产环境特别重要的一步,它让你在重启前可以查出配置文件中的错误,如果没有此步,很可能会因为配置错误,而导致服务器短时间宕机;
# 这在正规互联网公司是无法接受的;
4.3 graceful参数重启apache服务
[root@localhost apache]# ./bin/apachectl graceful
# graceful 不是restart;
# graceful 表示优雅的重启;
# 这个参数可以在重启时,不强行中断用户的访问请求,而是处理完毕后再重新启动;
# 生产环境务必使用 granceful
4.4 检查apache启动
[root@localhost apache]# netstat -anlp | grep :80
tcp6 0 0 :::80 :::* LISTEN 1143/httpd
除了检查端口外,在启动apache时,使用脚本获取header信息或模拟用户访问指定URL(wget方式),来自动检查apache启动是不是真的正常,最大限度的保证重启后,能迅速知道网站是不是正常,而无需再敲命令查看;
这样如果配置问题,而非语法问题(语法问题使用 -t 参数已经检查过了),好迅速改回来,使得影响用户时间最短。
5 403 Forbidden 问题
403 Forbidden 资源不可用,服务器理解客户的请求,但拒绝处理它,通常由于服务器上文件或目录权限导致;
原因1(重要)
apache配置文件中没有对站点目录的权限许可配置,这通常是在初始安装apache后,更改了默认的apache站点目录所致;
如编译安装apache(假设安装在 /usr/local/apache)后,将站点目录(默认是/usr/local/apache/htdocs)改为其他路径,则会报403错误;
解决办法,仿照 /usr/local/apache/htdocs 的 directory配置 增加 新的站点目录的权限配置即可。
原因2 丢失index.html
站点目录下,无首页文件(index.html),而apache的配置又禁止了目录浏览(Option 配置 -Indexes 或者 取消 Indexes 或者配置为 None),就会提示403;
原因3 访问权限配置错误
如:<br>
Order Deny, Allow
Deny from 10.0.0.0/24<br>
将 10.0.0.0 网段的IP全部拒绝,则该网段的IP访问时都会显示 403 Forbidden;
原因4 站点目录权限
apache的用户对 站点目录没有读权限;
6 apache模块学习
6.1 --enable-expires
6.2 --mod_deflate
mod_deflate 模块提供了一个 DEFLATE 输出过滤器,允许服务器在将输出内容在发送到客户端之前进行压缩,以节约带宽。
6.2.1 检查是否安装
- 编译安装httpd,的确认方法
[root@localhost apache2.2.22]# pwd
/usr/local/apache2.2.22
[root@localhost apache2.2.22]# ./bin/apachectl -l | grep mod_deflate
mod_deflate.c
- 如果是以DSO方式编译的,则查看方法为
[root@localhost apache2.2.22]# ll modules/ | grep mod_deflate
[root@localhost apache2.2.22]# grep mod_deflate.so conf/httpd.conf
[root@localhost apache2.2.22]# ./bin/apachectl -M | grep deflate
Syntax OK
deflate_module (static)
# static 代表是编译安装的;
# dynamic 代表是DSO安装的;
# 以上两种情况不能同时存在,否则会有冲突;
6.2.2 mod_deflate 常规安装方法
- 配置编译时,可加入如下参数
--enable-deflate
查看帮助可以看到模块信息:
[root@localhost httpd-2.2.22]# ./configure --help | grep deflate
--enable-deflate Deflate transfer encoding support
- DSO安装
在解压的apache的源码目录的/root/httpd-2.2.22/modules/filters/
[root@localhost apache2.2]# ./bin/apxs -c -i -a /root/httpd-2.2.22/modules/filters/mod_deflate.c
...
chmod 755 /tmp/apache2.2/modules/mod_deflate.so
[activating module `deflate' in /tmp/apache2.2/conf/httpd.conf]
apx 安装参数说明:
-c 此选项表示需要执行编译操作;
它首先会编译C源程序(.c)files为对应的目标代码文件(.o),然后连接这些目标代码和files中其余的目标代码文件(.o和.a),以生成动态共享对象dsofile。
如果没有指定 -o 选项,则此输出文件名由files中的第一个文件名推测得到,也就是默认为mode_name.so;
-i 此选项表示需要执行安装操作;以安装一个或多个动态共享对象到服务器的modules目录中;
-a 此选项自动增加一个 LoadModule行 到 httpd.conf 文件中,以激活此模块,或者此行已存在,则启用之;
检查安装
[root@localhost apache2.2.22]# pwd
/tmp/apache2.2.22
[root@localhost apache2.2.22]# ll modules/ | grep mod_deflate
-rwxr-xr-x 1 root root 70320 4月 21 23:06 mod_deflate.so
[root@localhost apache2.2.22]# cat conf/httpd.conf | grep mod_deflate
LoadModule deflate_module modules/mod_deflate.so
- 查看http headers 验证mod_deflate效果
[root@localhost apache2.2.22]# curl -I 127.0.0.1
HTTP/1.1 200 OK
Date: Sat, 21 Apr 2018 13:56:34 GMT
Server: Apache/2.2.22 (Unix) DAV/2
Last-Modified: Sat, 21 Apr 2018 02:24:20 GMT
ETag: "c09eecd-47-56a5280968da7"
Accept-Ranges: bytes
Content-Length: 71
Content-Type: text/html
6.2.3 mod_deflate模块配置
- 在 httpd.conf 配置
把以下内容复制到配置文件末尾即可
DeflateActive on
DeflateDefault "access plus 12 month"
DeflateByType text/html "access plus 12 months"
DeflateByType text/css "access plus 12 months"
DeflateByType image/gif "access plus 12 months"
DeflateByType image/jpeg "access plus 12 months"
DeflateByType image/jpg "access plus 12 months"
DeflateByType image/png "access plus 12 months"
DeflateByType application/x-shockwave-flash "access plus 12 months"
DeflateByType application/x-javascript "access plus 12 months"
DeflateByType video/x-flv "access plus 12 months"
<ifmodule mod_deflate.c>
DeflateCompressionLevel 9
S
- 在 httpd-vhosts.conf 配置
7 Apache优化配置
7.1 配置cronolog进行日志轮转
7.2 404 故障转移
把404的故障转移到 www.baidu.com
[root@localhost apache2.2.22]# vim conf/httpd.conf
352 ErrorDocument 404 "https://www.baidu.com"
[root@localhost apache2.2.22]# ./bin/apachectl -t
[root@localhost apache2.2.22]# ./bin/apachectl graceful
在浏览器输入 IP/asdasd 就可以看到效果
网友评论