apeche有work ,prefork,event三种mpm模型
prefork:这是默认使用模型 ,使用一个进程处理一个请求, 这个MPM具有很强的自我调节能力,只需要很少的配置指令调整。它是要求将每个请求相互独立的情况下最好的MPM,这样若一个请求出现问题就不会影响到其他请求。最重要的是将MaxClients设置为一个足够大的数值以处理潜在的请求高峰,同时又不能太大,以致需要使用的内存超出物理内存的大小。
<IfModule prefork.c> 如果prefork.c模块存在,则定义在标签内的参数有效
StartServers 8 服务开启默认启动的工作进程数,不包含主进程
MinSpareServers 5 最少空闲进程数;
MaxSpareServers 20 最大空闲进程数;
ServerLimit 256 最大活动进程数;
MaxClients 256 并发请求的最大数,一条进程最多处理多少个请求
MaxRequestsPerChild 4000 每个子进程在生命周期内所能服务的最多请求个数
work: 此多路处理模块(MPM)使网络服务器支持混合的多线程多进程。由于使用线程来处理请求,所以可以处理海量请求,而系统资源的开销小于基于进程的MPM。但是,它也使用了多进程,每个进程又有多个线程,以获得基于进程的MPM的稳定性。 控制这个MPM的最重要指令是,控制每个子进程允许建立的线程数的ThreadsPerChild指令,和控制允许建立的总线程数的MaxClients指令。
Event MPM:以上两种稳定的MPM方式在非常繁忙的服务器应用下都有些不足。尽管HTTP的Keepalive方式能减少TCP连接数量和网络负载,但是 Keepalive需要和服务进程或者线程绑定,这就导致一个繁忙的服务器会耗光所有的线程。 Event MPM是解决这个问题的一种新模型,它把服务进程从连接中分离出来。在服务器处理速度很快,同时具有非常高的点击率时,可用的线程数量就是关键的资源限 制,此时Event MPM方式是最有效的。一个以Worker MPM方式工作的繁忙服务器能够承受每秒好几万次的访问量(例如在大型新闻服务站点的高峰时),而Event MPM可以用来处理更高负载。值得注意的是,Event MPM不能在安全HTTP(HTTPS)访问下工作。
对于Event 模式,apache给出了以下警告:
This MPM is experimental, so it may or may not work as expected .
这种MPM目前处于试验状态,他可能不能按照预期的那样工作。
模式的互换
将当前prefork模式改变为work模式
mv httpd httpd.prefork
mv httpd.worl httpd
prefork和worker模式的比较
prefork模式使用多个子进程,每个子进程只有一个线程。每个进程在某个确定的时间只能维持一个连接。在大多数平台上,Prefork MPM在效率上要比Worker MPM要高,但是内存使用大得多。prefork的无线程设计在某些情况下将比worker更有优势:它可以使用那些没有处理好线程安全的第三方模块,并且对于那些线程调试困难的平台而言,它也更容易调试一些。
worker模式使用多个子进程,每个子进程有多个线程。每个线程在某个确定的时间只能维持一个连接。通常来说,在一个高流量的HTTP服务器上,Worker MPM是个比较好的选择,因为Worker MPM的内存使用比Prefork MPM要低得多。但worker MPM也由不完善的地方,如果一个线程崩溃,整个进程就会连同其所有线程一起"死掉".由于线程共享内存空间,所以一个程序在运行时必须被系统识别为"每个线程都是安全的"。
总的来说,prefork方式速度要稍高于worker,然而它需要的cpu和memory资源也稍多于woker。
httpd主配置文件在 /etc/httpd/httpd.conf 几乎所有关于apache的配置都在这个文件中。基于二进制包安装配置文件在/etc/httpd/conf/httpd.conf
ServerRoot "/usr/local/apache" 设置软件所在的位置
PidFile "/var/run/httpd.pid" 设置pid文件所在位置
Listen 80 设置监听的端口
LoadModule alias_module modules/mod_alias.so
#LoadModule rewrite_module modules/mod_rewrite.so
这种都是加载apache的对应模块
User daemon 设置运行httpd程序的用户
Group daemon
ServerTokens OS 这是给客户端显示web程序的一些信息,相关参数还有好几个,参考apache官方文档
KeepAlive Off 是否设置持久连接
MaxKeepAliveRequests 100 持久连接最大请求个数,0为无限制
KeepAliveTimeout 15 Number of seconds to wait for the next request from the same client on the same connection. 等待下一个相同客户端对于相同资源的连接的等待时间。
ServerAdmin you@example.com 设置管理员邮箱
ServerName www.example.com:80 设置主机名
<IfModule prefork.c>
StartServers 8
MinSpareServers 5
MaxSpareServers 20
ServerLimit 256
MaxClients 256
MaxRequestsPerChild 4000
</IfModule>
Include conf.d/*.conf 使这个文件夹下面的配置文件生效
DocumentRoot "/var/www/html " 设置文件根目录
<Directory "/var/www/html">
Option { Indexes Includes FollowSymLinks SymLinksifOwnerMatch ExecCGI MultiViews} 选项具体查看官网说明
AllowOverride {None FileInfo AuthConfig Limit}
Allow from all /*允许所有人可以访问*/
</Directory >
<IfModule mod_userdir.c>
<Directory /home/*/public_html>
# AllowOverride FileInfo AuthConfig Limit
# Options MultiViews Indexes SymLinksIfOwnerMatch IncludesNoExec
# <Limit GET POST OPTIONS> 允许使用GET POST 方法
# Order allow,deny
# Allow from all
# </Limit>
# <LimitExcept GET POST OPTIONS> 除了GET POST 其他都拒绝
# Order deny,allow
# Deny from all
# </LimitExcept>
#</Directory>
AccessFileName .htaccess 访问的用户文件
<Files ~ "^\.ht">
Order allow,deny
Deny from all
Satisfy All
</Files>
CustomLog logs/access_log combined设置访问日志和格式
ErrorLog logs/error_log 设置错误日志
设置用户密码访问
受限创建用户密码 htpasswd -c dbmpasswd mary创建一个用户名为marry的用户并保存在dbmpasswd这个文件中
AuthType Basic
AuthName "Please input your pass"
AuthBasicprovider file
AuthUserfile "/etc/httpd/passwd/password"
AuthGroupfile "/etc/httpd/passwd/group"
Require valid-user
这是一个允许passwd文件所有用户能访问的设置
Require user tony 只允许tony访问
在group中写入mygroup:tony
require group mygroup 允许mygroup中成员进行访问
接下来介绍下httpd虚拟主机配置
要实现虚拟主机必须先取消中心主机注释主配置文件中DocumentRoot
虚拟主机可以用一台服务器服务于多个站点
apache支持基于ip 域名和端口的虚拟主机
基于ip的虚拟主机:
ip1:80
ip2:80
编辑/etc/httpd/conf.d/virtual.conf
<VirtualHost 192.168.1.180:80>
ServerName www.node2.test.com
DocumentRoot "/web/htdoc1"
</VirtualHost>
<VirtualHost 192.168.1.181:80>
ServerName www2.node2.test.com
DocumentRoot "/web/htdoc2"
</VirtualHost>
这是基于192.168.1.180和192.168.1.181两个ip做的虚拟主机
要访问前需给网卡加入别名
ifconfig eth0:0 192.168.1.180/24
ifconfig eth0:1 192.168.1.181/24
这样就可以通过访问地址来访问相应位置的文件了
基于端口来访问
<VirtualHost 192.168.1.180:80>
ServerName www.node2.test.com
DocumentRoot "/web/htdoc1"
</VirtualHost>
<VirtualHost 192.168.1.180:8080>
ServerName www.node2.test.com
DocumentRoot "/web/htdoc3"
</VirtualHost>
基于域名的虚拟主机访问
NameVirtualHost 192.168.1.122:80
<VirtualHost 192.168.1.122:80>
ServerName www.node2.test.com
DocumentRoot "/web/htdoc1"
</VirtualHost>
<VirtualHost 192.168.1.122:80>
ServerName www.a.test.com
DocumentRoot "/web/htdoc3"
</VirtualHost>
同时要使用dns指定域名和ip的绑定 192.168.1.122 www.node2.test.com www2.node2.test.com
当然其中也可以加入主配置文件中的各种参数和配置。