1、安装apache
1、安装
wget http://mirrors.cnnic.cn/apache//httpd/httpd-2.2.31.tar.gz
2、安装zlib
yum install zlib zlib-devel-y
3、解压、编译
tar xf httpd-2.2.31.tar.gz
cd httpd-2.2.31
./configure --prefix=/application/apache2.2.27
--enable-deflate
--enable-expires
--enable-headers
--enable-modules=most
--enable-so
--with-mpm=worker
--enable-rewrite
make &&make insatll
ln -s /application/apache2.2.27/ /application/apache
Ø 编译详解
Ø --prefix=/application/apache2.2.27
Ø 安装目录
Ø --enable-deflate
Ø 压缩
Ø --enable-expires
Ø 缓存
Ø --enable-headers
Ø 激活headers
Ø --enable-modules=most
Ø 激活大多模块
Ø --enable-so
Ø --with-mpm=worker
Ø work模式一个主进程 多个线程提供服务
Ø --enable-rewrite
Ø 支持伪静态功能
2、apache目录结构
这里是编译安装后的目录结构
[root@web02 apache]# tree -L 1
.
|-- bin 命令
|-- build
|-- cgi-bin
|-- conf 配置文件
|-- error
|-- htdocs 网站的根目录
|-- icons
|-- include
|-- lib
|-- logs 日志文件,包括访问日志,错误日志
|-- man
|-- manual
`-- modules 模块目录
bin目录
conf 目录
log
3、主配置文件
[root@web02 conf]# cat httpd.conf
ServerRoot "/application/apache2.2.27" 服务的根目录
Listen 80 服务监听的端口,监听的IP默认是主机素有的IP
<IfModule !mpm_netware_module> 模块的开头
<IfModule !mpm_winnt_module> 模块的开头
User daemon 所属用户(编译安装的时候默认是daemon)
Group daemon
</IfModule>
</IfModule>
ServerAdmin you@example.com 管理员的邮箱
DocumentRoot "/application/apache2.2.27/htdocs"默认的网站文件目录
<Directory /> 权限控制,(对根目录)
Options FollowSymLinks 可以带符号链接
AllowOverride None 禁止相关功能:重载等
Order deny,allow
Deny from all 不让任何让访问根目录
</Directory>
<Directory "/application/apache2.2.27/htdocs"> 这是增加站点需要增加的配置
Options Indexes FollowSymLinks 展示目录结构
AllowOverride None
控制开发能不能使用扩展模块defautl中的AccessFileName .htaccess。
NONE是不能 ALL是可以
Order allow,deny
Allow from all
</Directory>
<IfModule dir_module> 指定访问的首页文件
DirectoryIndex index.html
</IfModule>
<FilesMatch "^.ht"> 文件配置
Order allow,deny
Deny from all
Satisfy All
</FilesMatch>
ErrorLog "logs/error_log" 错误日志目录
LogLevel warn 错位日志级别
<IfModule log_config_module> 访问日志的格式类型
LogFormat "%h %l %u %t "%r" %>s %b "%{Referer}i" "%{User-Agent}i"" combined
LogFormat "%h %l %u %t "%r" %>s %b" common
<IfModule logio_module>
LogFormat "%h %l %u %t "%r" %>s %b "%{Referer}i" "%{User-Agent}i" %I %O" combinedio
</IfModule>
CustomLog "logs/access_log" common
</IfModule>
<IfModule alias_module> 支持cgi动态语言没用
ScriptAlias /cgi-bin/ "/application/apache2.2.27/cgi-bin/"
</IfModule>
<IfModule cgid_module>
</IfModule>
<Directory "/application/apache2.2.27/cgi-bin">
AllowOverride None
Options None
Order allow,deny
Allow from all
</Directory>
DefaultType text/plain 缺省的类型
<IfModule mime_module>
TypesConfig conf/mime.types
AddType application/x-compress .Z
AddType application/x-gzip .gz .tgz
</IfModule>
<IfModule ssl_module> ssl相关的内容
SSLRandomSeed startup builtin
SSLRandomSeed connect builtin
</IfModule>
4、第一个优化
当主配置文件中有
Options Indexes FollowSymLinks
我们移除apache文件目录的文件
[root@web02 apache]# cd htdocs/
[root@web02 htdocs]# mv index.html /tmp
[root@web02 htdocs]# ll
total 0
这时候apache就会显示目录结构因为找不到主页文件这是非常危险的。
修改配置文件
Options -Indexes FollowSymLinks
平滑重启apache
5、扩展的配置文件
[root@web02 extra]# ll
total 60
-rw-r--r--. 1 root root 2859 May 19 16:25 httpd-autoindex.conf
-rw-r--r--. 1 root root 1753 May 19 16:25 httpd-dav.conf
-rw-r--r--. 1 root root 2344 May 19 16:25 httpd-default.conf
-rw-r--r--. 1 root root 1103 May 19 16:25 httpd-info.conf
-rw-r--r--. 1 root root 5078 May 19 16:25 httpd-languages.conf
-rw-r--r--. 1 root root 949 May 19 16:25 httpd-manual.conf
-rw-r--r--. 1 root root 3789 May 19 16:25 httpd-mpm.conf
-rw-r--r--. 1 root root 2207 May 19 16:25 httpd-multilang-errordoc.conf
-rw-r--r--. 1 root root 12418 May 19 16:25 httpd-ssl.conf
-rw-r--r--. 1 root root 817 May 19 16:25 httpd-userdir.conf
-rw-r--r--. 1 root root 1507 May 19 16:25 httpd-vhosts.conf
重点的httpd-vhosts.conf httpd-mpm.conf
了解httpd-default.conf
其他的当没看见
1、httpd-vhosts.conf:
如果要配置多个虚拟域名就需要多个 HOST (两个<VirtualHost *:80>之间的)
NameVirtualHost *:80 基于域名的虚拟主机 *表示所有 后面是端口
<VirtualHost *:80>
ServerAdmin webmaster@dummy-host.example.com
DocumentRoot "/application/apache2.2.27/docs/dummy-host.example.com"
ServerName dummy-host.example.com
ServerAlias www.dummy-host.example.com
ErrorLog "logs/dummy-host.example.com-error_log"
CustomLog "logs/dummy-host.example.com-access_log" common
</VirtualHost>
Ø ServerAdmin 管理员邮箱
Ø DocumentRoot 站点目录
Ø ServerName 站点网址
Ø ServerAlias 站点网址别名
Ø ErrorLog 错误日志路径
Ø CustomLog 访问日志路径和格式
2、httpd-mpm.conf
<IfModule !mpm_netware_module>
PidFile "logs/httpd.pid"pid文件
</IfModule>
<IfModule !mpm_winnt_module>
<IfModule !mpm_netware_module>
LockFile "logs/accept.lock" 锁文件
</IfModule>
</IfModule>
<IfModule mpm_prefork_module> prefork模式(默认的模式)
StartServers 5
MinSpareServers 5
MaxSpareServers 10
MaxClients 150 并发
MaxRequestsPerChild 0
</IfModule>
<IfModule mpm_worker_module> work模式
StartServers 2
MaxClients 150
MinSpareThreads 25
MaxSpareThreads 75
ThreadsPerChild 25
MaxRequestsPerChild 0
</IfModule>
<IfModule mpm_beos_module>
StartThreads 10
MaxClients 50
MaxRequestsPerThread 10000
</IfModule>
<IfModule mpm_netware_module>
ThreadStackSize 65536
StartThreads 250
MinSpareThreads 25
MaxSpareThreads 250
MaxThreads 1000
MaxRequestsPerChild 0
MaxMemFree 100
</IfModule>
<IfModule mpm_mpmt_os2_module>
StartServers 2
MinSpareThreads 5
MaxSpareThreads 10
MaxRequestsPerChild 0
</IfModule>
<IfModule mpm_winnt_module>
ThreadsPerChild 150
MaxRequestsPerChild 0
</IfModule>
3、httpd-default.conf
cat extra/httpd-default.conf
Timeout 300 连接超时 300秒
KeepAlive On 连接保持
MaxKeepAliveRequests 100 最多能接受多少个永久的连接
KeepAliveTimeout 5 在同一个连接上等待下一个请求的时间
UseCanonicalName Off
AccessFileName .htaccess 一般开发会把伪静态的语法写在这里面
ServerTokens Full
ServerSignature On 隐藏版本
HostnameLookups Off
6、虚拟主机
在一个机器上部署多个不同域名、不同站点目录、不同端口、不同IP的站点,就需要虚拟主机。
跟NGINX一样apache也支持基于域名基于IP 基于端口的虚拟主机
6.1 基于域名的虚拟主机
a 站点目录规划
域名 |
站点目录 |
/var/html/www |
|
/var/html/blog |
|
/var/html/bbs |
b 创建站点目录
mkdir /var/html/{www,blog,bbs} -p
c 创建测试文件
for name in www blog bbs;do echo "http://$name.etiantian.org">/var/html/$name/index.html;done
[root@web02 ~]# cat /var/html/{www,blog,bbs}/index.html
http://www.etiantian.org
http://blog.etiantian.org
http://bbs.etiantian.org
d 修改配置文件
cd /application/apache
vim conf/extra/httpd-vhosts.conf
<VirtualHost *:80>
ServerAdmin 731431337@qq.com
DocumentRoot "/var/html/www"
ServerName www.etiantian.org
ServerAlias etiantian.org
ErrorLog "logs/www_error_log"
CustomLog "logs/www_access_log" common
</VirtualHost>
<VirtualHost *:80>
ServerAdmin 731431337@qq.com
DocumentRoot "/var/html/blog"
ServerName blog.etiantian.org
ServerAlias etiantian.org
ErrorLog "logs/blog_error_log"
CustomLog "logs/blog_access_log" common
</VirtualHost>
<VirtualHost *:80>
ServerAdmin 731431337@qq.com
DocumentRoot "/var/html/bbs"
ServerName bbs.etiantian.org
ServerAlias etiantian.org
ErrorLog "logs/bbs_error_log"
CustomLog "logs/bbs_access_log" common
</VirtualHost>
vhost这个配置文件默认不在主配置文件中是注释状态
需要在主配置文件中打开(去除前面的#号)
在主配置文件的下面加上
<Directory "/var/html">
Options FollowSymLinks
AllowOverride None
Order allow,deny
Allow from all
</Directory>
这一段可以到去掉注释的主配置文件的17到22行复制修改
如果不加的话会报错403。
e 检查语法、优雅重启
[root@web02 conf]# ../bin/apachectl -t
httpd: Could not reliably determine the server's fully qualified domain name, using 172.16.1.7 for ServerName
Syntax OK
[root@web02 conf]# ../bin/apachectl graceful
httpd: Could not reliably determine the server's fully qualified domain name, using 172.16.1.7 for ServerName
f 测试
[root@web02 conf]# curl www.etiantian.org
http://www.etiantian.org
[root@web02 conf]# curl bbs.etiantian.org
http://www.etiantian.org
[root@web02 conf]# curl blog.etiantian.org
6.2 基于端口
在主配置文件
[root@web02 conf]# cat httpd.conf
Listen 80
Listen 8000
Listen 9000
在vhost配置文件
NameVirtualHost *:80
NameVirtualHost *:8000
NameVirtualHost *:9000
<VirtualHost *:80>
ServerAdmin 731431337@qq.com
DocumentRoot "/var/html/www"
ServerName www.etiantian.org
ServerAlias etiantian.org
ErrorLog "logs/www_error_log"
CustomLog "logs/www_access_log" common
</VirtualHost>
<VirtualHost *:8000>
ServerAdmin 731431337@qq.com
DocumentRoot "/var/html/blog"
ServerName www.etiantian.org
ServerAlias etiantian.org
ErrorLog "logs/blog_error_log"
CustomLog "logs/blog_access_log" common
</VirtualHost>
<VirtualHost *:9000>
ServerAdmin 731431337@qq.com
DocumentRoot "/var/html/bbs"
ServerName www.etiantian.org
ServerAlias etiantian.org
ErrorLog "logs/bbs_error_log"
CustomLog "logs/bbs_access_log" common
</VirtualHost>
7、调整apache 启动FQDN的问题
我们在每次重启apache的时候都会提示
[root@web02 conf]# ../bin/apachectl graceful
httpd: Could not reliably determine the server's fully qualified domain name, using 172.16.1.7 for ServerName
在主配置文件中加入
ServerName 127.0.0.1:80
就可以。其实这块不优化也不会对apache的运行产生任何影响。
8、apache日志
8.1 日志格式
要指定格式只需要在日志路径后面接就可以
8.2 日志轮询
不同于nginx 需要用脚本去实现日志轮询,apache可以使用工具。
cronolog工具
安装
按年、月生成不同目录
CustomLog "|/usr/local/sbin/cronolog
/logs/%Y/%m/access_www_%Y%m%d.log" combined (
按天记录日志,缺点不会自动覆盖)
___________________________________________________________
apache自带日志轮询工具rotatelogs(不推荐使用rotatelogs进行日志轮询)
■ rotatelogs 日志轮询
___________________________________________________________
ErrorLog "|/usr/local/apache1.3.33/bin/rotatelogs /logs/%Y%m%d.error.log
604800"
CustomLog "|/application/apache/bin/rotatelogs
/logs/access_www_%Y%m%d..log 86400 480" combined
CustomLog "|/application/apache/bin/rotatelogs
/logs/access_www_%Y%m%d..log 86400" combined
提示:也可以按照达到多大文件而轮询日志,此处就不提了。
___________________________________________________________
■ rotatelogs 日志轮询说明
___________________________________________________________
语法
rotatelogs [ -l ] logfile [ rotationtime [ offset ]] | [ filesizeM ]
选项
-l
使用本地时间代替GMT时间作为时间基准。注意:在一个改变GMT偏移量(比如夏令时)的环境中
使用-l会导致不可预料的结果。
logfile
它加上基准名就是日志文件名。如果logfile中包含"%",则它会被视为用于strftime()的格式字符串;
否则它会被自动加上以秒为单位的".nnnnnnnnnn"后缀。这两种格式都表示新的日志开始使用的时间。
rotationtime
日志文件滚动的以秒为单位的间隔时间。
offset
相对于UTC的时差的分钟数。如果省略,则假定为"0"并使用UTC时间。比如,要指定UTC时差为
"-5小时"的地区的当地时间,则此参数应为"-300"。
filesizeM
指定以filesizeM文件大小滚动,而不是按照时间或时差滚动。
___________________________________________________________
■ 日志轮询生产环境实际配置
___________________________________________________________
按天轮询的常见生产环境实际配置:
<VirtualHost *:80>
ServerAdmin 31333741@qq.com
ServerName blog.etiantian.org
DocumentRoot "/var/blog"
ServerAlias etiantian.org
ErrorLog
"logs/www.etiantian.org-error_log"
#CustomLog
"logs/www.etiantian.org-access_www_log" common
CustomLog
"|/usr/local/sbin/cronolog /logs/access_www_%Y%m%d.log" combined
</VirtualHost>
提示:/logs/access_www_%Y%m%d.log
这里要写绝对路径,不能是logs/access_www_%Y%m%d.log
不同轮询命令同时记录三份日志,并做多种轮询的写法,这个配置生产环境,并不常用,
这里写出来是告诉大家语法功能上可以这样进行配置。
<VirtualHost *:80>
ServerAdmin 31333741@qq.com
ServerName blog.etiantian.org
DocumentRoot "/var/blog"
ServerAlias etiantian.org
ErrorLog
"logs/www.etiantian.org-error_log"
#CustomLog
"logs/www.etiantian.org-access_www_log" common
CustomLog
"|/usr/local/sbin/cronolog /logs/access_www_%Y%m%d.log" combined
CustomLog
"|/usr/local/sbin/cronolog /logs/access_www_%Y%m%d%H.log" combined
CustomLog "|/application/apache/bin/rotatelogs
/logs/access_www_%Y%m%d%H%M.log 86400" combined
</VirtualHost>
9、不记录指定格式的元素日志
我们希望在日志里不记录图片等格式的日志 为了PV计算的准确性
10、隐藏apache版本信息
在编译安装apache之前修改
这些是apache软件的版本号等
unix/os.h有apache的运行平台
编译安装之后可以修改
这些是去隐藏apache的版本信息
去主配置文件开启这些参数