一、概述
apache是世界上使用排名前列的web服务器软件,它可以运行在几乎所有广泛的计算机平台上。由于其跨平台性和安全性被广泛使用,是最流行的web服务器端软件之一。快速,可靠,并且可以通过简单的API扩充,把perl/python/php等解释器编译到服务器中
apache有多种产品,可以支持SSL技术,支持多个虚拟主机。apache是以进程为基础的结构,进程要比线程消耗更多的系统开支,不太适用于多处理器的环境,因此,在一个apache web站点扩容时,通常是增加服务器或扩充集群节点而不是增加处理器。到现在为止,apache依然是世界上用的最多的web服务器。
二、工作模式
apache有3中稳定的MPM模式(MPM:多进程处理模块),分别是:prefork、worker、event
1.prefork工作模式
apache在启动之初,就预先fork启动一些子进程,然后等待请求进入。之所以这样,是为了减少频繁创建和销毁进程的开销。每个子进程只有一个线程,在同一个时间点内,只能处理一个请求。
优点:成熟稳定,兼容所有的新老模块。同时不需要担心线程安全问题。
缺点:一个进程相对占用更多的系统资源,消耗更多的内存,而且它并不擅长处理高并发请求。
2.worker工作模式
使用了多进程和多线程的混合模式。也会预先fork启动几个子进程(数量较少),然后每个子进程创建一些线程,同时包括一个监听线程。每个请求进入,会被分配到1个线程来服务。线程比进程会更清凉,因为线程通常会共享父进程的内存空间。因此,内存的占用会减少一些。在高并发的场景下,比prefork有更多可用的线程,表现会更优秀一些(监听线程在这里类似管理作用)
优点:占据更少内存,高并发下表现更优秀。
缺点:必须考虑线程安全问题。
3.event工作模式
它和worker模式很像,最大区别在于它解决了keep-alive场景下,长期被占用的线程资源浪费问题。event MPM中,会有一个专门的线程来管理这些keep-alive类型的线程,当有真实请求过来的时候,将请求传递给服务进程,执行完毕后,又允许它释放。这样增强了高并发场景下的请求处理能力。
HTTP采用keepalive方式减少了TCP连接数量,但是由于需要与服务器线程或进程进行绑定,导致一个繁忙的服务器会消耗完所有的线程。event MPM是解决这个问题的一种新模型,它把服务进程从连接中分离出来。在服务器处理速度很快,同时具有非常高的点击率时,可用的线程数量就是关键的资源限制,此时EVENT MPM方式最有效的,但不能在HTTPS访问下工作。
keep-alive
在http早期,每个http请求都要求打开一个tcp socket连接(就是连接一次服务器),并且使用一次之后就断开这个tcp连接。
当http守护进程发送完一个响应之后,理应马上主动关闭相应的tcp连接,设置keepalive_timeout之后,http会等待一段时间,这个时间就是keepalive-timeout时间,如果在这个时间里,没有收到浏览器发过来的http请求,则关闭这个http连接
使用keep-alive可以改善这种状态,即在一次TCP连接中可以持续发送多分数据而不会连接。通过使用keep-alive机制,可以减少tcp连接建立次数,也意味着可以减少TIME_WAIT状态连接,以此提高性能和提高httpd服务器的吞吐率(更少的tcp连接意味着更少的系统内核调用)。
但是,长时间的tcp连接容易导致系统资源的无效占用。配置不当的keep-alive有时比重复利用连接带来的损失更大。所以,正确设置keep-alive-timeout非常重要
三、查看当前工作模式:
http -V | grep -i “server mpm”
四、指定方式:
在编译时,在选项中指定,–with-mpm=xxx
如 ./config --with-mpm=event
五、相关文件保存位置
1.配置文件位置
源码包:prefix /etc或者conf/httpd…conf,主配置文件,prefix/etc/extra/*.conf(子配置文件)
rpm包:/etc/httpd/conf/httpd.conf
2.网页文件位置
源码包:prefix/htdocs
rpm包:/var/www/html
3.日志文件位置
源码包:PREFIX/log
rpm包:/var/log/httpd
六、配置文件详解
注:apache配置文件严格区别大小写
针对主机环境的基本配置
代码 | 解析 |
---|---|
ServerRoot /usr/local/apache | 主目录 |
Listen :80 | 监听端口,所有网卡,可以直接写具体网卡地址 |
LoadModule php7 | 加载的相关模块 |
User | 用户 |
Group | 组 |
ServerName | 服务器名,没有域名解析时,使用临时解析。默认不开启 |
ServerAdmin | 管理员邮箱 |
ErrorLog “logs/error_log” | 服务器错误日志 |
CustomLog “logs/access_log” common | 访问记录日志,又成功记录,失败也有 |
Directory index.html index.php | 默认网页文件名,优先级顺序 |
Include etc/extra/httpd_vhosts.conf | 子配置文件中内容加载生效 |
主页目录及权限
代码 | 解析 | 备注 |
---|---|---|
DocumentRoot “/usr/local/apache/htdocs” | 网页目录存放目录(默认) | 目录位置 |
<Directory “/usr/local/apache/htdocs”> | 定义指定目录权限,以下的分为三部分 | 定义目录权限 |
Options Indexes FollowSymLinks | Option部分权限,访问服务器的权限 | option权限标题 |
None | 没有任何额外权限 | option权限 |
All | 所有权限,出去MultiViews以外 | option权限 |
Indexes | 浏览权限,当此目录下没有默认网页文件时,现实目录内容 | option权限 |
FllowSymLinks | 准许软连接到其他目录 | option权限 |
MultiViews | 准许文件名泛匹配,需手动开启模块才有效negotiation | option权限 |
AllowOverride None | 定义是否允许目录下。htaccess文件中的权限生效,是否启用.htaccess文件 | AllowOverride权限 |
None | .htaccess中权限不生效 | AllowOverride权限 |
All | 所有权限生效 | AllowOverride权限 |
Authconfig | 只有网页认证的权限生效 | AllowOverride权限 |
Require all granted(denied) | 访问控制列表,Require部分,一般用防火墙,不用这个,允许所有granted,拒绝所有denied | Require权限 |
</Directory> | 目录权限结束位置,这个标签以内都是权限设置 | 结束标签 |
<IfModule dir_moudle> | 此标签用来指定访问到指定目录时默认加载哪个页面文件 | 访问目录时加载文件控制 |
DirectoryIndex index.php index.html | 指定可识别默认加载的网页文件类型,可写多个 | 根据顺序就是识别网页的优先级 |
</IfModule> | 结束指定访问目录默认加载页面文件类型 | 结束标签 |
七、实例实现
1.apache的目录别名
当apache接收请求时,在默认情况下会将DocumentRoot目录中的文件送到客户端,如果想将某一不在DocumentRoot目录中的文件共享到网站上,并希望将它们留在本来位置而不需要进行移动的话,处理这种情况可以通过建立别名的方式将URL指向特定的目录。
a.编辑主配置文件
vim /usr/local/apache/conf/httpd.conf
Include etc/extra/httpd-autoindex.conf
去掉注释,开启调用子配置文件b.编辑子配置文件
vim /usr/local/apache/conf/extral/httpd-autoindex.conf,目录别名文件
alias /icons/ “/usr/local/apache/icons”
结构固定,alias 别名 “真是目录” 真实目录结尾要有/。否则报错,因为有/才代表目录。别名和真实目录自己定义
<Directory “/usr/local/apache/icons”>
options Indexes FollowSymLinks
AllowOverride None
Require all granted
< /Directory>
根据模板写自己需要的目录别名。完成重启。
配置完成之后的效果,能访问虚拟目录中的文件。
2.apache用户验证
有时需要一些特殊的访问设置一个用户认证机制,增加安全。比如我们的个人网站。
a.编辑配置文件
vim /usr/local/apache/etc/httpd.conf
<Directory “/usr/local/apache/htdocs/admin”>,这里声明被保护的目录
Options Indexes FollowSymLinks
AllowOverride All #这里开启权限认证文件.htaccess
Require all granted
< /Directory>
b.在指定目录下创建权限文件
cd /usr/local/apache/htdocs/admin/
vim .htaccess
AuthName “Welcome to myword!”
这里是提示信息
AuthType basic
加密类型
AuthUserFile /usr/local/apache/htdocs/admin/apache.passwd
密码文件,文件名自定义,使用绝对路径
require valid-user
允许密码文件中所有用户访问
c.建立密码文件,加入允许访问的用户。(此用户和系统用户无关)
htpasswd -c /usr/local/apache/htdocs/admin/apache.passwd t1
建立密码文件,默认添加第一个用户t1,也只有添加第一个用户时才能-c,会要求输入密码
htpasswd -m /usr/local/apache/htdocs/admin/apache.passwd t2
-m,再添加更多用户时,使用-m
注:htpasswd是httpd的命令,需要绝对路径。
d.重启apache服务进行测试
/usr/local/apache/bin/apachectl -f /usr/local/apache/etc/httpd.conf -k restart
-f指定配置文件路径。-k,指定启动
注:重启前可以,apachectl -t检查配置文件语法。
有要求密码验证即为成功。
3.虚拟主机
虚拟主机也叫做“网站空间”,就是把一台运行再互联网上的物理服务器分为多个“细腻”服务器。虚拟主机技术极大促进了网络技术的应用和普及。同时虚拟主机的租用服务也成了网络时代的一条新型经济形式。
虚拟主机的分类:
基于IP的虚拟主机:一台服务器,多个IP,搭建多个网站
基于端口的虚拟主机:一台服务器,一个IP,搭建多个网站,网络使用不通端口访问。
基于域名的虚拟主机:一台服务器,一个IP,搭建多个网站,每个网站使用不同域名访问。
实例准备
a.准备域名
www.laoli.com
www.laolilaoli.com
我是直接改的hosts文件。直接用本地hosts文件解析
vim /etc/hosts
192.168.1.130 www.laoli.com
192.168.1.130 www.laolilaoli.com
b.网站主页目录规划
在/htdocs/目录下分别建两个目录,laoli和laolilaoli,并在新目录下创建index.html文本,写入不同内容,方便区别。
c.修改主配置文件开启文件关联
vim /usr/local/apache/etc/httpd.conf
Include etc/extra/httpd-vhosts.conf
取消此行注释,和主配置文件关联。
d.编辑刚刚开启的子配置文件,编写虚拟主机标签
vim /usr/local/apache/etc/extra/httpd-vhosts.conf
添加以下内容,有几个虚拟主机就写几组虚拟主机标签<Directory "/usr/local/apache/htdocs/laoli"> Option Indexes FollowSymLinks AllowOverride No Require all granted < /Directory>
以上是目录权限标签,这里不是必写,但是虚拟主机配置最好写上,以便未来区分,具体权限根据自己需要自行添加
<VirtualHost 192.168.1.130:80> 声明虚拟主机标签 ServerAdmin webmaster@laoli.com 声明管理员邮箱 DocumentRoot "/usr/local/apache/htdocs/laili" 虚拟主机网站主目录 ServerName www.laoli.com 完整域名 ErrorLog "logs/laoli_error_log" 声明错误日志存放路径和名称 CustomLog "logs/laoli_access_log" common 声明记录日志的存放路径和名称 < /VirtualHost>
<VirtualHost 192.168.1.130:8001> 声明虚拟主机标签 ServerAdmin webmaster@laoli.com 声明管理员邮箱 DocumentRoot "/usr/local/apache/htdocs/laililaoli" 虚拟主机网站主目录 ServerName www.laolilaoli.com 完整域名 ErrorLog "logs/laolilaoli_error_log" 声明错误日志存放路径和名称 CustomLog "logs/laolilaoli_access_log" common 声明记录日志的存放路径和名称 < /VirtualHost>
e.重启服务,验证结果
本地linux服务器访问:配置了/etc/hosts直接访问域名,elinks或者curl验证访问成功即可。
异地windows访问:修改C:\windows\System32\drivers\etc\hosts,同样加上解析的IP和域名。
浏览器访问即可。
4.apache+openssl实现https
https(Hypertext Transfer Protocol secure,超文本传输安全协议)。是以安全为目标的HTTP通道,简单来讲是HTTP安全版。即HTTP下加入ssl层,用户安全传输HTTP数据。这个系统被内置于浏览器中,提供了身份验证与加密通讯方法。现被广泛用于网上安全敏感的通讯,例如交易支付方面
准备工作
检查apache是否支持ssl,检查相应模块是否安装,若安装则将模块启用。
模块存放目录:/usr/local/apache/modules
检查模块是否启用:apachectl -M
如果有模块但是未启用,在httpd.conf文件中开启模块
LoadModule ssl_module modules/mod_ssl.so
取消注释,重启apahce即可。
a.CA证书申请(正规生产环境中,是向正规https厂商注册购买)
openssl genrsa -out ca.key 2048
建立服务器私钥,生成rsa密钥,ca.key文件密钥,2048位加密openssl req -new -key ca.key -out laoli.csr
依次输入国家、地区、城市、组织单位,email等信息。最重要的有个commonname,写自己域名或名字,如果为了https申请,必须和域名吻合,否则会引发浏览器警报。
依赖上面生成的ca.key密钥生成laoli.csr证书,此时证书未签名,接下来将csr证书文件交给CA签名后形成服务器端自己签发的证书。openssl x509 -req -days 365 -sha256 -in laoli.csr -signkey ca.key -out laoli.crt
使用CA服务器签发证书,设置有效期为365天。sha256位加密,未签证书名,密钥,生成的文件名。crt尾缀表示了已签发。
注:生成完密钥文件和证书文件后,将文件存放在apache的安装目录下cert目录下,默认没有,自己mkdir。
注:生产环境中必须使用https证书厂商注册的,否则浏览器不识别。
b.配置文件修改
调用ssl模块,并启用ssl独立注释文件vim /usr/local/apache/conf/httpd.conf
LoadModule ssl_module modules/mod_ssl.so
取消注释,调用ssl模块
Include etc/extra/httpd-ssl.conf
取消注释,开启调用ssl独立配置文件。
c.修改etc/httpd-ssl.conf配置文件,调用证书等文件
vim /usr/local/apache/etc/extra/httpd-ssl.conf
SSLProtocol all -SSLv2 -SSLv3
没有SSLv2可以加上去
添加SSL协议支持协议,去掉不安全协议,一般只支持SSLv2和SSLv3即可。
SSLCipherSuite …
修改加密套件
SSLHonorCipherOrder on
开启密钥和证书验证方式
<VirtualHost_default_:443>
开启虚拟主机配置
DocumentRoot “/usr/local/apache/htdocs”
ServerName www.laoli.com:443
SSLCertificateFile cert/laoli.crt
签字证书位置
SSLCertificateKeyFile cert/ca.key
证书密钥位置
SSLCertificateChainFile cert/ca.key
d.结果验证:
apachectl -t
apachectl restart
重启后再次访问,测试是否可以使用https访问
报错:
AH00526: Syntax error on line 92 of /usr/local/apache/etc/extra/httpd-ssl.conf:
SSLSessionCache: ‘shmcb’ session cache not supported (known names: ). Maybe you need to load the appropriate socache module (mod_socache_shmcb?).
解决:要么不调用mod_socache_shmcb模块,也就可以注释掉,要不就装上插件,给加载上。
e.强制跳转https
为了安全,网站不允许使用http访问,仅允许https访问。
首先打开重写模块LoadModule rewrite_module modules/mod_rewrite.so
配置目录权限httpd.conf。
<Directory “/usr/local/apache/htdocs/laoli”>
这里就写需要安全跳转的目录
option Indexes FollowSymLinks
AllowOverride All
Require all granted
< /Directory>创建规则文件
vim /usr/local/apache/htdocs/laoli/.htaccess
在指定网站目录下创建文件,并添加以下内容
RewriteEngine on
开启rewrite重写功能,转发规则
RewriteCond %{SERVER_PORT} !^443$
检查任意来源的访问端口不是443的,%{SERVER_PORT}
里是变量,!^443$
,正则匹配不是443开头结尾的将访问地址放入SERVER_PORT
中。
RewriteRule ^(.*)?$ https://%{SERVER_NAME}/$1 [R=301,L]
RewriteRule重写规则,^(.*)?$代指客户端要访问的资源,全部重写访问至https://%{SERVER_NAME}这个地址,$1也是变量,指代.*所匹配到的值。R=301,表示永久重定向,也有302表示临时跳转。L指定该重写规则为最后一条生效规则。
重启访问不是/laoli/目录下的http地址,地址会自动跳转到https即为成功。
记得打开重写模块
LoadModule rewrite_module modules/mod_rewrite.so
5.apache日志切割
每次访问网站,就会记录若干条日志。如果不去管理,时间肠了日志文件会越来越大,apache有机制可处理这种情况,让日志按照我们的需求进行归档,比如每天一个新日志,每小时一个新日志等。
a.设置日志文件的路径名称
vim /usr/local/apache/etc/httpd.conf
找到并修改定义日志的内容
ErrorLog “logs/error.log”
CustomLog “logs/access.log” combined
指定全部错误日志存放位置和正常日志存放位置,combined是指定日志格式。
日志格式参考配置文件httpd.conf中格式的指定,如下:
LogFormat “%h %l %u %t “%r” %>s %b “%{Referer}i” “%{User-Agent}i”” combined
LogFormat “%h %l %u %t “%r” %>s %b” common
b.设置apache日志分割
同样设置httpd.conf
ErrorLog “| /usr/local/apache/bin/rotatelogs -l /usr/local/apache/logs/error_%Y%m%d%h.log 3600”
ErrorLog本身就是日志错误内容,默认是放入到logs/error.log里,现在将它通过管道符,交给rotatelogs处理,rotatelogs是apache的日志轮替和日志切割命令,-l表示使用标准UTL时区,然后是产生文件的位置和名字,3600是多长时间分割一次,单位秒。
CustomLog “| /usr/local/apache/bin/rotatelogs -l /usr/local/apache/logs/access_%Y%m%d%h.log 3600” common
注:若开启了https,虚拟主机,需要去对应的配置文件中修改日志记录。
6.不记录指定日志类型的日志
如果一个网站访问量特别大,那么访问日志就会很多,但有些访问日志是可忽略的,比如网站的图片夹杂哎,js、css等静态对象。
a.配置日志不记录图片访问
vim /usr/local/apache/etc/httpd.conf
SetEnvIf Request_URI “..gif " i m a g e s − r e q u e s t S e t E n v I f R e q u e s t U R I " . ∗ p ˙ n g " images-request SetEnvIf Request_URI ".*\.png "images−requestSetEnvIfRequestURI".∗p˙ng" images-request
SetEnvIf Request_URI "..jpg " i m a g e s − r e q u e s t S e t E n v I f R e q u e s t U R I " . ∗ b ˙ m p " images-request SetEnvIf Request_URI ".*\.bmp "images−requestSetEnvIfRequestURI".∗b˙mp” images-request
SetEnvIf Request_URI “..swf " i m a g e s − r e q u e s t S e t E n v I f R e q u e s t U R I " . ∗ j ˙ s " images-request SetEnvIf Request_URI ".*\.js "images−requestSetEnvIfRequestURI".∗j˙s" images-request
SetEnvIf Request_URI "..css$” images-request
CustomLog “| /usr/local/apache/bin/rotatelogs -l /usr/local/apache/logs/access_%Y%m%d%h.log 3600” common env=! images-request
用SetEnvIf的方式将Request_URI访问资源信息,以任意开头.gif、.png、.jpg等结尾的访问资源信息都标记为一个images-request的标签,再在日志文件声明中加入env,env调用images-request,!取反,表示env不调用images-request标签。
7.apache配置静态缓存
静态文件是指图片、js、css等文件,用户访问一个站点,其实大多数元素都是图片、js、css等,这些静态文件其实是会被客户端的浏览器缓存到本地电脑上的,目的就是为了下次再请求时不再去服务器上下载,这样就加快了速度,提高用户体验,但这些静态文件总不能一直缓存,它总有一些时效性,那么就得设置这个过期时间。
a.配置静态缓存
vim /usr/local/apache/etc/httpd.conf
LoadModule expires_module modules/mod_expires.so
启用静态缓存模块
< IfModule mod_expires.c>
ExpiresActive on
ExpiresBytype image/gif “access plus 1days”
声明缓存类型,缓存时间
ExpiresBytype image/jpeg “access plus 24 hours”
ExpiresBytype image/png “access plus 24 hours”
ExpiresBytype text/css “now plus 24 hours”
ExpiresBytype application/x-javascript “now plus 2 hours”
ExpiresBytype application/javascript “now plus 2 hours”
ExpiresBytype application/x-shockwava-flash “now plus 2 hours”
ExpiresDefault “now plus 0 min”
其他默认为0
< /IfModule>
或者使用mod_headers模块实现,该模块默认启用
<IfModule mod_headers.c>
htm,html,txt文件缓存一小时,3600s
<filesmatch " \.(html/htm/txt)$">
header set cache-control “max-age=3600”
</filesmatch>
js,css,swf类文件缓存一周
<filesmatch " \.(css/js/swf)$">
header set cache-control “max-age=604800”
</filesmatch>
jpg,gif,jpeg,png,ico,flv,pdf等文件缓存一年
<filesmatch " \.(jpg/gif/jpeg/ico/png/flv/pdf)$">
header set cache-control “max-age=29030400”
</filesmatch>
注:这两个模块必须事先已经支持,apachectl -M可以查看是否支持
b.重启服务器并验证
验证:curl -x 192.168.1.130:80 ‘https://www.laoli.com/image/a.jpg’ -I
有Cache-Control:max-age=xxx
有这个标签就可以证明缓存已设好启用了。