Web服务器--Apache
- Apache是进行传输超文本的媒介,Html ,超文本是指页面内包含图片,链接甚至音乐,程序等非文本元素。传输超文本的协议叫超文本传输协议,http。http使用统一资源定位符URL来建立连接和传输数据。URI,统一资源标志符,但是更宽泛,包含URL。
- Apache概述与工作模式
概述: 世界第一使用量的web服务器软件,可以运行在几乎所有计算机平台。快速可靠,通过简单的API扩充将各种解释器编译到服务器中。不适合多处理器环境,进程消耗比线程多。
处理流程: 守护进程->工作进程->产生线程(处理请求)
客户端通过随机端口连接到Apache的80端口,服务器开启线程进程请求处理,匹配用户的请求是动态还是静态的:
静态 : 服务器直接回传页面给客户端(html)
动态 : 需要解析器,服务器找到PHP处理后的页面回传给客户端。(是否需要连接数据库)
Apache工作模式: 3种稳定的MPM模式(MPM:多进程处理模块)分别是:
prefork、worker、event。
prefork工作模式:
Apache在启动之前,就预先fork一些子进程,然后等待请求进来、之所以这样做。是为了减少频繁创建和销毁进程的开销。每个子进程只有一个线程,在一个时间点,只能处理一个请求。
优点:成熟稳定,兼容所有新老模块。同时不需要担心线程安全问题。
缺点: 一个进程占用相对多的系统资源,消耗更多的内存,而且不擅长处理高并发请求。
worker 工作模式:
使用多进程和多线程的混合模式。它也预先fork一些子进程(数量少),然后每个子进程创建一些线程,包括一个监听线程。该监听线程监听接入请求并将其传递给服务线程处理和应答。线程相比进程更轻量,消耗资源更少。因为线程通常会共享父进程的内存空间,所以占用资源更少。在高并发的场景下,相比prefork有更多的可用线程,处理能力会更强。
优点: 占据更少的内存高并发表现更优秀。
缺点: 必须考虑线程安全问题,一个线程死亡,整个线程所在的子进程上所有线程都会死亡
event 工作模式:
和worker模式类似,最大的区别在于,解决了keep-alive(早期http申请资源需要不停地进行TCP连接与断开,浪费资源。所以有了keep-alive,keep-alive设置了keepalive_timeout,会在http守护进程发送完一个响应后等待一个keepalive_timeout时间,超过时间才会断开。但是长时间的使用等待可能会更加浪费资源)长时间占用线程的浪费问题,有一个专门的线程来管理这些keep-alive类型的线程增强高并发下的请求处理能力。
查看方式: http -V | grep -i “server mpm”
指定方式: 在编译时指定选项 --with-mpm=xxx
3.Apache的配置详解
开始配置:
1. 安装
[root@apache ~]# yum install -y httpd httpd-manual
[root@apache ~]# rpm -ql httpd
/etc/httpd/conf.d/autoindex.conf
/etc/httpd/conf.d/userdir.conf
/etc/httpd/conf.d/welcome.conf
/etc/httpd/conf.modules.d
/etc/httpd/conf.modules.d/00-base.conf
/etc/httpd/conf.modules.d/00-dav.conf
/etc/httpd/conf.modules.d/00-lua.conf
/etc/httpd/conf.modules.d/00-mpm.conf
/etc/httpd/conf.modules.d/00-proxy.conf
/etc/httpd/conf.modules.d/00-systemd.conf
/etc/httpd/conf.modules.d/01-cgi.conf
子配置文件
/etc/httpd/conf/httpd.conf
主配置文件
日志
/var/log/httpd/
错误日志:记录apache-server出过哪些错误
访问日志:记录哪些客户端访问过当前的web-server
/etc/logrotate.d/httpd
日志轮转
/var/log/httpd/*log {
missingok
notifempty
sharedscripts
delaycompress
postrotate
/bin/systemctl reload httpd.service > /dev/null 2>/dev/null || true
## 重新加载apache的配置文件
## 正确输出和错误输出全部进入黑洞文件
## || 前面的命令执行失败,执行后面的命令
&& 前面的命令执行成功,执行后面的命令
## true 永远返回一个真值
面试题:为什么要做这个操作?
日志文件轮转以后,旧文件的inode没有变化,如果不重新加载配置文件,新的日志依然写入旧的日志文件,轮转失效。
endscript
}
/usr/lib64/httpd/modules
##apache的模块
/usr/share/doc/httpd-2.4.6
##配置帮助
/var/www
##页面发布目录
[root@apache ~]# systemctl start httpd
浏览器访问:http://172.16.0.31/manual/
[root@apache ~]# grep "apache" /etc/passwd
apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin
2. 解读配置文件
[root@apache /etc/httpd/conf]# vim httpd.conf
##目录容器,定义一个访问的虚拟路径
<Directory /> ##没有""包起来,这是虚拟路径
AllowOverride none
Require all denied
</Directory>
DocumentRoot "/var/www/html"
##定义默认的访问路径
<Directory "/var/www"> ##""包起来的,实体路径
AllowOverride None
# Allow open access:
Require all granted
</Directory>
<Directory "/var/www/html">
Options Indexes FollowSymLinks
##目录容器的配置选项
#Indexes 支持索引
#FollowSymLinks 支持软链接
AllowOverride None
##是否使用验证
#None表示不使用
Require all granted
##访问控制列表,允许哪些客户端访问本机apache
#all granted 允许所有的客户端访问
</Directory>
(1)安装后,直接启动,访问结果,错误测试页
[root@apache /etc/httpd/conf.d]# vim welcome.conf
<LocationMatch "^/+$">
Options -Indexes
ErrorDocument 403 /.noindex.html
</LocationMatch>
<Directory /usr/share/httpd/noindex>
AllowOverride None
Require all granted
</Directory>
##测试页,不存在,直接返回403错误
Alias /.noindex.html /usr/share/httpd/noindex/index.html
##访问的页面是 /.noindex.html
# cd /var/www/html/
[root@apache /var/www/html]# ls
[root@apache /var/www/html]# echo "test" > index.html
[root@apache /var/www/html]# cp /etc/passwd .
[root@apache /var/www/html]# cp /etc/group .
#有默认测试页的情况下,其他文件不能被访问
[root@apache /var/www/html]# rm -f index.html
[root@apache /var/www/html]# ls
group passwd
[root@apache /etc/httpd/conf.d]# vim welcome.conf
##注释这个文件的所有配置
[root@apache /etc/httpd/conf.d]# systemctl restart httpd
(2)Indexes
展示页面发布目录下的文件
[root@apache /etc/httpd/conf]# vim httpd.conf
#Options Indexes FollowSymLinks
Options Indexes
[root@apache /etc/httpd/conf]# systemctl restart httpd
(3)FollowSymLinks
在页面展示目录下,是否支持软链接
[root@apache /var/www/html]# ln -s /etc/fstab .
[root@apache /var/www/html]# ll
total 8
lrwxrwxrwx 1 root root 10 Aug 14 14:35 fstab -> /etc/fstab
-rw-r--r-- 1 root root 481 Aug 14 14:10 group
-rw-r--r-- 1 root root 1031 Aug 14 14:10 passwd
[root@apache /etc/httpd/conf]# vim httpd.conf
Options Indexes FollowSymLinks
[root@apache /etc/httpd/conf]# systemctl restart httpd
(4)访问验证
[root@apache /etc/httpd/conf]# vim httpd.conf
AllowOverride All ##在目录容器里面
AccessFileName .htaccess ##在目录容器外面
<Files ".ht*"> ##文件容器,约束 ".ht" 以.ht开头命名的文件
Require all denied ##拒绝所有人访问
</Files>
[root@apache /var/www/html]# vim .htaccess
AuthName "access-test" ##验证的名字
AuthType Basic ##验证的类型,基本验证
AuthUserFile "/var/www/html/.htpasswd" ##保存合法用户的文件
Require valid-user ##只有合法的用户才可以访问
[root@apache /var/www/html]# htpasswd -c /var/www/html/.htpasswd h1
-c 创建用户文件
New password:
Re-type new password:
Adding password for user h1
[root@apache /var/www/html]# cat .htpasswd
h1:$apr1$qO3Rhva5$3RgNncMHN2npNWt7CDQVW.
[root@apache /var/www/html]# htpasswd /var/www/html/.htpasswd h2
New password:
Re-type new password:
Adding password for user h2
[root@apache /var/www/html]# cat .htpasswd
h1:$apr1$qO3Rhva5$3RgNncMHN2npNWt7CDQVW.
h2:$apr1$gSEFk0Ia$vLtp05wisooWhrMEfIZZ60
[root@apache /etc/httpd/conf]# systemctl restart httpd
(5)访问控制
Require all granted ##允许所有的客户端访问
Require all denied ##拒绝所有的客户端访问
白名单:允许哪些客户端访问本机的web-server
应用在网站的后台web-server,只允许公司的业务人员访问。
Require all denied
require ip ip地址列表
[root@apache /etc/httpd/conf]# vim httpd.conf
Require all denied
Require ip 172.16.0.230AuthName "access-test" ##验证的名字
AuthType Basic ##验证的类型
[root@apache /etc/httpd/conf]# systemctl restart httpd
黑名单:拒绝哪些客户端访问本机的web-server
应用在网站的前台web-server,允许来自互联网的所有用户,拒绝的非法访问。
如何确认用户是非法的?
分析apache的访问日志。
<RequireAll>
require not ip ip地址列表
Require all granted
</RequireAll>
[root@apache /etc/httpd/conf]# vim httpd.conf
<RequireAll>
Require not ip 172.16.0.230
Require all granted
</RequireAll>
[root@apache /etc/httpd/conf]# systemctl restart httpd
--------------------------------------------------------
##定义默认的测试页的文件名
<IfModule dir_module>
DirectoryIndex index.html
</IfModule>
##访问日志
##定义访问日志的格式
LogFormat "%h %l %u %t "%r" %>s %b "%{Referer}i" "%{User-Agent}i"" combined
LogFormat "%h %l %u %t "%r" %>s %b" common
172.16.0.230 - - [10/Jun/2019:18:44:48 +0800] "GET / HTTP/1.1" 200 690 "-" "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Win64; x64; Trident/4.0; .NET CLR 2.0.50727; SLCC2; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E; Tablet PC 2.0)"
172.16.0.230 客户端的IP
- - 两个占位符
[10/Jun/2019:18:44:48 +0800] 访问时间,时区
GET / HTTP/1.1 访问方式,协议
200 状态码
-------------------
web-server的状态码:
1xx 消息
2xx 访问成功
200 OK
3xx 重定向
4xx 客户端错误
5xx 服务器错误
-------------------
690 server给client传输了多大的文件,byte
后面是客户端信息
TypesConfig /etc/mime.types
##web-server在浏览器上支持的文件格式