工作模式1、Prefork MPM
Prefork MPM实现了一个非线程的、预派生的web服务器。它在Apache启动之初,就先预派生一些子进程,然后等待连接;可以减少频繁创建和销毁进程的开销,每个子进程只有一个线程,在一个时间点内,只能处理一个请求。这是一个成熟稳定,可以兼容新老模块,也不需要担心线程安全问题,但是一个进程相对占用资源,消耗大量内存,不擅长处理高并发的场景。(如图-1)
2、Worker MPM
和prefork模式相比,worker使用了多进程和多线程的混合模式,worker模式也同样会先预派生一些子进程,然后每个子进程创建一些线程,同时包括一个监听线程,每个请求过来会被分配到一个线程来服务。线程比起进程会更轻量,因为线程是通过共享父进程的内存空间,因此,内存的占用会减少一些,在高并发的场景下会比prefork有更多可用的线程,表现会更优秀一些;另外,如果一个线程出现了问题也会导致同一进程下的线程出现问题,如果是多个线程出现问题,也只是影响Apache的一部分,而不是全部。由于用到多进程多线程,需要考虑到线程的安全了,在使用keep-alive长连接的时候,某个线程会一直被占用,即使中间没有请求,需要等待到超时才会被释放(该问题在prefork模式下也存在)。(如图-2)
3、Event MPM
这是Apache的工作模式,它和worker模式很像,不同的是在于它解决了keep-alive长连接的时候占用线程资源被浪费的问题,在event工作模式中,会有一些专门的线程用来管理这些keep-alive类型的线程,当有真实请求过来的时候,将请求传递给服务器的线程,执行完毕后,又允许它释放。这增强了在高并发场景下的请求处理。
查看apache工作模式:
# httpd -V
切换工作模式:
???rpm安装的apache
???????#vim ?/etc/sysconfig/httpd
???????#vim /etc/httpd/conf.modules.d/00-mpm.conf
????????修改不同的加载模块
????????
???编译安装的apache
????????./configure ??--prefix="" ?????
???????????编译安装需要指定
???????????在configure配置编译参数的时候,可以使用 --with-mpm=prefork|worker|
??????????event 来指定编译为那一种MPM,当然也可以用编译为三种都支持:--enable-
??????????mpms-shared=all,这样在编译的时候会在modules目录下自动编译出三个
??????????MPM文件的so,然后通过修改httpd.conf配置文件更改MPM
?????注意:切换非进程模式需要关闭PHP
???
?????初始化进程数
?????最大空闲进程数
?????最小空闲进程数
?????最高并发
?????每个进程可以接受的连接的次数
?????
?????初始化进程数
?????最大空闲进程数
?????最小空闲进程数
?????每个进程内的线程数 ?????
?????最高并发
?????每个进程可以接受的连接的次数
进程模式
线程模式
event模式:
???以上两种稳定的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目前处于试验状态,他可能不能按照预期的那样工作。
rpm安装方式默认3种模式都支持
进程模式:
???<IfModule prefork.c>
???StartServers ??????????8 ??????
???MinSpareServers ???5
???MaxSpareServers ??20 ??
???ServerLimit ?????256 ???进程上限
???MaxClients ??????256 ???最大并发
???MaxRequestsPerChild ?4000
???</IfModule>
线程模式: ???
???<IfModule worker.c>
???StartServers ???????????4
???MaxClients ?????????????300
???MinSpareThreads ????25
???MaxSpareThreads ???75
???ThreadsPerChild ??????25
???MaxRequestsPerChild ?0
???</IfModule>
event模式:
<IfModule mpm_event_module>
???StartServers ?????????????????3
???ServerLimit 16
???MinSpareThreads ?????????75
???MaxSpareThreads ????????250
???ThreadsPerChild ???????????25
???MaxRequestWorkers ?????400 ????//同MaxClients
???MaxConnectionsPerChild ??1000
</IfModule>
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
timeout 15
--------------------
keepalive ?长连接(保持连接,持久连接)
开启keepalive:
???KeepAlive On ???????????//on是开启,Off是关闭
eepAliveTimeout 15 ???//两次get文件之间的时间间隔
???MaxKeepAliveRequests 100 ???//每次长连接能接受的请求最大次数
开启进程
client---server
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
keepalive ?apache配置文件内的一个选项
keepalive ?tcp/ip也有keepalive
keepalived 高可用方案
访问控制
准备测试目录:
#mkdir /var/www/html/site1
#echo site1 > /var/www/html/site1/index.html
#cat /var/www/html/site1/index.php
???<?php
???phpinfo();
????>
???
访问控制测试:
允许所有主机访问:
<Directory "/var/www/html/site1">
????AllowOverride None
????Require all granted ?????//wing测试这是默认值,不写也可
</Directory>
AllowOverride All ??????????允许子目中的 .htaccess 中的设置覆盖当前设置
AllowOverride None ??????不允许子目中的 .htaccess 中的设置覆盖当前设置
只允许一部分客户端访问:
<Directory "/var/www/html/site1">
???AllowOverride None
???Require ip 192.168.245.3 ???//可以写网段
???Require ip 127.0.0.1
</Directory>
只拒绝一部分客户端访问:
<Directory "/var/www/html/site1">
???AllowOverride None
???<RequireAll>
???????Require not ip 127.0.0.1 192.168.245.3
???????Require all granted
???</RequireAll>
</Directory>
拒绝所有客户端访问:
<Directory "/var/www/html/site1">
???AllowOverride None
???<RequireAll>
???????Require all denied
???</RequireAll>
</Directory>
wing测试apache 2.2写法依然生效:
???<Directory "/var/www/html/site1">
???????AllowOverride None
???????Order allow,deny
???????Deny from all
???</Directory>
???<Directory "/var/www/html/site1">
???????AllowOverride None
???????Order deny,allow ??//allow和deny谁写后面先看谁,跟下面deny和allow的顺序无关
???????Deny from all
???????Allow from 192.168.245.3
???</Directory>
单独控制某些页面文件是否可被某些客户端访问:
<Directory "/var/www/html/site1">
???AllowOverride None
???Require all granted
???<Files ~ "\.php$" >
???????Order allow,deny
???????Deny from all
???</Files>
</Directory>
~ 表示匹配
\.php$ ?????.php
???\ 转义字符
???$ 表示以前置字符结尾 ???
???
基于用户的访问控制:访问时需要用户名和密码
1. 创建密码文件(添加第一个账户)
# htpasswd -cm /etc/httpd/conf/httppasswd user1
-c ?创建密码文件
-m MD5方式加密
添加多个其他账户:
# htpasswd -m /etc/httpd/conf/httppasswd user2
2. 配置支持认证
修改主配置文件:
???<Directory "/var/www/html/site1">
???????AllowOverride All
???????Require all granted
???</Directory>
3.创建.htaccess文件:
???# vim /var/www/html/site1/.htaccess
???AuthName "hello kity"
???AuthType Basic
???AuthUserFile ?"/etc/httpd/conf/httppasswd"
???Require ?valid-user
apache基本部署
原文地址:https://www.cnblogs.com/chunjianghuayueye369/p/9591396.html