io模型
1.单进程io模型 启动一个进程处理用户请求,一次处理一个请求,多个请求被串行执行
2.多进程io模型 并行启动多个进程,每个进程响应1个连接请求
3.复用io模型 启动1个进程同时响应n个连接请求
实现方法:多线程和事件驱动
多线程模型 1个进程生成n个线程,每个线程响应1个请求
事件驱动 一个进程处理n个请求
复用的多进io模型
启动m个进程,每个进程响应n个请求
安装包:httpd,httpd-manual
端口:80,8443
netstat -apltu 监听所有的存活的udp端口
配置文件:
/etc/httpd/conf/httpd.conf
/etc/httpd/conf.d/
/etc/httpd/conf.modules.d
[root@localhost ~]# ls /etc/httpd/
conf conf.d conf.modules.d logs modules run
数据目录:/var/www/html
启动服务:systemctl restart httpd
客户端访问:
elinks 192.168.113.129
elinks --dump 192.168.113.129 在终端显示
apache 工作模式(MPM)
prefork
Apache 在启动之初,预先fork一些子进程,然后等待进程进来
每个子进程只有一个线程,一个线程一次只能处理一个请求
worker
多进程多线程的混合模式,也预先fork了几个子进程,每个子进程创建一些进程,同时包括一个监听线程,每个请求过来会被分配一个线程,线程比进程更轻量,因为线程通常会共享父进程的内存空间,内存的占用会少,在高并发场景,因为比起prefork有更多的线程,表现更优秀
优点:
占据更少的内存,高并发表现更优秀
缺点:
必须考虑线程安全的问题,子进程共享父进程的内存地址空间,如果使用keep-alive的长连接,某个线程会一直被占据。需要等待超时才会被释放,
event
与worker很像,keep-alive场景下,长期被占用的线程的资源浪费问题
里面有专门的线程来管理keep-alive的线程,当真实请求过来,会将请求传递给此案出,执行完毕后释放