apache

一、概述

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 FollowSymLinksOption部分权限,访问服务器的权限option权限标题
None没有任何额外权限option权限
All所有权限,出去MultiViews以外option权限
Indexes浏览权限,当此目录下没有默认网页文件时,现实目录内容option权限
FllowSymLinks准许软连接到其他目录option权限
MultiViews准许文件名泛匹配,需手动开启模块才有效negotiationoption权限
AllowOverride None定义是否允许目录下。htaccess文件中的权限生效,是否启用.htaccess文件AllowOverride权限
None.htaccess中权限不生效AllowOverride权限
All所有权限生效AllowOverride权限
Authconfig只有网页认证的权限生效AllowOverride权限
Require all granted(denied)访问控制列表,Require部分,一般用防火墙,不用这个,允许所有granted,拒绝所有deniedRequire权限
</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 "imagesrequestSetEnvIfRequestURI".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 "imagesrequestSetEnvIfRequestURI".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 "imagesrequestSetEnvIfRequestURI".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
有这个标签就可以证明缓存已设好启用了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值