Web基础(下)

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: Web基础(下)

(2)MPM=worker


worker是多进程多线程模式,一个进程创建多个线程,每个线程响应一个连接请求,但是通知机制还是select不过可以接受更多的请求


优点: 节省资源,适用于高并发场景

缺点: 兼容性不好、稳定性不好,同样具有keep-alive长连接占据问题

原理: worker模式的进程可以创建多个线程,每个线程响应一个连接请求



202104220939244.png




(3)MPM=event


event是worker的升级版,把服务器进程和响应连接请求进行了分离,基于异步I/O模型(即input和output上传读取是分开的)


I/O模型使event在连接请求过来后进程并不直接处理请求,而是交给其他机制来处理,然后通过epoll机制来确认请求是否完成。在这个过程中,进程本身一直处于空闲状态,所以一直可以接受用户的请求,从而实现一个进程响应多个连接请求。


event对于keep-alive长连接处理也有所优化,event模式有单独的线程去处理keep-alive长连接,执行完毕后才会允许长连接释放,这样增强了高并发场景下的连接请求处理能力。


优点: 支持海量级高并发负载,消耗资源少,适用于高并发场景


缺点: 对https支持的不完美


20210422093935647.png




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


20210422094000770.png


发现可以正常访问


(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

现在使用浏览器进行访问:


20210422094032611.png

会显示所有网页目录,这样在真实环境中肯定是不允许,用户只有在ip后面跟网页目录才会显示相应的内容,例如:


2021042209404726.png


那么只需要在配置文件中修改一样东西,就可以让用户访问不到所有的目录


[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  #重启服务


再次进行访问

8699629600ca4ab397db0e900a756275.png


就会发现以及禁止访问了,必须在后面加目录名才可以

所有的目录**


[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  #重启服务

再次进行访问

20210422094103301.png


就会发现以及禁止访问了,必须在后面加目录名才可以

20210422094111912.png

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
目录
相关文章
|
前端开发 JavaScript Java
计算机二级web题目(4)--CSS基础
计算机二级web题目(4)--CSS基础
159 1
|
前端开发 JavaScript Java
计算机二级web题目(3)--HTML基础
计算机二级web题目(3)--HTML基础
152 1
|
开发框架 网络协议 JavaScript
计算机二级web题目(1)--web基础
计算机二级web题目(1)--web基础
201 1
|
域名解析 人工智能 网络协议
Web基础(上)
Web基础(上)
217 0
Web基础(上)
|
前端开发 JavaScript 人机交互
Web开发及人机交互导论 实验九 JavaScript基础
Web开发及人机交互导论 实验九 JavaScript基础
301 0
Web开发及人机交互导论 实验九 JavaScript基础
|
前端开发 人机交互
Web开发及人机交互导论 实验三 CSS+DIV基础
Web开发及人机交互导论 实验三 CSS+DIV基础
170 0
Web开发及人机交互导论 实验三 CSS+DIV基础
|
域名解析 网络协议 网络架构
《图解HTTP》-WEB及网络基础学习笔记
简单来说,客户端就是个人使用的电脑,而服务端就是服务器。通过电脑访问服务器上的资源,用的就是HTTP协议。
126 0
《图解HTTP》-WEB及网络基础学习笔记
|
Java Linux 开发工具
一、搭建SpringBoot2.0.0M4基础Web项目
搭建SpringBoot2.0.0M4基础Web项目
101 0
一、搭建SpringBoot2.0.0M4基础Web项目
|
域名解析 缓存 网络协议
Web基础与HTTP协议
域名概念回顾: IP地址不易记忆,域名用于代替IP地址,方便记忆。 两台主机通信,是通过IP地址访问,所以需要将域名解析成IP地址。 早期使用Hosts文件解析域名,但随着域名的增多,工作量巨大,维护困难。 之后使用DNS (Domain Name Server,域名服务器) 进行域名解析。
176 0
|
安全 测试技术 数据库
猿创征文|Python基础——Visual Studio版本——Web开发
猿创征文|Python基础——Visual Studio版本——Web开发
222 0
猿创征文|Python基础——Visual Studio版本——Web开发