apache基本部署
工作模式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