博文大纲:
一, 安装 Apache2.4 版本;
二, Apache 服务的三种工作模式详解;
三, 修改 apache 的工作模式;
四, apache 工作模式的优化与修改;
五, 进程与线程的区别.
apache 是一个模块化设计的服务, 所谓的模块化就是将各个功能, 特性都独立的分开, 这样设计的好处是可扩展性强, 各个功能之间的依赖性相对较弱, 在后期修改, 升级, 添加新功能是非常方便. 不同的模块可以静态的编译进程序, 也可以被动态加载. 动态加载是 apache 的特性 (DSO,dynamic shared object), 所谓的动态加载就需要新的功能的时候, 只需将功能模块编译出来, 通过配置文件加载到 apache 服务中, 而不需要重新编译 apache.
apache 的版本有 2.0,2.2,2.4 三个版本使用较多, 每个版本使用安装都有少许差异, 我今天介绍的是 2.4 的版本, 兄弟们使用的话要看仔细了,
Apache 服务新版本 2.4 新增特性介绍:
新增模块
- mod_proxy_fcgi(可提供 fcgi 代理)
- mod_ratelimit(限制用户带宽)
- mod_request(请求模块, 对请求做过滤)
- mod_remoteip(匹配客户端的 IP 地址)
对于基于 IP 的访问控制做了修改, 不再支持 allow,deny,order 机制, 而是统一使用 require 进行.
还新增以下几条新的特性:
MPM 支持在运行时装载且支持 event
支持异步读写
在每个模块及每个目录上指定日志级别
增强版的表达式分析器
每请求配置: <If>, <Elseif>
毫秒级别的 keepalive timeout
基于 FQDN 的虚拟主机不再需要 NameVirtualHost 指令
支持使用自定义变量
一, 安装 Apache2.4
安装环境: 操作系统: Centos7.2, 关闭 selinux
检查 httpd 包是否安装, 如安装则卸载.
下载源码包:
- httpd-2.4.23.tar.gz
- apr-1.5.2.tar.gz
- apr-util-1.5.4.tar.gz
- zlib-1.2.8.tar.gz
- pcre-8.39.tar.gz
注: apr(Apache Portable Runtime)Apache 可移植运行库, 它是一个对操作系统调用的抽
象库, 用来实现 Apache 内部组件对操作系统的使用, 提高系统的可移植性
链接: https://pan.baidu.com/s/1km0qEYh556OtEygqc7I1GQ
1. 开始安装
- [[email protected] ~]# rz #xshell 中, 使用 rz 命令将下载的 tar 包上传至 web 服务器
- # 以下是将所有源码包解压缩
- [[email protected] ~]# tar zxf openssl-1.0.1u.tar.gz -C /usr/src
- [[email protected] ~]# tar zxf pcre-8.39.tar.gz -C /usr/src
- [[email protected] ~]# tar zxf zlib-1.2.8.tar.gz -C /usr/src
- [[email protected] ~]# tar zxf httpd-2.4.23.tar.gz -C /usr/src
- [[email protected] ~]# tar zxf apr-1.5.2.tar.gz -C /usr/src
- [[email protected] ~]# tar zxf apr-util-1.5.4.tar.gz -C /usr/src
- # 以下开始安装 apache 所需依赖包
- [[email protected] ~]# cd /usr/src/apr-1.5.2/
- [[email protected] apr-1.5.2]# ./configure --prefix=/usr/local/apr && make && make install
- [[email protected] apr-1.5.2]# cd ../apr-util-1.5.4/
- [[email protected] apr-util-1.5.4]# ./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr && make && make install
- [[email protected] zlib-1.2.8]# cd ../zlib-1.2.8/
- [[email protected] zlib-1.2.8]# ./configure --prefix=/usr/local/zlib && make && make install
- [[email protected] pcre-8.39]# cd ../pcre-8.39/
- [[email protected] pcre-8.39]# ./configure --prefix=/usr/local/pcre && make && make install
- [[email protected] pcre-8.39]# cd ../openssl-1.0.1u/
- [[email protected] openssl-1.0.1u]# ./config -fPIC --prefix=/usr/local/openssl enable-shared && make && make install
- # 依赖安装完成后, 开始安装 http 服务
- [[email protected] openssl-1.0.1u]# cd ../httpd-2.4.23/
- [[email protected] httpd-2.4.23]# ./configure --prefix=/usr/local/http-2.4.23 --enable-so --enable-CGI --enable-cgid --enable-ssl --with-ssl=/usr/local/openssl --enable-rewrite --with-pcre=/usr/local/pcre --with-z=/usr/local/zlib --with-apr=/usr/local/apr --with-apr-util=/usr/local/apr-util -enable-modules=most --enable-mods-shared=most --enable-mpms-shared=all --with-mpm=event --enable-proxy --enable-proxy-fcgi --enable-expires --enable-deflate && make && make install
- [[email protected] httpd-2.4.23]# cd /usr/local/http-2.4.23/bin/
- [[email protected] bin]# ln -sf /usr/local/http-2.4.23/bin/*/usr/local/bin/ #将 apache 的命令做软链接
- [[email protected] bin]# apachectl start #启动 apache 服务, 会提示以下信息, 无所谓的.
- # 若想解决, 只需在 apache 的主配置文件中添加域名即可
- AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using fe80::c94:cd92:5c18:a1. Set the'ServerName' directive globally to suppress this message
关于安装 apache 服务时的配置项, 相关解释如下:
--enable-so: 打开 dos 支持, 可以在编译完成后添加额外功能
--enable-CGI: 开启 CGI 通用网管接口
--enable-cgid: 开启 cig 通用网管接口管理程序
--enable-ssl:http 加密传输协议, 支持 https 协议.
--enable-rewrite: 开启地址重写功能, 用来实现防盗链
--with - 服务名称 =/PATH 路径: 指定安装时依赖服务的路径
--enable-mods-shared=most: 在安装的过程中安装常用模块
--enable-mpms-shared=all: 安装 apache 的所有工作模式
--enable-proxy: 开启 http 代理功能
--enable-proxy-fcgi: 支持 fastcgi 快速通用网关接口的 fcgi 协议
--enable-expires: 支持缓存功能
--enable-deflate: 支持压缩功能
Apache 安装完毕!
二, Apache 的工作模式
Apache HTTP 服务器被设计为一个强大的, 灵活的能够在多种平台以及不同环境下工作的服
务器. 这种模块化的设计就叫做 "多进程处理模块"(MultiProcessing Module, MPM), 也叫做工作模式.
apache 服务的三种工作模式为:
prefork: 预派生子进程;
worker: 多进程 + 多线程;
event: 多进程 + 多线程 + epoll 处理模型;
1.prefork 工作模式
prefork 是一个非线程型的, 预派生的 MPM, 使用多个进程, 每个进程在某个确定的时间只单独处理一个连接, 效率高, 但内存使用比较大.
优点: 适合于没有线程安全库, 需要避免线程兼容性问题的系统. 它是要求将每个请求相互独立的情况下最好的 MPM, 这样若一个请求出现问题就不会影响到其他请求.
缺点: 一个进程相对占用更多的系统资源, 消耗更多的内存. 而且, 它并不擅长处理高并发请求, 在这种场景下, 它会将请求放进队列中, 一直等到有可用进程, 请求才会被处理.
2.Worker 工作模式
worker 使用了多进程和多线程的混合模式, worker 模式也同样会先预派生一些子进程, 然后每个子进程创建一些线程, 同时包括一个监听线程, 每个请求过来会被分配到一个线程来服务.
优点: 线程比起进程会更轻量, 因为线程是通过共享父进程的内存空间, 因此, 内存的占用会减少一些, 在高并发, 高流量的场景下会比 prefork 有更多可用的线程, 表现会更优秀一些;
缺点: 如果一个线程出现了问题也会导致同一进程下的线程出现问题, 如果是多个线程出现问题, 也只是影响 Apache 的一部分, 而不是全部. 由于用到多进程多线程, 需要考虑到线程的安全了, 在使用 keep-alive 长连接的时候, 某个线程会一直被占用, 即使中间没有请求, 需要等待到超时才会被释放 (该问题在 prefork 模式下也存在).
3.Event 工作模式
Apache 最新的工作模式, 它和 worker 模式很像
优点: 不同的是在于它解决了 keep-alive 长连接的时候占用线程资源被浪费的问题 (HTTP 的 Keepalive 方式能减少 TCP 连接数量和网络负载), 在 event 工作模式中, 会有一些专门的线程用来管理这些 keep-alive 类型的线程, 当有真实请求过来的时候, 将请求传递给服务器的线程, 执行完毕后, 又允许它释放. 这增强了在高并发场景下的请求处理.
三, 修改 Apache 工作模式
- [[email protected] bin]# /etc/init.d/httpd -M #查看 apache 加载的模块
- [[email protected] bin]# /etc/init.d/httpd -V #查看 apache 的工作模式
- ..............# 省略部分内容
- Server's Module Magic Number: 20120211:61
- Server loaded: APR 1.5.2, APR-UTIL 1.5.4
- Compiled using: APR 1.5.2, APR-UTIL 1.5.4
- Architecture: 64-bit
- Server MPM: event #这行便是它的工作模式
- threaded: yes (fixed thread count)
- forked: yes (variable process count)
- ..............# 省略部分内容
- [[email protected] bin]# cd /usr/local/http-2.4.23/conf/ #切换至指定目录
- [[email protected] conf]# VIM httpd.conf
- ..............# 省略部分内容
- Include conf/extra/httpd-mpm.conf #定位 httpd-mpm 到此, 去除开头的注释符号
- ..............# 省略部分内容
- LoadModule mpm_event_module modules/mod_mpm_event.so
- #LoadModule mpm_prefork_module modules/mod_mpm_prefork.so
- #LoadModule mpm_worker_module modules/mod_mpm_worker.so #定位 worker 至此行
- # 上面三行就是就是 apache 服务的三种工作模式, 需要那种工作模式, 只需要将原来的工作模式注释掉
- # 然后将所需要的工作模式那行去掉注释符号, 然后再启动服务即可 (注意是启动, 不是重启)
- ..............# 省略部分内容
- # 如, 我现在将其改为 worker 工作模式, 那么, 配置如下:
- Include conf/extra/httpd-mpm.conf #定位 httpd-mpm 到此, 去除开头的注释符号
- ..............# 省略部分内容
- #LoadModule mpm_event_module modules/mod_mpm_event.so
- #LoadModule mpm_prefork_module modules/mod_mpm_prefork.so
- LoadModule mpm_worker_module modules/mod_mpm_worker.so
- [[email protected] conf]# /etc/init.d/httpd restart #重启时, 可能会提示以下信息, 是因为域名的原因, 不碍事
- AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using fe80::c94:cd92:5c18:a1. Set the'ServerName' directive globally to suppress this message
- # 若想要解决那些提示信息, 可以打开 apache 的主配置文件进行更改:
- [[email protected] conf]# pwd #确定当前路径
- /usr/local/http-2.4.23/conf
- [[email protected] conf]# VIM httpd.conf #打开文件, 更改下面的那行, 其为本机 IP, 若有域名, 可以直接写域名
- ServerName 192.168.20.4 #去掉开头的注释符号
- [[email protected] conf]# /etc/init.d/httpd -V #再次查看 apache 的工作模式
- Server version: Apache/2.4.23 (Unix)
- Server built: Oct 10 2019 20:52:01
- Server's Module Magic Number: 20120211:61
- Server loaded: APR 1.5.2, APR-UTIL 1.5.4
- Compiled using: APR 1.5.2, APR-UTIL 1.5.4
- Architecture: 64-bit
- Server MPM: worker #可以发现更改生效了
- ..............# 省略部分内容
四, apache 工作模式的优化与修改
在上面改工作模式, 其实是调用了别的地方的配置文件, 其调用的配置文件就是 conf/extra/httpd-mpm.conf, 这也就是为什么在上面更改工作模式时, 需要先去掉 Include conf/extra/httpd-mpm.conf 这行的注释了, 就是为了调用这个配置文件.
- [[email protected] conf]# cat extra/httpd-mpm.conf | egrep -v '^#|^$' #查看其文件内容, 并且过滤掉注释及空行
- <IfModule !mpm_netware_module>
- PidFile "logs/httpd.pid"
- </IfModule>
- <IfModule mpm_prefork_module> <!-- 这就是 prefork 工作模式的参数 -->
- StartServers 5 <!--apache 启动时默认开启的子进程数 -->
- MinSpareServers 5 <!-- 最小的闲置子进程数 -->
- MaxSpareServers 10 <!-- 最大的闲置子进程数 -->
- MaxRequestWorkers 250
- <!--
- MaxRequestWorkers 最为重要, 它设置了允许同时的最大接入请求数量. 任何超过
- MaxRequestWorkers 限制的请求将进入等候队列, 在 apache2.3.1 版本
- MaxRequestWorkers 被称为 MaxClients, 现在仍支持此名字
- -->
- MaxConnectionsPerChild 0
- <!--
- MaxConnectionsPerChild 设置的是每个子进程可处理的请求数, 每个子进程在处理了
- "MaxConnectionsPerChild" 个请求后将自动销毁. 0 表示无限制, 即子进程永不销毁.
- 虽然缺省设为 0 可以使每个子进程处理更多的请求, 但如果设成非零值也有两点重要的好处:
- 1, 可防止意外的内存泄漏.
- 2, 在服务器负载下降的时侯会自动减少子进程数. 因此, 可根据服务器的负载来调整这个值.
- 在 Apache2.3.9 之前称之为 MaxRequestsPerChild.
- -->
- <!--prefork 控制进程在最初建立 "StartServers" 个子进程后, 为了满足 "MinSpareServers"
- 设置的需要创建一个进程, 等待一秒钟, 继续创建两个, 再等待一秒钟, 继续创建四个....
- 如此按照此等级增加创建的进程数, 最多达每秒钟 32 个, 直到满足 MinSpareServers 设置
- 的值为止. 这种模式 可以不必在请求到来时再产生新的进程, 从而减小了系统开销以增加性能.
- MaxSpareServers 设置了最大的空闲进程数, 如果空闲进程数大于这个 值, Apache 会自动
- kill 掉一些多余进程. 这个值不要设得过大, 但如果设的值比 MinSpareServers 小, Apache
- 会自动把其调整为 MinSpareServers+1. 如果站点负载较大,
- 可考虑同时加大 MinSpareServers 和 MaxSpareServers.-->
- </IfModule>
- <IfModule mpm_worker_module> <!-- 这是 worker 工作模式的参数 -->
- StartServers 3 <!--apache 启动时默认开始的子进程数 -->
- MinSpareThreads 75 <!-- 最小空闲数量的工作线程 -->
- MaxSpareThreads 250 <!-- 最大空闲数量的工作线程 -->
- ThreadsPerChild 25 <!-- 每个子进程产生的线程数量 -->
- MaxRequestWorkers 400 <!-- 与 prefork 模式相同 -->
- MaxConnectionsPerChild 0 <!-- 与 prefork 模式相同 -->
- </IfModule>
- <IfModule mpm_event_module>
- <!-- 这是 event 工作模式的参数, 每个配置项的含义与 worker 基本相似 -->
- StartServers 3
- MinSpareThreads 75
- MaxSpareThreads 250
- ThreadsPerChild 25
- MaxRequestWorkers 400
- MaxConnectionsPerChild 0
- </IfModule>
- <!-- 以下内容暂时不用看 -->
- <IfModule mpm_netware_module>
- ThreadStackSize 65536
- StartThreads 250
- MinSpareThreads 25
- MaxSpareThreads 250
- MaxThreads 1000
- MaxConnectionsPerChild 0
- </IfModule>
- <IfModule mpm_mpmt_os2_module>
- StartServers 2
- MinSpareThreads 5
- MaxSpareThreads 10
- MaxConnectionsPerChild 0
- </IfModule>
- <IfModule mpm_winnt_module>
- ThreadsPerChild 150
- MaxConnectionsPerChild 0
- </IfModule>
- <IfModule !mpm_netware_module>
- MaxMemFree 2048
- </IfModule>
- <IfModule mpm_netware_module>
- MaxMemFree 100
- </IfModule>
由于上述配置文件解释起来过于繁琐, 这里附加一张图, 可以参考此图来更改上述配置:
注: 各个配置项的值都是有默认的限制的, 若想改变其限制, 则需要在配置项的上一行增加 ServerLimit 配置项, 而且 ServerLimit 配置项也是有最大限制的, 若要修改各种值, 建议仔细阅读下面的内容, 再进行更改.
worker 由主控制进程生成 "StartServers" 个子进程, 每个子进程中包含固定的 ThreadsPerChild 线程数, 各个线程独立地处理请求. 同样, 为了不在请求到来时再生成线程, MinSpareThreads 和 MaxSpareThreads 设置了最少和最多的空闲线程数. 而 MaxRequestWorkers 设置了同时连入的 clients 最大总数. 如果现有子进程中的线程总数不能满足负载, 控制进程将派生新的子进程 MinSpareThreads 和 MaxSpareThreads 的最大缺省值分别是 75 和 250. 这两个参数对 Apache 的性能影响并不大, 可以按照实际情况相应调节 .
ThreadsPerChild 是 worker MPM 中与性能相关最密切的指令. ThreadsPerChild 的最大缺省值是 64, 如果负载较大, 64 也是不够的. 这时要显式使用 ThreadLimit 指令, 它的最大缺省值是 20000.
Worker 模式下所能同时处理的请求总数是由子进程总数乘以 ThreadsPerChild 值决定的, 应该大于等 MaxRequestWorkers. 如果负载很大, 现有的子进程数不能满足时, 控制进程会派生新的子进程. 默认最大的子进程总数是 16, 加大时 也需要显式声明 ServerLimit(系统配置的最大进程数量, 最大值是 20000). 需要注意的是, 如果显式声明了 ServerLimit, 那么它乘以 ThreadsPerChild 的值必须大于等于 MaxRequestWorkers, 而且 MaxRequestWorkers 必须是 ThreadsPerChild 的整数倍, 否则 Apache 将会自动调节到一个相应值.
五, 进程与线程的区别
线程是指进程内的一个执行单元, 也是进程内的可调度实体.
与进程的区别:
(1) 地址空间: 进程内的一个执行单元; 进程至少有一个线程; 它们共享进程的地址空间; 而进程有自己独立的地址空间;
(2) 资源拥有: 进程是资源分配和拥有的单位, 同一个进程内的线程共享进程的资源
(3) 线程是处理器调度的基本单位, 但进程不是.
(4) 二者均可并发执行.
进程和线程都是由操作系统所体会的程序运行的基本单元, 系统利用该基本单元实现系统对
应用的并发性.
进程和线程的区别在于:
简而言之, 一个程序至少有一个进程, 一个进程至少有一个线程.
线程的划分尺度小于进程, 使得多线程程序的并发性高.
另外, 进程在执行过程中拥有独立的内存单元, 而多个线程共享内存, 从而极大地提高了程序的运行效率.
来源: http://www.bubuko.com/infodetail-3342616.html