apache调优进阶

一、 apache运行模式介绍
1、 apache的三种工作模式
web服务器apache目前一共有三种稳定的MPM(Multi-Processing Module ,对进程处理模块)模式。如prefork(进程模式),worker(线程模式),event(事件模式,2.4版本后开始稳定)

2、 prefork运行模式详解
Prefork MPM实现了一个非线程的、预派生的web服务器。它在Apache启动之初,就先预派生一些子进程,然后等待连接;可以减少频繁创建和销毁进程的开销,每个子进程只有一个线程,在一个时间点内,只能处理一个请求。这是一个成熟稳定,可以兼容新老模块,也不需要担心线程安全问题,但是一个进程相对占用资源,消耗大量内存,不擅长处理高并发的场景。
最重要的是将MaxClients设置为一个足够大的数值以处理潜在的请求高峰,同时又不能太大,以致需要使用的内存超出物理内存的大小。所以现在已经不常用这个模式了。 而且Apache2.4版本以后,默认使用的是worker模式。
注: Prefork 是基于多进程的模式。
优点:因为每个进程使用独立的内存空间,所以比较安全。一个进程坏了,不会影响其他进程。
缺点:占用的内存比较大。

原理运行图:
apache调优进阶_第1张图片

总结:prefork模式,一个进程对应多个子进程,一个子进程只能对应一个线程,每个线程之间没有关联,内存不能共享,处理任务效率慢,消耗内存。已经被淘汰。

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

工作原理图:
apache调优进阶_第2张图片
注: Worker MPM优点:可以处理海量请求,而系统资源的开销小。原因:一个进程中包括多个线程。多个线程之间可以共享内存,所以占用的内存资源比较少。如图:
缺点:不太安全。如果一个线程坏了。 整个进程都要坏了。另外存在keep-alive长连接占用资源时间过长。
如何避免进程中某个线程坏了? 一个进程中所有线程完成一定数量的请求后,自动关闭,再重打开。就可以避免内存溢出等问题。 就像一个电脑开机时间长了,会卡,需要重启一下。
总结: 不管是Worker模式或是Prefork 模式,Apache总是试图保持一些备用的(spare)或者是空闲的子进程(空闲的服务线程池)用于迎接即将到来的请求。这样客户端就不需要在得到服务前等候子进程的产生。这就是预先派生进程或线程。

总结:worker模式,一个进程对应多个子进程,一个子进程对应多个线程,多个线程之间可以共享内存,因为线程消耗的内存是从进程中获取。一个进程故障,会影响多个线程;多个线程故障,不会影响很多进程。

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

工作原理图:
apache调优进阶_第3张图片
总结:event模式,额worker模式比较类似。不同的是event模式,多了一个监控线程的功能,用来处理多个线程长时间在线,消耗资源的情况。

三种工作模式,可以通过源码编译的方式进行添加,具体的添加方式如下:
使用 --with-mpm=prefork|worker|event 来指定编译为那一种MPM。也可以编译为三种都支持:–enable-mpms-shared=all,这样在编译的时候会在modules目录下自动编译出三个MPM文件的so,然后通过修改httpd.conf配置文件更改MPM

5、 查看apache的运行模式
1)[root@xuegod120 ~]# apachectl -l
Compiled in modules:
core.c
mod_so.c
http_core.c
worker.c

2)[root@xuegod120 ~]# apachectl -V
Server version: XWS/4.8.74 (Unix)
Server built: Aug 3 2019 09:02:03
Server’s Module Magic Number: 20120211:83
Server loaded: APR 1.4.8, APR-UTIL 1.5.2
Compiled using: APR 1.4.8, APR-UTIL 1.5.2
Architecture: 64-bit
Server MPM: worker
二、 对prefork模式性能优化
1、 启用mpm配置文件
[root@xuegod120 ~]# vim /usr/local/apache2.4-xuegod/conf/httpd.conf
改:485 #Include conf/extra/httpd-mpm.conf
为:485 Include conf/extra/httpd-mpm.conf

2、 prefork常用配置参数
[root@xuegod120 ~]# vim /usr/local/apache2.4-xuegod/conf/extra/httpd-mpm.conf
#这是prefork模式的配置参数,虽然配置文件中有参数,但是不启作用,因为我们是以worker模式在运行Apache,以下参数说明。
28
29 StartServers 5 # 启动Apache时创建的服务进程数量
30 MinSpareServers 5 # 最小空闲进程数, Spare :[speə®] 备用
31 MaxSpareServers 10 # 最大空闲进程数
32 MaxRequestWorkers 250 # 最大并发进程数。
33 MaxConnectionsPerChild 0 # 最大连接数限制。如果设置为0,表示没有限制。

3、 MinSpareServers
MinSpareServers指令设置空闲子进程的最小数量。所谓空闲子进程是指没有正在处理请求的子进程。如果当前空闲子进程数少于MinSpareServers ,那么Apache将以第一秒一个,第二秒两个,第三秒四个,按指数递增个数的速度产生新的子进程。如此按指数级增加创建的进程数,最多达到每秒32个,直到满足 MinSpareServers设置的值为止;这就是预派生(prefork)的由来;这种模式可以不必在请求到来时再产生新的进程,从而减小了系统开销以增加性能;如下图:
apache调优进阶_第4张图片

4、 MaxSpareServers
MaxSpareServers指令设置空闲子进程的最大数量。所谓空闲子进程是指没有正在处理请求的子进程。如果当前有超过MaxSpareServers数量的空闲子进程,那么父进程将杀死多余的子进程。如下图:
apache调优进阶_第5张图片
可以调整MinSpareServers 和MaxSpareServers这两个参数,但是这两个参数的值不能设得太大,否则Apache进程太多,会导致内存占用太多。
注:在一台压力大(并发访问2000)的服务器上,MaxSpareServers这个值设置的是200。保留最大并发数的10分之一。设置了这个值的好处是不会有太多的空闲的进程在消耗资源,关闭空闲Apache进程的同时,会释放内存,进而减少系统资源消耗。

5、 MaxRequestWorkers 250 最大并发进程数
MaxRequestWorkers : 最大同时处理请求的进程数量,也是最大的同时连接数,表示了Apache的最大请求并发能力,超过该数目后的请求,将排队。

6、 MaxRequestsPerChild 0 最大连接数限制
MaxConnectionsPerChild : 进程生命周期内,处理的最大请求数目。达到该数目后,进程将死掉。如果设置为0,表示没有限制。该参数的意义在于,避免了可能存在的内存泄露带来的系统问题。

将MaxRequestsPerChild设置成非零值有两个好处:

  • 可以防止(偶然的)内存泄漏无限进行,从而耗尽内存。
  • 给进程一个有限寿命,从而有助于当服务器负载减轻的时候减少活动进程的数量。
    如:MaxConnectionsPerChild 25000。当进程处理了25000个请求后,Apache管理进程会去终止此进程继续处理新的请求,当此进程处理完所有的已建立的请求后,管理进程会杀掉此进程,重新生成一个新的进程

注:当KeepAlive 为On, 开启长链接时,发送的请求,在MaxRequestsPerChild里面只算一个,不管这个连接发送了多少个请求。

三、 对worker工作模式详解
1、 对worker模式性能优化
Apache2.0以后的版本在性能方面改进最明显的变化就在于使用worker模式。
优点:内存占用比prefork模式低,适合高并发高流量HTTP服务。
缺点:假如一个线程崩溃,整个进程就会连同其他任何线程一起“死掉”。由于线程共享内存空间,所以一个程序在运行时必须被系统识别为“每个线程都是安全的”。服务稳定性不如prefork模式。后期根据每个进程处理的请求数,重启worker进程,

2、 worker模式常用配置参数
44
45 StartServers 3 #启动时进程数。
46 MinSpareThreads 75 #最小空闲线程数。 # thread[英][θred] 线程
47 MaxSpareThreads 250 #最大空闲线程数。
48 ThreadsPerChild 25 #每个进程可以启动的线程数量。
49 MaxRequestWorkers 400 #所有线程数量的最大值,通常表示了一个web服务可以同时处理的请求数。
50 MaxConnectionsPerChild 0 #最大连接数限制。
51

配置参数详细说明:

StartServers 3 #最初建立的子进程
MinSpareThreads 75 #基于整个服务器监视的最小空闲线程数,如果空闲的线程小于设定值,Apache会自动建立线程,如果服务器负载大的话,可以考虑加大此参考值。
MaxSpareThreads 250 #基于整个服务器监视的最大空闲线程数,如果空闲的线程大于设定值,Apache会自动kill掉多余的线程,如果服务器负载大的话,可以考虑加大此参考值。
ThreadsPerChild 25 #表示每个进程包含的线程数,如果是并发量比较大,可以考虑加大这个值。此参数在worker模式中,是影响最大的参数。
MaxRequestWorkers 400 #所有线程数量的最大值,通常表示了一个web服务的最大并发值。MaxRequestWorkers必须是ThreadsPerChild的整数倍,否则Apache会提示调整到一个相近的值。MaxRequestWorkers=StartServers* ThreadsPerChild
MaxConnectionsPerChild 0 #每个子进程可以处理的最大请求数。达到该数目后,进程将死掉。如果设置为0,表示没有限制。
如:MaxConnectionsPerChild 25000。当进程处理了25000个请求后,Apache管理进程会去终止此进程继续处理新的请求,当此进程处理完所有的已建立的请求后,管理进程会杀掉此进程,重新生成一个新的进程。配置如下:

StartServers 8 #启动时进程数。
MinSpareThreads 75 #最小空闲线程数。 # thread[英][θred] 线程
MaxSpareThreads 250 #最大空闲线程数。
ThreadsPerChild 250 #每个进程可以启动的线程数量。
MaxRequestWorkers 400 #所有线程数量的最大值 。
MaxConnectionsPerChild 2500 #最大连接数限制。

上述参数配置思路:一个进程中有250个线程。 一个进程处理25000个请求。 平均一个线程处理25000/250=100个请求。这样配置还是合理的。

3、 实战:apache基于worker模式的生产环境配置实例
1) 查看每个进程使用的内存大小
[root@xuegod120 ~]# ps -aux | grep httpd
root 22057 0.0 0.1 107860 3416 ? Ss 14:32 0:01 /usr/local/apache2.4-xuegod/bin/httpd -k start
apache 37059 0.0 0.2 394688 4444 ? Sl 17:21 0:00 /usr/local/apache2.4-xuegod/bin/httpd -k start
apache 37060 0.0 0.2 394688 4444 ? Sl 17:21 0:00 /usr/local/apache2.4-xuegod/bin/httpd -k start
apache 37061 0.0 0.2 394688 4444 ? Sl 17:21 0:00 /usr/local/apache2.4-xuegod/bin/httpd -k start
注:初始启动了三个apache进程

[root@xuegod120 ~]# ps -aux | grep httpd | awk ‘{print $6}’ #打印第6列的RSS值,真实内存
3416
4444
4444
4444

注:默认单位是K,可以看到三个进程每个使用的是4444K内存,一共使用了4444*3=13.02M内存,这是初始的内存大小。
后期随着Apache进程处理的web请的增加,每个进程使用的内存数量还会增加的。 因为每个人的网站和业务不一样。所以每个Apache进程使用的内存大小也不一样。但是大家可以在自己的服务器上线1天后,使用此命令查看一下,每个进程使用的内存大小,这样可以准确算出每个进程使用的内存数量。
查看进程使用的内存的总大小:
[root@xuegod120 ~]# ps -aux | grep httpd | awk ‘{sum += $6;n++};END{print sum}’
28116
查看每个进程使用内存的平均:
[root@xuegod120 ~]# ps -aux | grep httpd | awk ‘{sum += $6;n++};END{print sum/n}’
4017.14
注:这样就可以根据每个进程使用内存的大小,来算一下我们最多可以给多少内存。

4、 实战场景:一台服务器,16核心CPU,64G内存。 Apache最大可以设置多少个work进程
思路:先减去服务器系统本身所需要的资源,剩下的才能给Apache使用。具体分配内存场景,可以参考以下案例。
例1:当一台服务器是8G内存时,2G留给系统使用,6G留给Apache使用。
例2:当一台服务器是16G内存时,4G留给系统使用,12G留给Apache使用。
例3:当一台服务器是32G内存时,8G留给系统使用,24G留给Apache使用。
例4:当一台服务器是64G内存时,8G留给系统使用,56G留给Apache使用。
总结:系统最多使用8G内存,就足够了稳定运行了。

那么对于64G内存的服务器,Apache可以使用56G内存,假如每个work进程稳定运行时,平均使用56M内存。最大work进程数为:56*1024/56=1024个。
根据上述情况,修改后的http-mpm.conf的worker的配置后为:
[root@xuegod120 ~]# vim /usr/local/apache2.4-xuegod/conf/extra/httpd-mpm.conf
44
45 StartServers 1024
46 MinSpareThreads 750
47 MaxSpareThreads 2500
48 ThreadsPerChild 250
49 MaxRequestWorkers 25000
50 MaxConnectionsPerChild 25000
51

重启Apache,再打开网站看看是否还会有慢的问题了。
[root@xuegod120 ~]# /etc/init.d/apachectl-xuegod restart
测试:
动态观察Apache的最大连接数:
[root@xuegod120 ~]# watch -n 1 “pgrep httpd|wc -l”

5、 生产环境配置实例
实战环境:一台服务器cpu是8核心,物理是内存32G ,想达到2000并发的apache,worker模式的配置参数如下:

StartServers 16
MinSpareThreads 75
MaxSpareThreads 1250
ThreadsPerChild 125
MaxRequestWorkers 2000
MaxConnectionsPerChild 12500

详解每个参数的配置合理性如下:

StartServers 16 #启动时进程数。一般设同cpu核心数一样或是cpu核心数的2倍。我调成16和cpu核心一样。
MinSpareThreads 75 #最小空闲线程数。假设一个网站每天正常被用户使用的时间为早上7:00到晚上2:00。那么MinSpareThreads应该配置为,这一时间段,最小并发访问量的3倍。比如7:00最少并发为25,那就配置成75。
MaxSpareThreads 1250 #最大空闲线程数。一般配置为1天中最大并发量的1半。如这台服务器能处理的最大并量为2500。那么此值应该为1250。因为内存闲着也是闲着,可以按linux下尽可能使用内存的原则,配置成1250.这样在突然到来更多访问量时,响应会更及时。
ThreadsPerChild 125 #每个进程可以启动的线程数量。生成环境中,在带宽和硬盘性能充足的情况下,希望这个这台可以完成2000左右的并发。那么此值应该为:2000/ StartServers的值(我这里是16)=125 。但是一个进程不可能包括无数的线程,包括太多,会导致进程不稳定,容易崩溃。所以我们认为一个进程最多包括125线程,就很好了。所以如果还想处理更多的请求,可以把StartServers的值增加,而不是增大ThreadsPerChild的值。 因为ThreadsPerChild值过大,会导致Apache运行不稳定。系统调优,稳定是一切的前提。
MaxRequestWorkers 2000 #所有线程数量的最大值,通常表示了一个web服务的最大并发值。MaxRequestWorkers必须是ThreadsPerChild的整数倍,否则Apache会提示调整到一个相近的值。MaxRequestWorkers=StartServers* ThreadsPerChild。 我们这里是:16*125=2000
MaxConnectionsPerChild 12500 # 最大连接数限制。每个子进程可以处理的最大请求数。如果设置为0,表示没有限制。 我们设置为MaxConnectionsPerChild 12500。当进程处理了12500个请求后,Apache管理进程会去终止此进程继续处理新的请求,当此进程处理完所有的已建立的请求后,管理进程会杀掉此进程,重新生成一个新的进程。
结合当前的配置,我们得出结论:Apache一个进程中有125个线程。 Apache一个进程处理12500个请求。 平均一个线程处理12500/125=100个请求。这样配置还是合理的。一个线程处理太多的请求,也会出现内存溢出,导致进程崩溃。

四、 event模式调优

[root@xuegod120 apache2.4-xuegod]# vim conf/extra/httpd-mpm.conf #配置如下
61
62 StartServers 3
120 MinSpareThreads 75
64 MaxSpareThreads 250
65 ThreadsPerChild 25
66 MaxRequestWorkers 400
67 MaxConnectionsPerChild 0
68
event模式调优和worker模式一样的,不同的是在于它解决了keep-alive长连接的时候占用线程资源被浪费的问题。所以理伦上event模式比worker模式好。
总结:生产环境下对于要求更高伸缩性的站点可以选择使用worker 或 event模式; 需要可靠性或者与旧软件兼容的站点可以使用 prefork模式。现在网站使用worker模式比较多。worker也比较成熟。event模式从Apache2.4版本才开始有。

五、 apache的rewrite规则使用技巧
1、 rewrite规则简介
Rewirte主要的功能就是实现URL的跳转,它的正则表达式是基于Perl语言。可基于服务器级的(httpd.conf)和目录级的 (.htaccess)两种方式。如果要想用到rewrite模块,必须先安装或加载rewrite模块。
安装Rewirte模块两种方式:
方法一:是编译Apache的时候就直接 安装rewrite模块。
方法二:编译Apache时以DSO模式安装Apache,然后再利用源码和apxs来安装rewrite模块。

2、 基于服务器级的(httpd.conf)有两种方法
方法1:在httpd.conf的全局下 直接利用RewriteEngine on来打开rewrite功能;
方法2:在局部里利用RewriteEngine on来打开rewrite功能,下面将会举例说明,需要注意的是,必须在每个virtualhost里用RewriteEngine on来打开rewrite功能。否则virtualhost里没有RewriteEngine on它里面的规则也不会生效。

3、 Apache mod_rewrite规则重写的标志参数说明

  1. R[=code](force redirect) 强制外部重定向。
    强制在替代字符串加上http://thishost[:thisport]/前缀重定向到外部的URL.如果code不指定,将用缺省的302 HTTP状态码。
  2. F(force URL to be forbidden)禁用URL,返回403HTTP状态码。
  3. G(force URL to be gone) 强制URL为GONE,返回410HTTP状态码。
  4. P(force proxy) 强制使用代理转发。
  5. L(last rule) 表明当前规则是最后一条规则,停止分析以后规则的重写。
  6. N(next round) 重新从第一条规则开始运行重写过程。
  7. C(chained with next rule) 与下一条规则关联。
    如果规则匹配则正常处理,该标志无效,如果不匹配,那么下面所有关联的规则都跳过。
  8. T=MIME-type(force MIME type) 强制MIME类型。
  9. NS (used only if no internal sub-request) 只用于不是内部子请求。
  10. NC(no case) 不区分大小写
  11. QSA(query string append) 追加请求字符串。
  12. NE(no URI escaping of output) 不在输出转义特殊字符。
    例如:RewriteRule /foo/(.*) /bar?arg=P1%3d$1 [R,NE] 将能正确的将/foo/zoo转换成/bar?arg=P1=zed
  13. PT(pass through to next handler) 传递给下一个处理。
  14. S=num(skip next rule(s)) 跳过num条规则。
  15. E=VAR:VAL(set environment variable) 设置环境变量。

4、 mod_rewrite模块检查和安装
检查mod_expires模块是否安装的方法如下:
[root@xuegod120 ~]# /usr/local/apache2.4-xuegod/bin/apachectl -M | grep rewrite
rewrite_module (static) #此种结果为编译安装时装的。 注:默认我的Apache这里已经安装好了,不需要编译。
[root@xuegod120 ~]# /usr/local/apache2.4-xuegod/bin/apachectl -M | grep expires
expires_module (shared) #此种结果为DSO方式安装的。

[root@xuegod120 ~]# /usr/local/apache2.4-xuegod/bin/apachectl -M | grep rewrite # 没有查看到rewrite模块。
互动:我们在之前编译时已经加了–enable-rewrite选项,为什么此没有找到rewrite模块?
[root@xuegod120 ~]# ls /usr/local/apache2.4-xuegod/modules/mod_rewrite.so
/usr/local/apache2.4-xuegod/modules/mod_rewrite.so #可以看到系统中有这个模块的
解决:这是因为我们还没有启用rewrite模块。
[root@xuegod120 ~]# vim /usr/local/apache2.4-xuegod/conf/httpd.conf
改:156 #LoadModule rewrite_module modules/mod_rewrite.so #删除前面的#号,启用rewrite模块。
为:156 LoadModule rewrite_module modules/mod_rewrite.so

[root@xuegod120 ~]# /usr/local/apache2.4-xuegod/bin/apachectl -M | grep rewrite
rewrite_module (shared) #已经可以查看到rewrite模块了。

扩展:如果之前安装Apache时,没有添加–enable-rewrite选项,那需要使用下面的方法手动编译出来这个模块。 具体如下:
a)编译方式安装
编译的时候跟上–enable-rewrite即可实现安装。
b)DSO方式安装
[root@xuegod120 ~]# cd /usr/local/src/httpd-2.4.28/modules/mappers/
#切到Apache源码包mod_expires所在的目录下
[root@xuegod120 mappers]# ls mod_rewrite.c #查看mod_rewrite.c文件
以dso的方式编译安装到Apache中
[root@xuegod120 mappers]# /usr/local/apache2.4-xuegod/bin/apxs -c -i -a /usr/local/src/httpd-2.4.28/modules/mappers/mod_rewrite.c

5、 实战1
实现client请求的主机前缀不是www.xuegod.cn和192.168.1.63都跳转到主机前缀为http://www.xuegod.cn 。例如当用户在地址栏写入http://xuegod.cn和bbs.xuegod.com直接跳转到http://www.xuegod.cn登录网站
[root@xuegod120 ~]# vim /usr/local/apache2.4-xuegod/conf/httpd.conf
在:156 LoadModule rewrite_module modules/mod_rewrite.so 之后插入以下内容。
RewriteEngine on
RewriteCond %{HTTP_HOST} !^www.xuegod.cn [NC]
RewriteCond %{HTTP_HOST} !^192.168.0.120 [NC]
RewriteCond %{HTTP_HOST} !^$
RewriteRule ^/(.*) http://www.xuegod.cn/ [L]

注释:
RewriteEngine on #打开rewirte功能。
RewriteCond %{HTTP_HOST} !^www.xuegod.cn [NC] #声明Client请求的主机中前缀不是。www.xuegod.cn,[NC]的意思是忽略大小写。
RewriteCond %{HTTP_HOST} !^192.168.1.63 [NC] #声明Client请求的主机中前缀不是。192.168.1.63,[NC]的意思是忽略大小写。
RewriteCond %{HTTP_HOST} !^$ #声明Client请求的主机中前缀不为空,[NC]的意思是忽略大小写。
RewriteRule ^/(.*) http://www.xuegod.cn/ [L]
#含义是如果Client请求的主机中的前缀符合上述条件,则直接进行跳转到http://www.xuegod.cn/,[L]意味着立即停 止重写操作,并不再应用其他重写规则。这里的.是指匹配所有URL中不包含换行字符,()括号的功能是把所有的字符做一个标记,以便于后面的应用. 就是引用前面里的(.)字符。

[root@xuegod120 ~]# apachectl graceful #加载配置文件
[root@xuegod120 ~]# echo “xuegod120” > /usr/local/apache2.4-xuegod/htdocs/index.html # 生成默认网页

添加hosts记录,进行测试
[root@xuegod120 ~]# vim /etc/hosts #插入以下内容。
192.168.0.120 www.xuegod.cn
192.168.0.120 xuegod.com.cn
192.168.0.120 xuegod.com
192.168.0.120 bbs.xuegod.com
注:稍后测试,使用的是centos7下自带的浏览器,如果你使用的是物理机中的浏览器,需要修改一下自己物理机上的hosts文件。建议大家直接使用centos7虚拟机上的浏览器来测试结果。

访问进行测试
修改本地hosts文件,添加解析记录
在这里插入图片描述
直接访问www.xuegod.cn和192.168.0.120,可以直接访问,不会跳转

apache调优进阶_第6张图片
apache调优进阶_第7张图片
访问xuegod.com.cn和bbs.xuegod.com,同样会跳转到默认网页
在这里插入图片描述
会自动跳转
apache调优进阶_第8张图片
bbs.xuegod.com同样会自动跳转

总结:通过上述测试,说明只要客户端访问的不是www.xuegod.com和192.168.0.120的链接都自动跳转到www.xuegod.cn链接地址。

6、 实战2:将www.360buy.com 域名时跳转到www.jd.com
[root@xuegod120 ~]# vim /usr/local/apache2.4-xuegod/conf/httpd.conf
删除之前添加的rewrite规则:
157 RewriteEngine on
158 RewriteCond %{HTTP_HOST} !^www.xuegod.cn [NC]
159 RewriteCond %{HTTP_HOST} !^192.168.1.63 [NC]
160 RewriteCond %{HTTP_HOST} !^$
161 RewriteRule ^/(.) http://www.xuegod.cn/ [L]
在原来位置插入以下内容:
RewriteEngine on
RewriteCond %{HTTP_HOST} ^www.360buy.com [NC]
RewriteRule ^/(.
) http://www.jd.com/ [L]

添加hosts解析
[root@xuegod120 ~]# vim /etc/hosts
192.168.0.120 www.360buy.com
192.168.0.120 www.jd.com

重新加载配置文件
[root@xuegod120 ~]# apachectl graceful

访问测试
本地hosts文件夹解析
在这里插入图片描述

访问www.360buy.com,测试是否会跳转到www.jd.com
在这里插入图片描述
自动跳转到www.jd.com
apache调优进阶_第9张图片

7、 实战3:对apache进行防盗链的配置
实战场景:一些小网站为了盈利,通过盗链来实现对自己网站内容的丰富,这无疑加大了企业的空间和流量的成本,因此我们需要对Apache进行防盗链的配置。
防盗链配置如下:
[root@xuegod120 ~]# vim /usr/local/apache2.4-xuegod/conf/httpd.conf
删除:
157 RewriteEngine on
158 RewriteCond %{HTTP_HOST} ^www.360buy.com [NC]
159 RewriteRule ^/(.) http://www.jd.com/ [L]
在原位置插入以下内容:

RewriteEngine On
RewriteCond %{HTTP_REFERER} !^http://sunsky.pw/.
$ [NC]
RewriteCond %{HTTP_REFERER} !^http://sunsky.pw$ [NC]
RewriteCond %{HTTP_REFERER} !^http://www.sunsky.pw/.$ [NC]
RewriteCond %{HTTP_REFERER} !^http://www.sunsky.pw$ [NC]
RewriteRule .
.(gif|jpg|swf)$ http://www.sunsky.pw [R,NC]

如上配置之后,我们重启Aache服务即可生效。
[root@xuegod120 ~]# apachectl restart

六、 禁止浏览目录和php文件被解析-使用CDN做网站加速
1、 禁止浏览目录
由于开启目录浏览会让我们整个目录下的内容全部都暴露到外面,因此我们必须要禁止目录浏览功能。当然一些目录开放给客户做下载的,可以忽略此项优化。
我们通过修改Apache主配置文件httpd.conf中的标签内的Options选项参数来实现禁用目录浏览。

[root@xuegod120 ~]# cp -r /boot/grub2/ /usr/local/apache2.4-xuegod/htdocs/ #先复制一些测试数据
[root@xuegod120 ~]# chown apache:apache /usr/local/apache2.4-xuegod/htdocs/grub2/ -R #修改一下拥有者,因为默认只有root用户对grub2有权限,如果不修改权限,会因为没有权限,而报403错误。
测试:打开 链接http://192.168.0.120/grub2/ ,发现当grub2目录下没有index.html文件时,会直接把目录中的文件表出来,这不是我们想要的。
apache调优进阶_第10张图片
现在禁止访问目录下的内容:
[root@xuegod120 ~]# vim /usr/local/apache2.4-xuegod/conf/httpd.conf #找到根目录中的。
261
。。。
改:275 Options Indexes FollowSymLinks
为:275 Options FollowSymLinks
注:你只需要将上面代码中的 Indexes 去掉,就可以禁止 Apache 显示该目录结构。用户就不会看到该目录下的文件和子目录列表了。Indexes 的作用就是当该目录下没有 index.html 文件时,就显示目录结构,去掉 Indexes,Apache 就不会显示该目录的列表了。另外在Options Indexes FollowSymLinks的Indexes前面加上-减号符号。 即: Options -Indexes FollowSymLinks 也可以实现。在Indexes前,加 + 代表允许目录浏览;加 – 代表禁止目录浏览。
[root@xuegod120 ~]# /etc/init.d/apachectl-xuegod restart

再次访问测试
apache调优进阶_第11张图片

2、 禁止网站中某个目录中的php文件被解析
实战场景:企业的站点有时会提供用户进行上传操作,比如让用户上传一个文件或头像图片,而用户上传文件的存放目录,我们是不能给php的解析权限的,否则会对Apache服务和系统造成危害。
设置不允运行/usr/local/apache2.4-xuegod/htdocs/data 目录下的php结尾的文件
[root@xuegod120 ~]# mkdir /usr/local/apache2.4-xuegod/htdocs/data
[root@xuegod120 ~]# vim /usr/local/apache2.4-xuegod/conf/httpd.conf
在:
248
。。。
274
之后,添加以下内容:


Order allow,deny
Deny from all


[root@xuegod120 ~]# /etc/init.d/apachectl restart #就可以了。

写入php测试页面:
[root@xuegod120 ~]# vim /usr/local/apache2.4-xuegod/htdocs/data/index.php

访问测试:http://192.168.0.120/data/index.php
apache调优进阶_第12张图片

3、 使用CDN做网站加速
简单地说,就是通过在现有的Internet中增加一层新的网络架构,将网站的内容发布到最接近用户的缓存服务器内。通过DNS负载均衡的技术,判断用户来源就近访问cache服务器取得所需的内容,杭州的用户访问接近杭州服务器上的内容,北京访问接近北京服务器上的内容。这样可以有效减少数据在网络上传输的事件,提高速度。把静态内容发布到CDN减少了用户的响应时间20%或更多。
CDN技术示意图:
apache调优进阶_第13张图片
国内有名的CND公司:网宿,蓝汛(chinacache),快网
使用nslookup命令,查看我们访问百度的IP地址
apache调优进阶_第14张图片
查询IP地址的所属区域是不是在距离你很近
apache调优进阶_第15张图片

4、Apache网站架构优化
好的网站架构是网站性能强大关键,更是网站安全的关键。
在生产环境中建议将程序页面服务器、图片附件服务器和上传服务器三者的功能尽量分离。
分离方法:
1、分离最佳方式是分别使用独立的服务器(需要程序支持)
2、次选方案在前端负载均衡器通过haproxy/nginx来根据用户请求的目录或扩展名来对后端的服务器发出请求。
例如:请求http://www.xuegod.cn/a/b.jpg就抛给图片服务器(CDN最好),这里是根据扩展名.jpg分发
请求http:// /www.xuegod.cn /upload/login.php就抛给Apache服务器,这里是根据URL路径分发。
均不符合上面两个要求的,默认就都是抛给主web服务器。

你可能感兴趣的:(第三阶段-集群类,rewrite模块的使用方法,禁止列出网站根目录)