一.Apache的工作模式
- Apache 2.x 支持插入式并行处理模块,称为多路处理模块(MPM)
- 而在编译的时候只能选择一个MPM
- 分别由event MPM 、 prefork MPM 、worker MPM ,三个模块,不同的模块会影响到Apache的速度和可伸缩性
event模式
- 在event工作模式中,会有一些专门的线程用来管理这些keep-alive(超时就断开)类型的线程。当有真实的请求过来的时候,将请求传递给服务器的线程,执行完毕之后,有允许他释放。这样一个线程就能处理多个请求,实现了异步非阻塞。这增强了在高并发的场景下的请求处理
- event和worker都是多线程,不同的是event解决了keep-alive长连接的时候占用线程资源被浪费的问题
- event工作模式在遇到某些不兼容的模块时,会失效,将会回退到worker模式
- event工作模式需要Linux系统(Linux 2.6 +)对epoll的支持。才能启用。需要补充的是HTTPS的连接(SSL)
<IfModule mpm_event_module>
StartServers 3 //服务启动时初始的进程数,默认为3
MinSpareThreads 75 //最小的空闲子进程,默认75
MaxSpareThreads 250 //最大的空闲子进程数,默认250
ThreadsPerChild 25 //每个子进程产生的线程数量,默认25
MaxRequestWorkers 400 //限定同一时间内客户端最大接入的请求数量,默认是400
MaxConnectionsPerChild 0 //每个子进程在其生命周期内允许最大的请求数量
</IfModule>
// MaxConnectionsPerChild 的数值为0,表示子进程将永远不会结束,将将该值设置为非0值,可以防止运行PHP导致的内存泄露
prefork模式
- prefork模块实现了一个进程型的、预派生的web服务器,适合于没有线程安全库、需要避免线程兼容性问题的系统
- prefork模式在要求相互独立的情况下具有很好的特性,若一个请求出现问题不会影响到其他请求,而且具有很强的自我调节能力,只需要很少的配置指令进行调整就可以适合于企业应用的要求
- 最重要的是将MaxClients(创建多少个子进程用来处理请求)设置为一个足够大的数值以处理潜在的请求高峰,同时又不能太大,以避免所需内存超出物理内存的大小
- prefork模式使用多个子进程,每个子进程只有一个线程。每个进程在某个确定的时间只能维持一个连接。
- 大多数平台上,prefork模式比worker模式的效率更高,但是内存使用内存也要大得多
- prefrok的工作方式
- 一个单独的控制进程(父进程)负责产生子进程,子进程用于监听请求并作出应答,因此在内存中会一直存在一些备用的(spare)或是空闲的子进程用于响应新的请求,可加快速度
- 父进程通常以root的身份运行,以便绑定80端口,子进程通常以一个低特权的用户运行,可以通过配置项User和Group配置
- 运行子进程的用户必须要网站内容的读取权限,但是对其他资源必须拥有尽可能少的权限,以保证系统安全
- 编译安装时没有指定的工作模式,默认会使用prefork模式,可用httpd -l查看
//以手工编译安装apache
[root@www ~]# httpd -l
Compiled in modules:
core.c
mod_so.c
http_core.c
event.c
[root@www ~]#
- prefork参数
<IfModule mpm_prefork_module>
StartServers 5 //启动的时候创建的进程数量
MinSpareServers 5 //最少空闲进程数
MaxSpareServers 10 //最多空闲进程数
MaxRequestWorkers 250 //最多请求数量
MaxConnectionsPerChild 0 //每个子进程在其生命周期内允许最大的请求数量
</IfModule>
ServerLimit //最大进程数
MaxClients //最多创建多少个子进程用来处理请求
MaxRequestsPerChild //每个进程处理的最大请求数,如果达到请求数,进程即被销毁,如果设置为0,子进程永远不会结束
worker模式
- worker模式使web服务器支持回合混合的多线程多进程
- 由于使用线程来处理请求,所以可以处理海量请求,而系统资源的开销小于基于进程的MPM
- 但是worker也使用了多线程,而每个进程又有多个线程,以获得基于进程的MPM的稳定性
- worker模块的每个进程能够拥有的线程数量是固定的,服务器会根据负载情况增加或减少进程数量
- 一个单独的控制进程(父进程)负责子进程的建立,而每个子进程能够建立一定的数量的服务线程和一个监听线程,监听线程监听接入请求并将其传递给服务线程处理和应答
- 启用woker模式,需要重新安装Apache,指定MPM为worker,否则默认是prefork
./configure \
--prefix=/usr/local/httpd \
--enable-so \
--enable-rewrite \
--enable-expires \
--enable-defalte \
--enable-cgi \
--enable-charset-lite \
--with-mpm=worker
- worker参数
vim /usr/local/httpd/conf/extra/httpd-mpm.conf
<IfModule mpm_worker_module>
StartServers 3
MinSpareThreads 75
MaxSpareThreads 250
ThreadsPerChild 25 //每个子进程建立的常驻执行线程数,默认数25
MaxRequestWorkers 400
MaxConnectionsPerChild 0
</IfModule>
//ServerLimit 最大进程数,默认16
//ThreadLimit 每个子进程的最大线程数,默认64
//MaxClients 同时接入最大的请求数量
二.Apache的目录属性优化
- 给指定的文件配置对应的访问是Apache中的基础应用
- 在Apache的配置文件中,给指定目录设置基本的访问权限,主要是靠Allow、Deny、Order这三个指令实现
- 目录权限设置使用<Directory "目录路径"></Directory>这对语句为主目录或虚拟目录设置权限,它们是一对容器语句,必须成对出现,它们之间封装的是具体的设置目录权限语句,这些语句仅对被设置目录及其子目录起作用
- 目录属性参数表
参数 | 作用 |
Options | 设置特定目录使用哪些特性 |
AllowOverride | 允许存在于.htaccess文件中的指令类型 |
Order | 控制访问时Allow和Deny两个访问规则哪个优先 |
Allow | 允许访问的主机列表 |
Deny | 拒绝访问的主机列表 |
- Options选线参数表
参数 | 作用 |
Indexes | 当用户访问该目录时,但是没有指定访问哪个文件,而且目录下不存在默认网页时,返回目录中的文件和子目录列表 |
MultiViews | 内容协商的多重视图。当访问目录中不存在的对象时,apache会查找 .* 相关内容,不会返回错误 |
ExecCGI | 允许在该目录下执行CGI脚本 |
FollowSymLinks | 在该目录下允许文件系统使用符号连接 |
IncludesNoExec | 允许服务器端包含功能,但是禁止执行CGI脚本 |
Includes | 允许服务器端包含功能 |
All | 包含除了MultiViews之外所有的特性,但是如果没有Options语句,默认为All |
vim /usr/local/httpd/conf/httpd.conf
<Directory "/usr/local/httpd/htdocs">
#
# Possible values for the Options directive are "None", "All",
# or any combination of:
# Indexes Includes FollowSymLinks SymLinksifOwnerMatch ExecCGI MultiViews
#
# Note that "MultiViews" must be named *explicitly* --- "Options All"
# doesn't give it to you.
#
# The Options directive is both complicated and important. Please see
# http://httpd.apache.org/docs/2.4/mod/core.html#options
# for more information.
#
Options Indexes FollowSymLinks
#
# AllowOverride controls what directives may be placed in .htaccess files.
# It can be "All", "None", or any combination of the keywords:
# AllowOverride FileInfo AuthConfig Limit
#
AllowOverride None //当AllowOverride 被设置为None时,不搜索该目录下的.htaccess文件,能减少服务器开销
// .htaccess文件是一个针对目录的属性文件,而现在我们设置的是整个站点的属性
#
# Controls who can get stuff from this server.
#
Require all granted
</Directory>
- 目录属性测试
vim /usr/local/httpd/conf/httpd.conf
<IfModule dir_module>
DirectoryIndex index.html
</IfModule>
修改站点的后缀名
[root@www htdocs]# ls
1.jpg error.png index.html
[root@www htdocs]# mv index.html index.txt
[root@www htdocs]# ls
1.jpg error.png index.txt
[root@www htdocs]# cp /etc/passwd ./
[root@www htdocs]# ls
1.jpg error.png index.txt passwd
- 限制权限
[root@www htdocs]# vim /usr/local/httpd/conf/httpd.conf
Options None
[root@www htdocs]# service httpd stop
[root@www htdocs]# service httpd start
[root@www htdocs]# mv index.html index.txt
[root@www htdocs]# ls
1.jpg error.png index.txt passwd
[root@www htdocs]#
- 目录优化的建议
- Options应该设置为None,应防止目录上的内容泄露
- AllowOverride应该设置为None,禁止使用 .htaccess文件