Linux--Apache的安装及工作模式

博文概要:
1.安装apache服务及新版本的功能介绍。
2.Apache的优化配置。
3.Apache的工作模式。
4.进程与线程的区别。

一、常见的web服务器:Apache、Nginx、Tomcat

Apache服务器:apache软件基金会下开源的子项目,用于搭建web服务器,自身支持模块比较多,处理静态页面强,配置比较简单,自身不支持动态页面的处理。
区别:
	Apache:支持模块比较多、采用servlet处理模型,同步阻塞模型,工作模式多变,处于高并发的场景处理速度会比较慢,运行稳定。
	Nginx:轻量级web服务器,自身支持模块少,需要借助第三方模块支持(Nginx官方就可以下载),采用epo11处理模型,异步非阻塞型,适合高并发场景,配置简单。
	Tomcat:Apache软件基金会下开源的子项目, 也称为容器,主要处理java语言编写的页面,也可以处理html页面,并发连接小。

二、Apache2.4.23版本:

新增模块:
	Mod_proxy_fcgi(可提供fcgi代理)
	Mod_ratelimit(限制用户带宽)
	Mod_request(请求模块,对请求做过滤)
	Mod_remoteip(匹配客户端的IP地址)
	对于基于IP的访问控制做了修改,不再支持allow,deny,order机制,而是统一使用require 进行。

新增以下几条新特性:
	1、MPM 支持在运行时装载;不过要开启这种特性,在编译安装要启用这三种功能; --enable-mpms-shared=all  --with-mpm=event
	2、支持 event 
	3、支持异步读写 
	4、在每个模块及每个目录上指定日志级别 
	5、增强版的表达式分析器 
	6、每请求配置:, 
	7、毫秒级别的 keepalive timeout 
	8、基于 FQDN 的虚拟主机不再需要 NameVirtualHost 指令 
	9、支持使用自定义变量

三、部署apache服务:
一台Linux,CentOS Linux 7.*版本。
下载安装包及依赖包。

[root@localhost ~]# rz  #上传下载好的安装包及依赖包。

[root@localhost ~]# ls
anaconda-ks.cfg        initial-setup-ks.cfg   公共  文档
apr-1.5.2.tar.gz       openssl-1.0.1u.tar.gz  模板  下载
apr-util-1.5.4.tar.gz  pcre-8.39.tar.gz       视频  音乐
httpd-2.4.23.tar.gz    zlib-1.2.8.tar.gz      图片  桌面
[root@localhost ~]# tar zxf openssl-1.0.1u.tar.gz -C /usr/src
[root@localhost ~]# tar zxf pcre-8.39.tar.gz -C /usr/src
[root@localhost ~]# tar zxf zlib-1.2.8.tar.gz -C /usr/src
[root@localhost ~]# tar zxf httpd-2.4.23.tar.gz -C /usr/src
[root@localhost ~]# tar zxf apr-1.5.2.tar.gz -C /usr/src
[root@localhost ~]# tar zxf apr-util-1.5.4.tar.gz -C /usr/src
		#解压apache的依赖包及安装包(tar包)

[root@localhost ~]# cd /usr/src/openssl-1.0.1u/
[root@localhost openssl-1.0.1u]# ./config -fPIC --prefix=/usr/local/openssl enable-shared && make && make install
[root@localhost openssl-1.0.1u]# cd ../pcre-8.39/
[root@localhost pcre-8.39]# ./configure --prefix=/usr/local/pcre && make && make install
[root@localhost pcre-8.39]# cd ../zlib-1.2.8/
[root@localhost zlib-1.2.8]# ./configure --prefix=/usr/local/zlib && make && make install
[root@localhost zlib-1.2.8]# cd ../apr-1.5.2/
[root@localhost apr-1.5.2]# ./configure --prefix=/usr/local/apr && make && make install
[root@localhost apr-1.5.2]# cd ../apr-util-1.5.4/
[root@localhost apr-util-1.5.4]# ./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr && make && make install
		#解决安装httpd的依赖环境。
		
[root@localhost apr-util-1.5.4]# cd ../httpd-2.4.23/
[root@localhost 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
		#编译安装httpd。
		
[root@localhost httpd-2.4.23]# cd /usr/local/http-2.4.23/bin/
[root@localhost bin]# ls
ab         checkgid   envvars-std   htdbm     httpd       rotatelogs
apachectl  dbmmanage  fcgistarter   htdigest  httxt2dbm
apxs       envvars    htcacheclean  htpasswd  logresolve
[root@localhost bin]# ln -s /usr/local/http-2.4.23/bin/* /usr/local/bin/
		#将apache的启动执行文件做软链接。
		
[root@localhost bin]# apachectl start 
		#启动apache,启动的时候会出现一些提示信息,不影响启动。
AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using localhost.localdomain. Set the 'ServerName' directive globally to suppress this message
		#解决此问题,只需要再apache主配置文件里添加域名即可解决。配置文件里:ServerName 添加域名就可以了

接下来apache就能正常访问了。

[root@localhost bin]# curl 192.168.2.20
<html><body><h1>It works!</h1></body></html>
[root@localhost bin]# netstat -anpt | grep 80
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN     112414/httpd       #查看端口是否启动。   

安装apache时一些参数解释:

--enable-so:支持动态共享模块(即打开 DSO 支持)
--enable-rewrite:支持 url 重写
--enable-ssl:支持 ssl
--with-ssl=/usr/local/openssl:指定 ssl 安装位置
--enable-cgi:启用 cgi(通用网关接口)
--enable-cgid:MPM 使用的是 event 或 worker 要启用 cgid(通用网管接口管理程序)
--enable-modules=most:明确指明要静态编译到 httpd 二进制文件的模块,<MODULE-LIST>为空格分隔的模块名列表、all 或者 most,all 表示包含所有模块,most 表示包含大部分常用模 块
--enable-mods-shared=most:明确指明要以 DSO 方式编译的模块,<MODULE-LIST>为空格分隔的模块名列表、all 或者 most,all 表示包含所有模 块,most 表示包含大部分模块
--enable-mpms-shared=all:启用 MPM 所有支持的模式,这样 event、worker、prefork 就会以模块化的方式安装,要用哪个就在 httpd.conf 里配置就好了。
--with-mpm=event:指定启用的 mpm 模式,默认使用 enevt 模式,在 apache 的早期版本 2.0默认 prefork,2.2 版本是 worker,2.4 版本是 event.
--with-pcre=/usr/local/pcre:支持 pcre
--with-z=/usr/local/zlib:使用 zlib 压缩库
--with-apr=/usr/local/apr:指定 apr 的安装路径
--with-apr-util=/usr/local/apr-util:指定 apr-util 的安装路径
--enable-expires:激活或通过配置文件控制 HTTP 的“Expires:”和“Cache-Control:”头内容,即对网站图片、js、css 等内容,提供客户端浏览器缓存的设置。这个是 apache 调优的一个重要选项之一。
--enable-deflate:提供对内容的压缩传输编码支持,支持压缩功能。在生产环境中,这是 apache 调优的一个重要选项之一。	

四、Apache服务的三种工作模式详解。

Prefork模式(非线程型的,预派生子进程)
Worker模式(多线程多进程)
Event模式(多进程多线程加epoll处理模型)

Prefork模式:
当 Apache 服务器启动后,mpm_prefork 模块会预先创建多个子进程(默认为 5 个),每个子进程只有一个线程,当接收到客户端的请求后,mpm_prefork 模块再将请求转交给子进程处理,并且每个子进程同时只能用于处理单个请求。
如果当前的请求数将超过预先创建的子进程数时,mpm_prefork模块就会创建新的子进程来处理额外的请求。
Apache 总是试图保持一些备用的或者是空闲的子进程用于迎接即将到来的请求。这样客户端的请求就不需要在接收后等候子进程的产生。

优缺点:

·优点:它的每个子进程都会独立处理对应的单个请求,这样,如果其中一个请求出现问题就不会影响到其他请求。Prefork 在效率上要比 Worker 要高。
·缺点:因为每个请求对应一个子进程,因此其占用的系统资源相对其他两种模式而言较多,内存使用大得多不擅长处理高并发的场景。

Worker模式:
worker 使用了多进程和多线程的混合模式,worker 模式也同样会先预派生一些子进程,然后每个子进程创建一些线程,同时包括一个监听线程,每个请求过来会被分配到一个线程来服务。

优缺点:

·优点:线程比起进程会更轻量,因为线程是通过共享父进程的内存空间,因此,内存的占用会减少一些,在高并发的场景下会比 prefork 有更多可用的线程,表现会更优秀一些;另外,如果一个线程出现了问题也会导致同一进程下的线程出现问题,如果是多个线程出现问题,也只是影响 Apache 的一部分,而不是全部。
·缺点:由于用到多进程多线程,需要考虑到线程的安全了,在使用 keep-alive 长连接的时候,某个线程会一直被占用,即使中间没有请求,需要等待到超时才会被释放(该问题在 prefork 模式下也存在)。

Event模式:
这是 Apache 最新的工作模式,是 worker 模式的变种,它把服务进程从连接中分离出来,一worker 模式不同的是在于它解决了 keep-alive 长连接的时候占用线程资源被浪费的问题,在event 工作模式中,会有一些专门的线程用来管理这些 keep-alive 类型的线程,当有真实请求过来的时候,将请求传递给服务器的线程,执行完毕后,又允许它释放。

优缺点:

·优点:增强了在高并发场景下的请求处理。
·缺点:event 模式不能很好的支持 https 的访问(HTTP 认证相关的问题)。

五、刚刚上面提到了线程跟进程。下面来解释一下线程和进程的区别。

线程是指进程内的一个执行单元,也是进程内的可调度实体。

线程与进程的区别:

(1)地址空间:进程内的一个执行单元;进程至少有一个线程;它们共享进程的地址空间;而进程有自己独立的地址空间。
(2)资源拥有:进程是资源分配和拥有的单位,同一个进程内的线程共享进程的资源。
(3)线程是处理器调度的基本单位,但进程不是。
(4)二者均可并发执行。

进程和线程都是由操作系统所体会的程序运行的基本单元,系统利用该基本单元实现系统对应用的并发性。
简而言之,一个程序至少有一个进程,一个进程至少有一个线程。
线程的划分尺度小于进程,使得多线程程序的并发性高。
另外,进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率。

六、修改apache的工作模式:

[root@localhost ~]# apachectl -M
core_module (static)
so_module (static)
http_module (static)
authn_file_module (shared)
authn_core_module (shared)
authz_host_module (shared)
...
	#查看apache所加载的模块(apachectl -M或httpd -M)
[root@localhost ~]# apachectl -V
...
Architecture:   64-bit
Server MPM:     event  #这里便是apache的当前工作模式
threaded:     yes (fixed thread count)
forked:     yes (variable process count)
...
	#查看apache当前的工作模式(httpd -V或apachectl -V)
[root@localhost ~]# cd /usr/local/http-2.4.23/conf/
[root@localhost conf]# vim httpd.conf 
	#apache的主配置文件/usr/local/http-2.4.23/conf/httpd.conf
...
Include conf/extra/httpd-mpm.conf
...			#查询httpd-mpm.conf,去掉开头注释。
#LoadModule mpm_event_module modules/mod_mpm_event.so
LoadModule mpm_prefork_module modules/mod_mpm_prefork.so
		#我这里默认开启了Event模式,所以将Event模块加注释,然后将Prefork模式去掉。
#LoadModule mpm_worker_module modules/mod_mpm_worker.so

在这里插入图片描述
这就是apache的三种工作模式,若想开启哪个模式,去掉注释即可。但是相应的,需要将原来的工作模式注释掉。

修改完成后,直接保存退出,重启服务即可。
[root@localhost conf]# apachectl restart
		#重启apache服务。
[root@localhost conf]# apachectl -V
		#查看当前工作模式。
...
Architecture:   64-bit
Server MPM:     prefork
threaded:     no
forked:     yes (variable process count)
...
		#这样就修改了apache的工作模式了。

修改apache的工作模式,要根据公司的需求适合哪种工作模式来进行修改。

七、Apache的优化配置。
上面修改工作模式,其实是httpd-mpm.conf定义apache每个工作模式的配置文件。
其中httpd-mpm.conf文件中也可以进行优化(启动进程数、空闲进程)
接下来解释优化apache服务的参数:

[root@localhost conf]# cat extra/httpd-mpm.conf 
...
# prefork MPM
...
<IfModule mpm_prefork_module>
StartServers             5	#启动的子进程数,当小于空闲子进程时,第一秒启动1个子进程,以二的次方启动子进程。1+2+4+8....
MinSpareServers          5	#最小空闲子进程。
MaxSpareServers         10	#最大空闲子进程,当小于空闲子进程时值为空闲子进程的个数+1,例如:最小5,最大3,最终结果5+1=6
MaxRequestWorkers      250	#所有子进程能够承载并发量,通过是物理内存的一半,4G内存,4096/2。默认最大为256,如果设置成大于256需要使用ServerLimit进行声明,ServerLimit最大为20万。
MaxConnectionsPerChild   0	#每个子进程处理完数据后进程永不销毁,1代表每个子进程处理一个连接后子进程进行销毁。
</IfModule>
...
# worker MPM
...
<IfModule mpm_worker_module>
StartServers             3	#启动的子进程数,启动和prefork相同,第一秒启动1个子进程,以二的次方启动子进程,1+2+4+8.....默认最大可以启动16个子进程,如果超过这个值需要使用ServerLimit进行声明,ServerLimit最大为2万。
MinSpareThreads         75	#最小空闲线程。
MaxSpareThreads        250 	#最大空闲线程。
ThreadsPerChild         25	#每个子进程数可生成的线程数量,默认最大64,如果大于64需要使用ThreadLimit声明,ThreadLimit的最大值为2万
MaxRequestWorkers      400	#所有线程能够承载并发量。
MaxConnectionsPerChild   0	#和prefork
</IfModule>
...
# event MPM
...
<IfModule mpm_event_module>
StartServers             3	#
MinSpareThreads         75
MaxSpareThreads        250
ThreadsPerChild         25
MaxRequestWorkers      400
MaxConnectionsPerChild   0
</IfModule>

上述解释,要根据现实工作环境,来进行优化。


  1. ——————本文结束————感谢阅读——————1 ↩︎

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

十一ღ.

你的鼓励就是我最大的动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值