Linux系统架构-----Apache的工作模式与目录属性优化

一.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文件
发布了94 篇原创文章 · 获赞 108 · 访问量 6404

猜你喜欢

转载自blog.csdn.net/qq_42761527/article/details/103605493