(2)MPM=worker
worker是多进程多线程模式,一个进程创建多个线程,每个线程响应一个连接请求,但是通知机制还是select不过可以接受更多的请求
优点: 节省资源,适用于高并发场景
缺点: 兼容性不好、稳定性不好,同样具有keep-alive长连接占据问题
原理: worker模式的进程可以创建多个线程,每个线程响应一个连接请求
(3)MPM=event
event是worker的升级版,把服务器进程和响应连接请求进行了分离,基于异步I/O模型(即input和output上传读取是分开的)
I/O模型使event在连接请求过来后进程并不直接处理请求,而是交给其他机制来处理,然后通过epoll机制来确认请求是否完成。在这个过程中,进程本身一直处于空闲状态,所以一直可以接受用户的请求,从而实现一个进程响应多个连接请求。
event对于keep-alive长连接处理也有所优化,event模式有单独的线程去处理keep-alive长连接,执行完毕后才会允许长连接释放,这样增强了高并发场景下的连接请求处理能力。
优点: 支持海量级高并发负载,消耗资源少,适用于高并发场景
缺点: 对https支持的不完美
4、静态编译和动态编译
httpd是高度模块化的程序,也就是说httpd的各种功能都需要加载对应的模块来执行,但是前提是必须将使用功能的对应模块进行编译,方便httpd进行加载
静态编译: 直接将模块编译到httpd的核心当中。静态编译的所有模块都会随着httpd主程序进行启动和关闭
动态编译: 将模块编译好,但是不编译到httpd的核心当中。想要启动动态编译的模块,需要在httpd的配置文件中使用loadModule指令去加载使用
5、访问日志access_log详解
[root@rzy ~]# tail -1 /usr/local/httpd/logs/access_log #查看最后一行 192.168.100.230 - - [13/Apr/2021:19:22:17 +0800] "GET / HTTP/1.1" 200 6 #注释: 192.168.100.230:远程主机ip,表示访问网站的是谁 - :这一行是用户的邮箱,但是为了避免用户的邮箱被垃圾邮件骚扰,第二列使用-取代 - :用于记录浏览者进行身份验证时提供的名字,这里为-是因为没有使用用户密码验证登录,例如用rzy 密码123登录,那么这里显示的就是rzy [13/Apr/2021:19:22:17 +0800] :请求时间,表明用户访问的时间,采用公用日志格式或者标准英文格式,+0800表示服务器所处时区位于UTC之后的8小时 "GET /favicon.ico HTTP/1.1" :GET表示方法,/表示用户访问的资源这里表示的是网页目录的相对资源,HTTP/1.1表示用户访问时使用的协议 200 :状态码 6 :发送的字节数,可以查看配置主页的内容有多少字节 我这里使用的是虚拟机,使用真机查看时最后还会多一个字段,为访问用户的客户端系统、浏览器类型等信息 #### [root@rzy ~]# ll /usr/local/httpd/htdocs/ 总用量 4 -rw-r--r-- 1 root root 6 4月 13 17:56 index.html #6 表示6个字节
四、安装apache
(1)实验环境
系统 | ip地址 | 主机名 | httpd版本 |
Centos7.4 | 192.168.100.202 | rzy | httpd-2.2.17.tar.gz |
(2)实验目的
- 客户端可以成功访问httpd服务器
- 优化httpd服务,调整三种工作模式
(3)安装httpd服务
******(1)先做初始配置 [root@rzy ~]# systemctl stop firewalld [root@rzy ~]# setenforce 0 setenforce: SELinux is disabled [root@rzy ~]# mount /dev/cdrom /mnt/ mount: /dev/sr0 写保护,将以只读方式挂载 mount: /dev/sr0 已经挂载或 /mnt 忙 /dev/sr0 已经挂载到 /mnt 上 [root@rzy ~]# rpm -e httpd --nodeps #检查httpd服务是否安装,如果两个httpd端口会冲突 错误:未安装软件包 httpd ******(2)上传httpd源码包,进行解压,安装 [root@rzy ~]# ll 总用量 6448 -rw-------. 1 root root 1264 1月 12 18:27 anaconda-ks.cfg -rw-r--r-- 1 root root 6597991 4月 13 17:10 httpd-2.2.17.tar.gz [root@rzy ~]# tar xf httpd-2.2.17.tar.gz -C /usr/src/ [root@rzy ~]# cd /usr/src/httpd-2.2.17/ [root@rzy httpd-2.2.17]# ./configure --prefix=/usr/local/httpd --enable-so --enable-rewrite --enable-cgi #等待配置完成,模块注释: --prefix= 指定安装目录 --enable-so 开启动态加载模块的功能 --enable-rewrite 开启地址重写、重定向功能 --enable-cgi 开启与一些动态编程语言之间进行交互的接口 #配置完成后进行编译安装 [root@rzy httpd-2.2.17]# make && make install [root@rzy httpd-2.2.17]# echo $? #检测安装是否成功,使用$?来查看,返回为0则为成功 0 [root@rzy httpd-2.2.17]# ls /usr/local/httpd/ #检查prefix指定的安装路径下是否有了httpd的相关目录 bin build cgi-bin conf error htdocs icons include lib logs man manual modules #常用目录注释: bin 存放httpd的各种命令 lib 跟httpd相关的库文件 man httpd的帮助文档 modules httpd的模块文件 conf httpd的配置文件存放目录 htdocs httpd的网页存放位置 logs httpd的日志存放位置 build 存放httpd之前的配置信息的文件 ########### ******(3)安装httpd后的优化配置 [root@rzy httpd-2.2.17]# cd [root@rzy ~]# ln -s /usr/local/httpd/bin/* /usr/local/bin/ #优化httpd执行命令路径 [root@rzy ~]# httpd -v #查看httpd的版本 Server version: Apache/2.2.17 (Unix) Server built: Apr 13 2021 17:17:14 [root@rzy ~]# cp /usr/local/httpd/bin/apachectl /etc/init.d/httpd #复制一份httpd的启动脚本 [root@rzy ~]# chmod -x /etc/init.d/httpd #添加可执行权限 [root@rzy ~]# /etc/init.d/httpd start #启动httpd httpd: Could not reliably determine the server's fully qualified domain name, using fe80::34f4:cad:16ae:5b4d for ServerName #这个提示语是因为没有修改服务器域名 [root@rzy ~]# netstat -anpt | grep 80 #检查端口 tcp6 0 0 :::80 :::* LISTEN 53530/httpd [root@rzy ~]# /etc/init.d/httpd stop #关闭httpd httpd: Could not reliably determine the server's fully qualified domain name, using fe80::34f4:cad:16ae:5b4d for ServerName [root@rzy ~]# netstat -anpt | grep 80 #检查端口 ******(4)修改配置文件,配置网页文档 [root@rzy ~]# vim /usr/local/httpd/conf/httpd.conf 。。。。。。 87 # 88 ServerAdmin admin@linuxfan.cn #这个是管理员邮箱,不用修改,这是apache官方为了收集有多少人使用apache而创建的 89 。。。。。。 96 # 97 ServerName www.rzy.com:80 #修改域名可以解决刚才的报错问题 98 。。。。。。 131 <Directory "/usr/local/httpd/htdocs"> #这个区域用来指定网页的路径,并且可以设置网页,比如限制访问、认证等 132 Options Indexes FollowSymLinks #中间的#号可以全部删除 133 AllowOverride None 134 Order allow,deny 135 Allow from all #限制访问顺序:先允许,后拒绝,默认拒绝所有。 136 #先拒绝,后允许,默认允许所有 137 </Directory> 138 。。。。。。 143 <IfModule dir_module> 144 DirectoryIndex index.html #apache解析的主页,后续想安装php解析动态页面的话就可以添加index.php 145 </IfModule> 146 。。。。。。 163 # 164 ErrorLog "logs/error_log" #错误日志存放位置,这是一个相对路径是从prefix指定的安装路径开始的 165 。。。。。。 170 # 171 LogLevel warn #日志级别 172 。。。。。。 192 # 193 CustomLog "logs/access_log" common #访问日志存放位置,和错误日志相同都是相对路径 194 #保存退出 [root@rzy ~]# echo "aaaaa" > /usr/local/httpd/htdocs/index.html #创建目录 [root@rzy ~]# /etc/init.d/httpd start #开启httpd服务 [root@rzy ~]# netstat -anptu | grep 80 #检查端口 tcp6 0 0 :::80 :::* LISTEN 53568/httpd
(5)使用客户机测试是否可以正常访问httpd
发现可以正常访问
(4)优化httpd服务,调整三种工作模式
设置httpd的工作模式时,不仅要考虑网站的并发性能等工作效率,还要考虑服务器硬件cpu和内存的占用情况,内存尤为重要
-prefork工作模式
- prefork(进程+子进程)模式,是httpd-2.2.17版本默认的工作模式
[root@rzy ~]# /usr/local/httpd/bin/httpd -V | grep "Server MPM" #查看当前apache工作模式 Server MPM: Prefork [root@rzy ~]# vim /usr/local/httpd/conf/extra/httpd-mpm.conf #查看配置文件中prefork的选项 。。。。。。 36 <IfModule mpm_prefork_module> 37 StartServers 5 #服务器启动时建立的子进程数量 38 MinSpareServers 5 #空闲子进程最小数量,当空闲子进程数少于该数值将产生新的子进程 39 MaxSpareServers 2 #空闲子进程最大数量,当空闲子进程数大于该数值将杀死多余的子进程 40 MaxClients 150 #限定最大用户并发数,是对apache性能影响最大的参数 41 MaxRequestsPerChild 10000 #每个子进程在其生存期间允许处理的最大请求数量,若为0则代表该进程不会因为请求数量的变化而停止。 42 </IfModule> 。。。。。。 #保存退出 [root@rzy ~]# vim /usr/local/httpd/conf/httpd.conf 。。。。。。 347 # Server-pool management (MPM specific) 348 Include conf/extra/httpd-mpm.conf #去掉#注释 349 。。。。。。 #保存退出 [root@rzy ~]# /etc/init.d/httpd restart #重启服务 [root@rzy ~]# ps aux | grep httpd | grep -v grep #查看进程发现创建了多个子进程 root 53568 0.0 0.1 28304 1980 ? Ss 17:57 0:00 /usr/local/httpd/bin/httpd -k start daemon 53612 0.0 0.1 28304 1420 ? S 18:20 0:00 /usr/local/httpd/bin/httpd -k start daemon 53613 0.0 0.1 28304 1420 ? S 18:20 0:00 /usr/local/httpd/bin/httpd -k start daemon 53614 0.0 0.1 28304 1420 ? S 18:20 0:00 /usr/local/httpd/bin/httpd -k start daemon 53615 0.0 0.1 28304 1420 ? S 18:20 0:00 /usr/local/httpd/bin/httpd -k start daemon 53616 0.0 0.1 28304 1420 ? S 18:20 0:00 /usr/local/httpd/bin/httpd -k start
-worker工作模式
- worker(多进程+多线程)工作模式,适用于高并发场景
#注意: 想要开启worker模式,需要在编译安装的时候使用 --with-mpm=worker选项指定,所以需要先使用make clean情况已经编译的内容,再重新编译 ###### [root@rzy ~]# cd /usr/src/httpd-2.2.17/ #先进入解压源码包的目录 [root@rzy httpd-2.2.17]# make clean #清空已经编译的内容 [root@rzy httpd-2.2.17]# ./configure --prefix=/usr/local/httpd/ --enable-so --enable-rewrite --enable-cgi --with-mpm=worker && make && make install #重新进行编译,安装 [root@rzy httpd-2.2.17]# cd [root@rzy ~]# /usr/local/httpd/bin/httpd -V | grep "Server MPM" #查看当前模式是否成功修改 Server MPM: Worker [root@rzy ~]# vim /usr/local/httpd/conf/extra/httpd-mpm.conf #查看配置文件中worker模式的选项 。。。。。。 51 <IfModule mpm_worker_module> 52 StartServers 2 #服务器启动时建立的子进程数量 53 MaxClients 150 #限定最大用户并发数 54 MinSpareThreads 25 #空闲子线程最小数量,当空闲子线程数少于该数值将产生新的子线程 55 MaxSpareThreads 75 #空闲子线程最大数量,当空闲子线程数大于该数值将杀死多余的子线程 56 ThreadsPerChild 50 #每个子进程最大的并发线程数 57 MaxRequestsPerChild 10000 #每个子进程在其生存期间内允许服务的最大请求数量,设置为0则子进程将永远不会结束 58 </IfModule> 59 。。。。。。 #保存退出 [root@rzy ~]# ps aux | grep httpd | grep -v grep #查看子进程数 root 53568 0.0 0.1 28304 1980 ? Ss 17:57 0:00 /usr/local/httpd/bin/httpd -k start daemon 53612 0.0 0.1 28304 1420 ? S 18:20 0:00 /usr/local/httpd/bin/httpd -k start daemon 53613 0.0 0.1 28304 1420 ? S 18:20 0:00 /usr/local/httpd/bin/httpd -k start daemon 53614 0.0 0.1 28304 1420 ? S 18:20 0:00 /usr/local/httpd/bin/httpd -k start daemon 53615 0.0 0.1 28304 1420 ? S 18:20 0:00 /usr/local/httpd/bin/httpd -k start daemon 53616 0.0 0.1 28304 1420 ? S 18:20 0:00 /usr/local/httpd/bin/httpd -k start
-event工作模式
- event是一个多进程,多线程的工作模式,解决了长连接占据问题,适用于高并发场景
[root@rzy ~]# cd /usr/src/httpd-2.2.17/ [root@rzy httpd-2.2.17]# make clean #同样进行配置清空 [root@rzy httpd-2.2.17]# ./configure --prefix=/usr/local/httpd/ --enable-so --enable-rewrite --enable-cgi --with-mpm=event && make && make install #使用--with-mpm=event安装 [root@rzy httpd-2.2.17]# cd [root@rzy ~]# /usr/local/httpd/bin/httpd -V | grep "Server MPM" #查看模式是否修改成功 Server MPM: Event [root@rzy ~]# vim /usr/local/httpd/conf/extra/httpd-mpm.conf #查看配置文件中event的选项 。。。。。。 110 111 <IfModule mpm_event_module> #手动编写 112 ServerLimit 1000 #服务器开启后最大的进程数 113 StartServers 20 #服务器启动时建立的子进程数 114 MinSpareThreads 25 #空闲子进程最小数,当空闲子进程少于该数值将产生新的子进程 115 MaxSpareThreads 1200 #空闲子进程最大数,当空闲子进程大于该数值将杀死多余的子进程 116 ThreadsPerChild 50 #每个进程的最大并发线程数 117 MaxRequestsPerChild 1000 #每个子进程再其生存期间内允许服务器的最大请求数量,为0则子进程永远不会结束 118 </IfModule> 。。。。。。 #保存退出 [root@rzy ~]# ps aux | grep httpd | grep -v grep #查看子进程数量 root 53568 0.0 0.1 28304 1980 ? Ss 17:57 0:00 /usr/local/httpd/bin/httpd -k start daemon 53612 0.0 0.1 28304 1420 ? S 18:20 0:00 /usr/local/httpd/bin/httpd -k start daemon 53613 0.0 0.1 28304 1420 ? S 18:20 0:00 /usr/local/httpd/bin/httpd -k start daemon 53614 0.0 0.1 28304 1420 ? S 18:20 0:00 /usr/local/httpd/bin/httpd -k start daemon 53615 0.0 0.1 28304 1420 ? S 18:20 0:00 /usr/local/httpd/bin/httpd -k start daemon 53616 0.0 0.1 28304 1420 ? S 18:20 0:00 /usr/local/httpd/bin/httpd -k start [root@rzy ~]# cat /usr/local/httpd/build/config.nice #查看配置时使用的模块信息 #! /bin/sh # # Created by configure "./configure" \ "--prefix=/usr/local/httpd/" \ "--enable-so" \ "--enable-rewrite" \ "--enable-cgi" \ "--with-mpm=event" \ "$@" [root@rzy ~]# /usr/local/httpd/bin/apachectl -D DUMP_MODULES #查看模块 Loaded Modules: core_module (static) #static就是静态模块的意思 authn_file_module (static) authn_default_module (static) authz_host_module (static) authz_groupfile_module (static) authz_user_module (static) authz_default_module (static) auth_basic_module (static) include_module (static) filter_module (static) log_config_module (static) env_module (static) setenvif_module (static) version_module (static) mpm_event_module (static) http_module (static) mime_module (static) status_module (static) autoindex_module (static) asis_module (static) cgid_module (static) cgi_module (static) negotiation_module (static) dir_module (static) actions_module (static) userdir_module (static) alias_module (static) rewrite_module (static) so_module (static) Syntax OK
五、扩展
正常情况下不做任何配置如果写多个目录的话,用户访问的时候会全部显示出来。例如:
[root@rzy ~]# cd /usr/local/httpd/htdocs/ [root@rzy htdocs]# ll 总用量 4 -rw-r--r-- 1 root root 6 4月 13 17:56 index.html [root@rzy htdocs]# rm -rf index.html [root@rzy htdocs]# mkdir aaa [root@rzy htdocs]# mkdir bbb [root@rzy htdocs]# cd bbb/ [root@rzy bbb]# echo "bbbbb" > index.html [root@rzy bbb]# cd .. [root@rzy htdocs]# cd aaa/ [root@rzy aaa]# echo "aaaaa" > index.html
现在使用浏览器进行访问:
会显示所有网页目录,这样在真实环境中肯定是不允许,用户只有在ip后面跟网页目录才会显示相应的内容,例如:
那么只需要在配置文件中修改一样东西,就可以让用户访问不到所有的目录
[root@rzy aaa]# vim /usr/local/httpd/conf/httpd.conf 。。。。。。 131 <Directory "/usr/local/httpd/htdocs"> 132 Options Indexes FollowSymLinks #把Indexes删除 133 AllowOverride None 134 Order allow,deny 135 Allow from all 。。。。。。 #删除后: 131 <Directory "/usr/local/httpd/htdocs"> 132 Options FollowSymLinks 133 AllowOverride None 134 Order allow,deny 135 Allow from all 。。。。。。 [root@rzy aaa]# /etc/init.d/httpd restart #重启服务
再次进行访问
就会发现以及禁止访问了,必须在后面加目录名才可以
所有的目录**
[root@rzy aaa]# vim /usr/local/httpd/conf/httpd.conf 。。。。。。 131 <Directory "/usr/local/httpd/htdocs"> 132 Options Indexes FollowSymLinks #把Indexes删除 133 AllowOverride None 134 Order allow,deny 135 Allow from all 。。。。。。 #删除后: 131 <Directory "/usr/local/httpd/htdocs"> 132 Options FollowSymLinks 133 AllowOverride None 134 Order allow,deny 135 Allow from all 。。。。。。 [root@rzy aaa]# /etc/init.d/httpd restart #重启服务
再次进行访问
就会发现以及禁止访问了,必须在后面加目录名才可以