Apache部分安全&调优配置

1、隐藏版本号/更改版本号

隐藏版本号:
----------------
yum安装方法
[root@study ~]# vim /etc/httpd/conf/httpd.conf
ServerTokens Prod	#这会在响应头中显示“Server:Apache”而不包含任何的版本信息
ServerSignature off

可以观察到第四行Apache信息已经被隐藏
[root@study ~]# curl -I 127.0.0.1
HTTP/1.1 403 Forbidden
Date: Fri, 06 Sep 2019 16:13:30 GMT
Server: Apache
Last-Modified: Thu, 16 Oct 2014 13:20:58 GMT
ETag: "1321-5058a1e728280"
Accept-Ranges: bytes
Content-Length: 4897
Content-Type: text/html; charset=UTF-8
----------------------------
源码编译安装:
[root@study ~]# vim /etc/httpd/httpd.conf
取消这一行的注释
495 Include /etc/httpd/extra/httpd-default.conf
[root@study ~]# vim /etc/httpd/extra/httpd-default.conf
ServerTokens Full -->ServerTokens Prod

修改版本信息:
编辑源码文件,将下方内容修改为自己想要的即可
[root@study httpd-2.4.41]# vim include/ap_release.h 
 40 #define AP_SERVER_BASEVENDOR "Apache Software Foundation"	#服务的供应商名称
 41 #define AP_SERVER_BASEPROJECT "Apache HTTP Server"	#服务的项目名称
 42 #define AP_SERVER_BASEPRODUCT "Apache"	#服务的产品名
 43 
 44 #define AP_SERVER_MAJORVERSION_NUMBER 2		#主要版本号
 45 #define AP_SERVER_MINORVERSION_NUMBER 4		#次版本号
 46 #define AP_SERVER_PATCHLEVEL_NUMBER   41	#修正号
 47 #define AP_SERVER_DEVBUILD_BOOLEAN    0	
再重新编译。

2、启用压缩模块mod_deflate

apache的压缩要用到mod_deflate模块,该模块提供了DEFLATE输出过滤器,允许服务器在将输出内容发送到客户端以前进行压缩,以节约带宽。它的核心思想就是把文件先在服务器进行压缩,然后再进行传输,这样可以显著减少文件传输的大小。当传输完毕后,客户端浏览器会重新对压缩过的内容进行解压缩。

模块检查
[root@study ~]# /usr/local/apache/bin/apachectl -M | grep deflate
弹出的模块
http_module (static)		#static为编译时安装的
mpm_event_module (shared)	#shared为DSO方式安装的

DSO: Dynamic shared object动态共享对象 。DSO模块可以在编译服务器之后编译,也可以用Apache扩展工具(apxs)编译并增加
使用DSO方式安装,/usr/local/apache/bin/apxs
[root@study ~]# /usr/local/apache/bin/apxs 
Usage: apxs -g [-S <var>=<val>] -n <modname>
       apxs -q [-v] [-S <var>=<val>] [<query> ...]
       apxs -c [-S <var>=<val>] [-o <dsofile>] [-D <name>[=<value>]]
               [-I <incdir>] [-L <libdir>] [-l <libname>] [-Wc,<flags>]
               [-Wl,<flags>] [-p] <files> ...
       apxs -i [-S <var>=<val>] [-a] [-A] [-n <modname>] <dsofile> ...
       apxs -e [-S <var>=<val>] [-a] [-A] [-n <modname>] <dsofile> ...
常见选项
-n modname
这显式设置了-i(安装)和-g(模板生成)选项的模块名称。使用此选项可明确指定模块名称。对于选项,-g这是必需的,对于选项-i,apxs工具尝试从源中确定名称或至少通过从文件名中猜测来确定(作为后备)。
-q
对用于构建的变量和环境设置执行查询httpd。在没有查询参数的情况下调用时,它会打印所有已知变量及其值。可选-v 参数格式化列表输出。
-S name=value
此选项可更改上述apxs设置。


DSO编译选项
-c
这表示编译操作。它首先编译的C源文件(.c)中文件为相应的对象文件(.o),然后生成在动态共享对象dsofile通过链接这些对象文件加上剩余的对象文件(.o和.a)中的 文件。如果没有-o指定选项输出文件被从第一文件名中猜测文件和因此通常默认为。mod_name.so
-o dsofile
明确指定创建的动态共享对象的文件名。如果未指定且无法从文件列表中猜出 名称,mod_unknown.so则使用后备名称。
-D name=value
此选项直接传递给编译命令。使用此选项可将您自己的定义添加到构建过程。
-I incdir
此选项直接传递给编译命令。使用此选项添加您自己的包含目录以搜索构建过程。
-L libdir
此选项直接传递给链接器命令。使用此选项可添加自己的库目录以搜索构建过程。
-l libname
此选项直接传递给链接器命令。使用此选项可添加自己的库以搜索构建过程。
-Wc,compiler-flags
此选项将编译器标志作为libtool --mode=compile命令的附加标志传递。使用此选项可添加本地编译器特定选项。
-Wl,linker-flags
此选项将链接器标志作为libtool --mode=link命令的附加标志传递。使用此选项可添加本地链接器特定选项。
-p
此选项导致apxs链接到apr / apr-util库。在编译使用apr / apr-util库的帮助程序时,这很有用。

DSO安装和配置选项
-i
这表示安装操作,并将一个或多个动态共享对象安装到服务器的modules 目录中。
-a
这会通过自动向LoadModuleApache的httpd.conf配置文件添加相应的行来 激活模块 ,或者如果它已经存在则启用它。
-A
与选项相同,-a但创建的LoadModule指令以哈希符号(#)为前缀,即模块刚准备好以后激活但最初禁用。
-e
这表明编辑操作,它可以与使用 -a和-A选项类似于 -i操作编辑Apache的httpd.conf 配置文件而不尝试安装该模块。

例如:
[root@study ~]# /usr/local/apache/bin/apxs -c -i -a /usr/local/apache/modules/mod_deflate.so 


[root@study ~]# vim /etc/httpd/httpd.conf 
取消下行的注释
108 LoadModule deflate_module modules/mod_deflate.so
重启apache
[root@study ~]# /usr/local/apache/bin/apachectl -M | grep deflate
 deflate_module (shared)

[root@study ~]# vim /etc/httpd/httpd.conf 
<ifmodule mod_deflate.c>
   DeflateCompressionLevel 6   	#压缩等级,越大效率越高,消耗CPU也越高。范围1——9
   SetOutputFilter DEFLATE  	 #启用压缩
   DeflateFilterNote Input instream #声明输入流的byte数量
   DeflateFilterNote Output outstream #声明输出流的byte数量
   DeflateFilterNote Ratio ratio  #声明压缩的百分比
   AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css application/javascript   #仅压缩,限制特定的MIME类型文件
</ifmodule>
[root@study ~]# /usr/local/apache/bin/apachectl restart

3、设置页面缓存mod_expires

[root@study ~]# vim /etc/httpd/httpd.conf 
取消下行注释
123 LoadModule expires_module modules/mod_expires.so
[root@study ~]# /usr/local/apache/bin/apachectl restart
[root@study ~]# /usr/local/apache/bin/apachectl -M | grep expire
 expires_module (shared)
  • 全局设置
[root@study ~]# vim /etc/httpd/httpd.conf 
<IfModule mod_expires.c>  
ExpiresActive on
    ExpiresDefault "access plus 12 month"
    ExpiresByType text/html "access plus 12 months"
    ExpiresByType text/css "access plus 12 months"
    ExpiresByType image/gif "access plus 12 months"
    ExpiresByType image/jpeg "access plus  12 months"
    ExpiresByType image/jpg "access plus 12 months"
    ExpiresByType image/png "access plus 12 months"
    EXpiresByType application/x-shockwave-flash "access plus 12 months"
    EXpiresByType application/x-javascript "access plus 12 months"
ExpiresByType video/x-flv "access plus 12 months"
</IfModule>
  • 目录设置
[root@study ~]# vim /etc/httpd/httpd.conf
<Directory "/usr/local/apache/htdocs">   
    <IfModule mod_expires.c>  
ExpiresActive on
    ExpiresDefault "access plus 12 month"
    ExpiresByType text/html "access plus 12 months"
    ExpiresByType text/css "access plus 12 months"
    ExpiresByType image/gif "access plus 12 months"
    ExpiresByType image/jpeg "access plus  12 months"
    ExpiresByType image/jpg "access plus 12 months"
    ExpiresByType image/png "access plus 12 months"
    EXpiresByType application/x-shockwave-flash "access plus 12 months"
    EXpiresByType application/x-javascript "access plus 12 months"
ExpiresByType video/x-flv "access plus 12 months"
</IfModule>
</Directory>
  • 虚拟主机设置
[root@study ~]# vim /etc/httpd/httpd.conf
注释如下行:
#DocumentRoot "/usr/local/apache/htdocs"

取消这一行注释:
Include /etc/httpd/extra/httpd-vhosts.conf
[root@study ~]# vim /etc/httpd/extra/httpd-vhosts.conf 
<VirtualHost *:80>
    ServerAdmin [email protected]
    DocumentRoot "/www/html"
    ServerName test.com
    ServerAlias test.com
    ErrorLog "logs/dummy-host.example.com-error_log"
    CustomLog "logs/dummy-host.example.com-access_log" common
<Directory "/www/html">
        Options None
        Require all granted
  </Directory>
<IfModule mod_expires.c>  
ExpiresActive on
    ExpiresDefault "access plus 12 month"
    ExpiresByType text/html "access plus 12 months"
    ExpiresByType text/css "access plus 12 months"
    ExpiresByType image/gif "access plus 12 months"
    ExpiresByType image/jpeg "access plus  12 months"
    ExpiresByType image/jpg "access plus 12 months"
    ExpiresByType image/png "access plus 12 months"
    EXpiresByType application/x-shockwave-flash "access plus 12 months"
    EXpiresByType application/x-javascript "access plus 12 months"
ExpiresByType video/x-flv "access plus 12 months"
</IfModule>
</VirtualHost>
  • mod_expires模块语法说明:
1、ExpiresActive 指令	On|Off
该指令启用或禁用有问题的文档领域的生成 Expires和Cache-Control标头。(.htaccess例如,如果在文件中找到 ,它仅适用于从该目录生成的文档。)如果设置为 Off,则不会为领域中的任何文档生成标题(除非在较低级别覆盖,例如一个.htaccess文件覆盖服务器配置文件)。如果设置为On,则标题将根据ExpiresByType和 ExpiresDefault 指令(qv)定义的条件添加到服务文档中 

2、ExpiresDefault "base [plus num type] [num type] ..."
ExpiresByType type/encoding "base [plus num type] [num type] ..."
base包含:access,now,modification三种值
plus是可选值,num为一个整数值,type是时间单位包括(years,months,weeks,days,hours,minutes,seconds)


3、ExpiresByType 指令
句法:	ExpiresByType MIME-type <code>seconds
该指令定义Expires 标头的值和为指定类型的文档生成的标头的max-age指令 Cache-Control(例如,text/html)。第二个参数设置将添加到构建到期日期的基准时间的秒数。将Cache-Control: max-age通过从有效期限减去请求时间和表达的结果以秒计算的。

4、apache运行模式

  1. refork MPM : Prefork MPM实现了一个非线程的、预派生的web服务器。它在Apache启动之初,就先预派生一些子进程,然后等待连接;可以减少频繁创建和销毁进程的开销,每个子进程只有一个线程,在一个时间点内,只能处理一个请求。这是一个成熟稳定,可以兼容新老模块,也不需要担心线程安全问题,但是一个进程相对占用资源,消耗大量内存,不擅长处理高并发的场景。

  2. Worker MPM : 和prefork模式相比,worker使用了多进程和多线程的混合模式,worker模式也同样会先预派生一些子进程,然后每个子进程创建一些线程,同时包括一个监听线程,每个请求过来会被分配到一个线程来服务。线程比起进程会更轻量,因为线程是通过共享父进程的内存空间,因此,内存的占用会减少一些,在高并发的场景下会比prefork有更多可用的线程,表现会更优秀一些;另外,如果一个线程出现了问题也会导致同一进程下的线程出现问题,如果是多个线程出现问题,也只是影响Apache的一部分,而不是全部。由于用到多进程多线程,需要考虑到线程的安全了,在使用keep-alive长连接的时候,某个线程会一直被占用,即使中间没有请求,需要等待到超时才会被释放(该问题在prefork模式下也存在)。

  3. Event MPM:event模式是在2.4版本中才稳定发布的模式。这是Apache最新的工作模式,它和worker模式很像,不同的是在于它解决了keep-alive长连接的时候占用线程资源被浪费的问题,在event工作模式中,会有一些专门的线程用来管理这些keep-alive类型的线程,当有真实请求过来的时候,将请求传递给服务器的线程,执行完毕后,又允许它释放。这增强了在高并发场景下的请求处理。

查看当前环境模型
[root@study ~]# /usr/local/apache/bin/httpd -V | grep -i mpm
Server MPM:     event

更改模式
[root@study ~]# vim /etc/httpd/httpd.conf 
#LoadModule mpm_event_module modules/mod_mpm_event.so
LoadModule mpm_prefork_module modules/mod_mpm_prefork.so
#LoadModule mpm_worker_module modules/mod_mpm_worker.so

配置文件
[root@study ~]# vim /etc/httpd/extra/httpd-mpm.conf 
 <IfModule mpm_prefork_module>
     StartServers             20	 #该StartServers指令设置启动时创建的子服务器进程数。
     MinSpareServers          5	 #该MinSpareServers指令设置所需的最小空闲子服务器进程数。空闲进程是不处理请求的进程。如果少于MinSpareServers空闲,则父进程以每秒1的最大速率创建新子进程。
     MaxSpareServers         10	 #该MaxSpareServers指令设置所需的最大空闲子服务器进程数。空闲进程是不处理请求的进程。如果有多个MaxSpareServers空闲,那么父进程将终止多余的进程。
     MaxRequestWorkers      250	 #该MaxRequestWorkers指令设置了将要服务的同时请求数量的限制。超过MaxRequestWorkers 限制的任何连接尝试通常将排队
    MaxConnectionsPerChild   0	 #该MaxConnectionsPerChild指令设置单个子服务器进程将处理的连接数限制。MaxConnectionsPerChild连接后,子进程就会死亡。如果MaxConnectionsPerChild是 0,那么该过程将永不过期。
 </IfModule>
发布了65 篇原创文章 · 获赞 48 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/DoloresOOO/article/details/100622177
今日推荐