Apache调优(一)

(1).Apache运行模式说明

  Apache目前一共有三种稳定的MPM(Multi-Processing Module,多进程处理模块)模式:Prefork(进程模式)、Worker(线程模式)、Event(事件模式,2.4版本后开始稳定)。

 1)Prefork

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

  最重要的是将MaxClients设置为一个足够大的数值以处理潜在的请求高峰,同时又不能太大,以致需要使用的内存超出物理内存的大小。所以现在已经不常用这个模式了。 而且Apache2.4版本以后,默认使用的是worker模式。

  优点:可以兼容新老模块;每个进程使用单独的内存空间,较安全,一个进程坏了不会影响其他进程。

  缺点:占用较大内存,不擅长处理高并发。

  运行原理图如下:

 2)Worker

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

  优点:可以处理海量请求,而系统资源的开销小。

  缺点:不太安全。如果一个线程坏了。 整个进程都要坏了。另外存在keep-alive长连接占用资源时间过长。

  运行原理图如下:

  不管是Worker模式或是Prefork 模式,Apache总是试图保持一些备用的(spare)或者是空闲的子进程(空闲的服务线程池)用于迎接即将到来的请求。这样客户端就不需要在得到服务前等候子进程的产生。这就是预先派生进程或线程。

 3)Event

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

  当某个连接没有请求时,会主动关闭连接,在work模式下,必须等keep-alive超时,才可以释放。

  运行原理图如下:

 4)总结

  在configure配置编译参数的时候,可以使用 --with-mpm=prefork|worker|event 来指定编译为那一种MPM。也可以编译为三种都支持:--enable-mpms-shared=all,这样在编译的时候会在modules目录下自动编译出三个MPM文件的so,然后通过修改httpd.conf配置文件更改MPM(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启用这三个中的一个,注释其他两个)。

 5)查看Apache当前运行模式

  方法一:使用httpd -l来确定当前使用的MPM

[root@youxi1 ~]# /usr/local/apache2.4.39/bin/httpd -l
Compiled in modules:
core.c
mod_so.c
http_core.c
event.c  //当前运行模式

  方法二:使用httpd -V查看当前使用的MPM

[root@youxi1 ~]# /usr/local/apache2.4.39/bin/httpd -V
Server version: IIS/7.0.0 (Unix)
Server built: Aug 8 2019 17:04:07
Server's Module Magic Number: 20120211:84
Server loaded: APR 1.6.5, APR-UTIL 1.6.1
Compiled using: APR 1.6.5, APR-UTIL 1.6.1
Architecture: 64-bit
Server MPM: event  //当前运行模式
threaded: yes (fixed thread count)
forked: yes (variable process count)
Server compiled with....
-D APR_HAS_SENDFILE
-D APR_HAS_MMAP
-D APR_HAVE_IPV6 (IPv4-mapped addresses enabled)
-D APR_USE_SYSVSEM_SERIALIZE
-D APR_USE_PTHREAD_SERIALIZE
-D SINGLE_LISTEN_UNSERIALIZED_ACCEPT
-D APR_HAS_OTHER_CHILD
-D AP_HAVE_RELIABLE_PIPED_LOGS
-D DYNAMIC_MODULE_LIMIT=256
-D HTTPD_ROOT="/usr/local/apache2.4.39"
-D SUEXEC_BIN="/usr/local/apache2.4.39/bin/suexec"
-D DEFAULT_PIDLOG="logs/httpd.pid"
-D DEFAULT_SCOREBOARD="logs/apache_runtime_status"
-D DEFAULT_ERRORLOG="logs/error_log"
-D AP_TYPES_CONFIG_FILE="conf/mime.types"
-D SERVER_CONFIG_FILE="conf/httpd.conf"

 6)切换Apache的运行模式

  如果是yum安装的httpd,想要切换运行模式,这个网上有很多了,可以查看Apache工作模式切换

  我这里重点介绍源码安装的Apache切换运行模式。

  首先使用命令查看安装的MPM模块,static表示是编译安装时一起安装的,shared则是DSO方式安装的。并查看编译设置

[root@youxi1 ~]# /usr/local/apache2.4.39/bin/apachectl -M | grep mpm
mpm_event_module (static)
[root@youxi1 ~]# /usr/local/apache2.4.39/bin/httpd -V
Server version: IIS/7.0.0 (Unix)
Server built: Aug 8 2019 17:04:07
Server's Module Magic Number: 20120211:84
Server loaded: APR 1.6.5, APR-UTIL 1.6.1
Compiled using: APR 1.6.5, APR-UTIL 1.6.1
Architecture: 64-bit
Server MPM: event
threaded: yes (fixed thread count)
forked: yes (variable process count)
Server compiled with....
-D APR_HAS_SENDFILE
-D APR_HAS_MMAP
-D APR_HAVE_IPV6 (IPv4-mapped addresses enabled)
-D APR_USE_SYSVSEM_SERIALIZE
-D APR_USE_PTHREAD_SERIALIZE
-D SINGLE_LISTEN_UNSERIALIZED_ACCEPT
-D APR_HAS_OTHER_CHILD
-D AP_HAVE_RELIABLE_PIPED_LOGS
-D DYNAMIC_MODULE_LIMIT=256
-D HTTPD_ROOT="/usr/local/apache2.4.39"
-D SUEXEC_BIN="/usr/local/apache2.4.39/bin/suexec"
-D DEFAULT_PIDLOG="logs/httpd.pid"
-D DEFAULT_SCOREBOARD="logs/apache_runtime_status"
-D DEFAULT_ERRORLOG="logs/error_log"
-D AP_TYPES_CONFIG_FILE="conf/mime.types"
-D SERVER_CONFIG_FILE="conf/httpd.conf"

  接着重现编译生成httpd二进制文件

[root@youxi1 httpd-2.4.39]# cd /usr/local/src/httpd-2.4.39/
//再原有的./configure配置上重新执行预编译,以及make。我这里改为worker作为演示
[root@youxi1 httpd-2.4.39]# ./configure --prefix=/usr/local/apache2.4.39 --enable-so --enable-rewrite --enable-ssl --enable-deflate --enable-expires --with-apr=/usr/local/apr --with-apr-util=/usr/local/apr-util --with-mpm=worker
[root@youxi1 httpd-2.4.39]# make
[root@youxi1 httpd-2.4.39]# mv /usr/local/apache2.4.39/bin/httpd{,.bak}  //备份已有的httpd
[root@youxi1 httpd-2.4.39]# cp httpd /usr/local/apache2.4.39/bin/  //拷贝新生成的httpd
[root@youxi1 bin]# /etc/init.d/httpd graceful  //重新加载,也可以restart
[root@youxi1 httpd-2.4.39]# /usr/local/apache2.4.39/bin/httpd -V
Server version: IIS/7.0.0 (Unix)
Server built: Aug 8 2019 17:13:33
Server's Module Magic Number: 20120211:84
Server loaded: APR 1.4.8, APR-UTIL 1.5.2
Compiled using: APR 1.6.5, APR-UTIL 1.6.1
Architecture: 64-bit
Server MPM: worker
threaded: yes (fixed thread count)
forked: yes (variable process count)
Server compiled with....
-D APR_HAS_SENDFILE
-D APR_HAS_MMAP
-D APR_HAVE_IPV6 (IPv4-mapped addresses enabled)
-D APR_USE_SYSVSEM_SERIALIZE
-D APR_USE_PTHREAD_SERIALIZE
-D SINGLE_LISTEN_UNSERIALIZED_ACCEPT
-D APR_HAS_OTHER_CHILD
-D AP_HAVE_RELIABLE_PIPED_LOGS
-D DYNAMIC_MODULE_LIMIT=256
-D HTTPD_ROOT="/usr/local/apache2.4.39"
-D SUEXEC_BIN="/usr/local/apache2.4.39/bin/suexec"
-D DEFAULT_PIDLOG="logs/httpd.pid"
-D DEFAULT_SCOREBOARD="logs/apache_runtime_status"
-D DEFAULT_ERRORLOG="logs/error_log"
-D AP_TYPES_CONFIG_FILE="conf/mime.types"
-D SERVER_CONFIG_FILE="conf/httpd.conf"

  切换我已经自己试过了,但不知道会不会有其他漏洞。注意:这只是指定单个mpm时,这样使用。如果实在编译时使用--enable-mpms-shared=all安装所有运行模式,这个需要到Apache主目录下的conf/目录下修改httpd.conf,找到里面的LoadModule中的相应模块(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启用这三个中的一个,注释其他两个)。

(2).Apache运行模式调优

 1)prefork(Apache2.4以后已经很少用到,简单了解)

  查看是否启用MPM的配置文件

[root@youxi1 ~]# vim /usr/local/apache2.4.39/conf/httpd.conf
Include conf/extra/httpd-mpm.conf  //启用mpm的配置文件
//如果是使用--enable-mpms-shared=all安装了所有运行模式,确保prefork模式是启用状态,worker和event是注释状态
#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

  查看prefork的配置参数,根据需求修改

[root@youxi1 ~]# vim /usr/local/apache2.4.39/conf/extra/httpd-mpm.conf
<IfModule mpm_prefork_module>
StartServers 5  //启动Apache时创建的服务进程数量(子进程)
MinSpareServers 5  //最小空闲进程数
MaxSpareServers 10  //最大空闲进程数
MaxRequestWorkers 250  //最大并发数,这里指进程的总数
MaxConnectionsPerChild 0  //最大连接数量
</IfModule>
[root@youxi1 ~]# /etc/init.d/httpd graceful  //重新加载
[root@youxi1 ~]# /usr/local/apache2.4.39/bin/httpd -V
Server version: Apache/2.4.39 (Unix)
Server built: Aug 9 2019 09:20:58
Server's Module Magic Number: 20120211:84
Server loaded: APR 1.6.5, APR-UTIL 1.6.1
Compiled using: APR 1.6.5, APR-UTIL 1.6.1
Architecture: 64-bit
Server MPM: prefork  //当前运行状态
threaded: no
forked: yes (variable process count)
Server compiled with....
-D APR_HAS_SENDFILE
-D APR_HAS_MMAP
-D APR_HAVE_IPV6 (IPv4-mapped addresses enabled)
-D APR_USE_SYSVSEM_SERIALIZE
-D APR_USE_PTHREAD_SERIALIZE
-D SINGLE_LISTEN_UNSERIALIZED_ACCEPT
-D APR_HAS_OTHER_CHILD
-D AP_HAVE_RELIABLE_PIPED_LOGS
-D DYNAMIC_MODULE_LIMIT=256
-D HTTPD_ROOT="/usr/local/apache2.4.39"
-D SUEXEC_BIN="/usr/local/apache2.4.39/bin/suexec"
-D DEFAULT_PIDLOG="logs/httpd.pid"
-D DEFAULT_SCOREBOARD="logs/apache_runtime_status"
-D DEFAULT_ERRORLOG="logs/error_log"
-D AP_TYPES_CONFIG_FILE="conf/mime.types"
-D SERVER_CONFIG_FILE="conf/httpd.conf"
[root@youxi1 ~]# ps aux | grep httpd
root 34123 0.0 0.2 72808 2624 ? Ss 09:58 0:00 /usr/local/apache2.4.39/bin/httpd
daemon 34133 0.0 0.1 72808 1436 ? S 09:59 0:00 /usr/local/apache2.4.39/bin/httpd
daemon 34134 0.0 0.1 72808 1436 ? S 09:59 0:00 /usr/local/apache2.4.39/bin/httpd
daemon 34135 0.0 0.1 72808 1436 ? S 09:59 0:00 /usr/local/apache2.4.39/bin/httpd
daemon 34136 0.0 0.1 72808 1436 ? S 09:59 0:00 /usr/local/apache2.4.39/bin/httpd
daemon 34137 0.0 0.1 72808 1436 ? S 09:59 0:00 /usr/local/apache2.4.39/bin/httpd
root 34158 0.0 0.0 112724 988 pts/0 R+ 10:09 0:00 grep --color=auto httpd

配置参数详细说明:

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

  MaxSpareServers参数设置空闲子进程的最大数量。如果当前有超过MaxSpareServers数量的空闲子进程,那么父进程将杀死多余的子进程。

  可以调整MinSpareServers 和MaxSpareServers这两个参数,但是这两个参数的值不能设得太大,否则Apache进程太多,会导致内存占用太多。例如:在一台压力大(并发访问2000)的服务器上,MaxSpareServers这个值设置的是200。保留最大并发数的10分之一。设置了这个值的好处是不会有太多的空闲的进程在消耗资源,关闭空闲Apache进程的同时,会释放内存,进而减少系统资源消耗。

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

  MaxConnectionsPerChild参数设置进程生命周期内,处理的最大请求数目。达到该数目后,进程将死掉。如果设置为0,表示没有限制。该参数的意义在于,避免了可能存在的内存泄露带来的系统问题。将MaxRequestsPerChild设置成非零值有两个好处:可以防止(偶然的)内存泄漏无限进行,从而耗尽内存;给进程一个有限寿命,从而有助于当服务器负载减轻的时候减少活动进程的数量。注:当KeepAlive为On, 即开启长链接时,发送的请求在MaxRequestsPerChild里面只算一个,不管这个连接发送了多少个请求。

 2)worker

  查看是否启用MPM的配置文件

[root@youxi1 ~]# vim /usr/local/apache2.4.39/conf/httpd.conf
Include conf/extra/httpd-mpm.conf  //启用MPM的配置文件
//如果是使用--enable-mpms-shared=all安装了所有运行模式,确保worker模式是启用状态,prefork和event是注释状态
#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

  查看worker的配置参数,根据需求修改

[root@youxi1 ~]# vim /usr/local/apache2.4.39/conf/extra/httpd-mpm.conf
<IfModule mpm_worker_module>
StartServers 3  //启动时子进程数
MinSpareThreads 75  //最小空闲线程数
MaxSpareThreads 250  //最大空闲线程数
ThreadsPerChild 25  //每个进程可以启动的线程数
MaxRequestWorkers 400  //最大并发数,这里指线程的总数
MaxConnectionsPerChild 0  //最大连接数
</IfModule>
[root@youxi1 ~]# /etc/init.d/httpd graceful  //重新加载,有时候可能会关闭需要重新启动httpd
[root@youxi1 ~]# /usr/local/apache2.4.39/bin/httpd -V
Server version: Apache/2.4.39 (Unix)
Server built: Aug 9 2019 09:20:58
Server's Module Magic Number: 20120211:84
Server loaded: APR 1.6.5, APR-UTIL 1.6.1
Compiled using: APR 1.6.5, APR-UTIL 1.6.1
Architecture: 64-bit
Server MPM: worker  //当前运行状态
threaded: yes (fixed thread count)
forked: yes (variable process count)
Server compiled with....
-D APR_HAS_SENDFILE
-D APR_HAS_MMAP
-D APR_HAVE_IPV6 (IPv4-mapped addresses enabled)
-D APR_USE_SYSVSEM_SERIALIZE
-D APR_USE_PTHREAD_SERIALIZE
-D SINGLE_LISTEN_UNSERIALIZED_ACCEPT
-D APR_HAS_OTHER_CHILD
-D AP_HAVE_RELIABLE_PIPED_LOGS
-D DYNAMIC_MODULE_LIMIT=256
-D HTTPD_ROOT="/usr/local/apache2.4.39"
-D SUEXEC_BIN="/usr/local/apache2.4.39/bin/suexec"
-D DEFAULT_PIDLOG="logs/httpd.pid"
-D DEFAULT_SCOREBOARD="logs/apache_runtime_status"
-D DEFAULT_ERRORLOG="logs/error_log"
-D AP_TYPES_CONFIG_FILE="conf/mime.types"
-D SERVER_CONFIG_FILE="conf/httpd.conf"
[root@youxi1 ~]# ps aux | grep httpd
root 37283 0.0 0.2 73064 2392 ? Ss 11:18 0:00 /usr/local/apache2.4.39/bin/httpd -k restart
daemon 37284 0.0 0.4 362028 4200 ? Sl 11:18 0:00 /usr/local/apache2.4.39/bin/httpd -k restart
daemon 37285 0.0 0.4 362028 4200 ? Sl 11:18 0:00 /usr/local/apache2.4.39/bin/httpd -k restart
daemon 37286 0.0 0.4 362028 4200 ? Sl 11:18 0:00 /usr/local/apache2.4.39/bin/httpd -k restart
root 37369 0.0 0.0 112724 988 pts/0 R+ 11:19 0:00 grep --color=auto httpd

配置参数详细说明:

  StartServers参数设置启动时进程数。一般设同cpu核心数一样或是cpu核心数的2倍。

  MinSpareThreads参数设置基于整个服务器监视的最小空闲线程数,如果空闲的线程小于设定值,Apache会自动建立线程。假设一个网站每天正常被用户使用的时间为早上7:00到晚上2:00。那么MinSpareThreads应该配置为,这一时间段内最小并发访问量的3倍。比如7:00最少并发为25,那就配置成75。

  MaxSpareThreads参数设置基于整个服务器监视的最大空闲线程数,如果空闲的线程大于设定值,Apache会自动kill掉多余的线程。一般配置为一天中最大并发量的一半。如这台服务器能处理的最大并量为2500。那么此值应该为1250。因为内存闲着也是闲着,可以按linux下尽可能使用内存的原则,配置成1250.这样在突然到来更多访问量时,响应会更及时。

  ThreadsPerChild参数设置每个子进程包含的线程数,如果是并发量比较大,可以考虑加大这个值。此参数在worker模式中,是影响最大的参数。生产环境中,在带宽和硬盘性能充足的情况下,希望这个这台可以完成2000左右的并发。那么此值应该为:2000/ StartServers的值(我这里是16)=125 。但是一个进程不可能包括无数的线程,包括太多,会导致进程不稳定,容易崩溃。所以我们认为一个进程最多包括125线程就很好了。所以如果还想处理更多的请求,可以把StartServers的值增加,而不是增大ThreadsPerChild的值。 因为ThreadsPerChild值过大,会导致Apache运行不稳定。系统调优,稳定是一切的前提。

  MaxRequestWorkers参数设置所有线程数量的最大值,通常表示了一个web服务的最大并发值。MaxRequestWorkers必须是ThreadsPerChild的整数倍,否则Apache会提示调整到一个相近的值。一般设置时为MaxRequestWorkers=StartServers* ThreadsPerChild。

  MaxConnectionsPerChild参数设置每个子进程可以处理的最大请求数。达到该数目后,进程将死掉。如果设置为0,表示没有限制。MaxConnectionsPerChild/ThreadsPerChild的值作为一个判断标准。一个线程处理太多的请求,也会出现内存溢出,导致进程崩溃。

  A.一台服务器最大可以设置多少个子进程?

    首选进行压测,计算子进程的平均使用内存大小。

    其次服务器可以使用的内存大小(只考虑分布式)。一般来说,一台8G内存服务器,留2G内存给系统使用;一台16G内存服务器,留4G内存给系统使用;一台32G内存服务器,留8G给系统使用;一台64G内存服务器,留8G内存给系统使用。(最多8G就足够了)

    最后,(总内存-系统内存)/子进程的平均内存=最大可以设置的子进程。

  B.扩展:选择服务器时,CPU与内存的搭配比例

    通用型服务器选择标准:CPU与内存比例1:4;计算型服务器选择标准:CPU与内存比例1:2;内存型服务器选择标准:CPU与内存比例1:8。

 3)event

  查看是否启用MPM的配置文件

[root@youxi1 ~]# vim /usr/local/apache2.4.39/conf/httpd.conf
Include conf/extra/httpd-mpm.conf  //启用MPM的配置文件
//如果是使用--enable-mpms-shared=all安装了所有运行模式,确保event模式是启用状态,prefork和worker是注释状态
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

  查看worker的配置参数,根据需求修改

[root@youxi1 ~]# vim /usr/local/apache2.4.39/conf/extra/httpd-mpm.conf
<IfModule mpm_event_module>
StartServers 3  //启动时子进程数
MinSpareThreads 75  //最小空闲线程数
MaxSpareThreads 250  //最大空闲线程数
ThreadsPerChild 25  //每个进程可以启动的线程数
MaxRequestWorkers 400  //最大并发数,这里指线程的总数
MaxConnectionsPerChild 0  //最大连接数
</IfModule>
[root@youxi1 ~]# /etc/init.d/httpd graceful  //重新加载,有时候可能会关闭,需要重新启动htpd
[root@youxi1 ~]# /usr/local/apache2.4.39/bin/httpd -V
Server version: Apache/2.4.39 (Unix)
Server built: Aug 9 2019 09:20:58
Server's Module Magic Number: 20120211:84
Server loaded: APR 1.6.5, APR-UTIL 1.6.1
Compiled using: APR 1.6.5, APR-UTIL 1.6.1
Architecture: 64-bit
Server MPM: event  //当前运行状态
threaded: yes (fixed thread count)
forked: yes (variable process count)
Server compiled with....
-D APR_HAS_SENDFILE
-D APR_HAS_MMAP
-D APR_HAVE_IPV6 (IPv4-mapped addresses enabled)
-D APR_USE_SYSVSEM_SERIALIZE
-D APR_USE_PTHREAD_SERIALIZE
-D SINGLE_LISTEN_UNSERIALIZED_ACCEPT
-D APR_HAS_OTHER_CHILD
-D AP_HAVE_RELIABLE_PIPED_LOGS
-D DYNAMIC_MODULE_LIMIT=256
-D HTTPD_ROOT="/usr/local/apache2.4.39"
-D SUEXEC_BIN="/usr/local/apache2.4.39/bin/suexec"
-D DEFAULT_PIDLOG="logs/httpd.pid"
-D DEFAULT_SCOREBOARD="logs/apache_runtime_status"
-D DEFAULT_ERRORLOG="logs/error_log"
-D AP_TYPES_CONFIG_FILE="conf/mime.types"
-D SERVER_CONFIG_FILE="conf/httpd.conf"
[root@youxi1 ~]# ps aux | grep httpd
root 39648 0.0 0.2 73080 2400 ? Ss 14:54 0:00 /usr/local/apache2.4.39/bin/httpd -k graceful
daemon 39649 0.0 0.4 362044 4212 ? Sl 14:54 0:00 /usr/local/apache2.4.39/bin/httpd -k graceful
daemon 39650 0.0 0.4 362044 4212 ? Sl 14:54 0:00 /usr/local/apache2.4.39/bin/httpd -k graceful
daemon 39651 0.0 0.4 362044 4212 ? Sl 14:54 0:00 /usr/local/apache2.4.39/bin/httpd -k graceful
root 39734 0.0 0.0 112724 992 pts/0 R+ 14:55 0:00 grep --color=auto httpd

  event模式调优和worker模式一样的,不同的是在于它解决了keep-alive长连接的时候占用线程资源被浪费的问题。所以理伦上event模式比worker模式好。

 4)总结

  生产环境下对于要求更高伸缩性的站点可以选择使用worker 或 event模式; 需要可靠性或者与旧软件兼容的站点可以使用 prefork模式。现在网站使用worker模式比较多。worker也比较成熟。event模式从Apache2.4版本才开始有。

(3).Rewirte规则使用

  Rewirte主要的功能就是实现URL的跳转,它的正则表达式是基于Perl语言。可基于服务器级的(httpd.conf)和目录级的 (.htaccess)两种方式。如果要想用到rewrite模块,必须先安装或加载rewrite模块。而基于服务器级的方式又分为全局和局部,都是利用RewriteEngine on来打开rewrite功能,配合一些其他的rewrite参数具体设置。

  使用命令查看是否安装了rewrite模块,如果返回rewrite_module(static)则是编译安装时一起安装的,如果返回rewrite_module(shared)则是DSO方式安装的(编译时使用--enable-rewrite也是这个,估计我的判断标准有问题)。

[root@youxi1 ~]# /usr/local/apache2.4.39/bin/apachectl -M | grep rewrite
[root@youxi1 ~]# ls /usr/local/apache2.4.39/modules/mod_rewrite.so
/usr/local/apache2.4.39/modules/mod_rewrite.so  //说明存在,但没有启用

  安装Rewirte模块两种方式:1.编译Apache时使用了--enable-rewrite;2.在安装完成后使用Apache主目录下的bin/apxs扩展工具编译并增加。

 1)rewrite规则重写的标志参数说明(最后的中括号内的参数)

  R[=code](force redirect) 强制外部重定向。强制在替代字符串加上http://thishost[:thisport]/前缀重定向到外部的URL.如果code不指定,将用缺省的302 HTTP状态码。

  F(force URL to be forbidden)禁用URL,返回403HTTP状态码。

  G(force URL to be gone) 强制URL为GONE,返回410HTTP状态码。

  P(force proxy) 强制使用代理转发。

  L(last rule) 表明当前规则是最后一条规则,停止分析以后规则的重写。

  N(next round) 重新从第一条规则开始运行重写过程。

  C(chained with next rule) 与下一条规则关联。如果规则匹配则正常处理,该标志无效,如果不匹配,那么下面所有关联的规则都跳过。

  T=MIME-type(force MIME type) 强制MIME类型。

  NS (used only if no internal sub-request) 只用于不是内部子请求。

  NC(no case) 不区分大小写

  QSA(query string append) 追加请求字符串。

  NE(no URI escaping of output) 不在输出转义特殊字符。例如:RewriteRule /foo/(.*) /bar?arg=P1\%3d$1 [R,NE] 将能正确的将/foo/zoo转换成/bar?arg=P1=zed

  PT(pass through to next handler) 传递给下一个处理。

  S=num(skip next rule(s)) 跳过num条规则。

  E=VAR:VAL(set environment variable) 设置环境变量。

 2)使用apxs扩展工具安装rewrite模块

[root@youxi1 ~]# ls /usr/local/src/httpd-2.4.39/modules/mappers/mod_rewrite.*
/usr/local/src/httpd-2.4.39/modules/mappers/mod_rewrite.c
/usr/local/src/httpd-2.4.39/modules/mappers/mod_rewrite.dep
/usr/local/src/httpd-2.4.39/modules/mappers/mod_rewrite.dsp
/usr/local/src/httpd-2.4.39/modules/mappers/mod_rewrite.exp
/usr/local/src/httpd-2.4.39/modules/mappers/mod_rewrite.h
/usr/local/src/httpd-2.4.39/modules/mappers/mod_rewrite.la
/usr/local/src/httpd-2.4.39/modules/mappers/mod_rewrite.lo
/usr/local/src/httpd-2.4.39/modules/mappers/mod_rewrite.mak
/usr/local/src/httpd-2.4.39/modules/mappers/mod_rewrite.o
/usr/local/src/httpd-2.4.39/modules/mappers/mod_rewrite.slo
[root@youxi1 ~]# /usr/local/apache2.4.39/bin/apxs -cia /usr/local/src/httpd-2.4.39/modules/mappers/mod_rewrite.c
[root@youxi1 ~]# echo $?
0
[root@youxi1 ~]# ls /usr/local/apache2.4.39/modules/mod_rewrite.so
/usr/local/apache2.4.39/modules/mod_rewrite.so
[root@youxi1 ~]# vim /usr/local/apache2.4.39/conf/httpd.conf
LoadModule rewrite_module modules/mod_rewrite.so  //确保启用
[root@youxi1 ~]# /usr/local/apache2.4.39/bin/apachectl -M | grep rewrite
rewrite_module (shared)  //这个就是已经安装成功了

 3)重写实例

[root@youxi1 ~]# vim /usr/local/apache2.4.39/conf/httpd.conf
LoadModule rewrite_module modules/mod_rewrite.so  //启用rewrite模块
//也可以使用<IfModule rewrite_module></IfModule>将以下内容包裹
RewriteEngine on  //打开rewrite重写功能
RewriteCond %{HTTP_HOST} !^www.youxi1.com [NC]
RewriteCond %{HTTP_HOST} !^192.168.1.6 [NC]
RewriteCond %{HTTP_HOST} !^$
RewriteRule ^/(.*) http://www.youxi1.com/$1 [L]
[root@youxi1 ~]# /etc/init.d/httpd graceful  //重新加载

配置说明:

  RewriteCond %{HTTP_HOST} !^www.you.com [NC]表示当客户端请求的主机前缀不是www.you.com时,[NC]表示忽略大小写

  RewriteCond %{HTTP_HOST} !^192.168.1.6 [NC]表示当客户端请求的主机前缀不是192.168.1.6时,[NC]表示忽略大小写

  RewriteCond %{HTTP_HOST} !^$表示当客户端请求的主机不为空时。

  RewriteRule ^/(.*) http://www.you.com/$1 [L]表示如果客户端请求的主机中的前缀符合上述条件(这里匹配的条件是)则直接进行跳转到http://www.you.com,[L]表示立即停止重写操作并不再应用其他重写规则。这里的.表示换行符意外的所有字符,*表示匹配0次或更多次,合起来的.*就是匹配换行符以外的所有字符。小括号()的功能是把内部的所有字符做一个标记,以便后面引用。这里的$1就是调用(.*)。

  官方文档地址:http://httpd.apache.org/docs/current/mod/mod_rewrite.html#rewritecond

  做一个测试界面

[root@youxi1 ~]# echo www.youxi1.com > /usr/local/apache2.4.39/htdocs/test.html

  然后Windows下修改hosts文件,添加如下两行

192.168.1.6 bbs.xi1.cn
192.168.1.6 www.youxi1.com

  之后使用浏览器查看

----------->

----------->

 4)防盗链

  一些小网站为了盈利,通过盗链来实现对自己网站内容的丰富,这无疑加大了企业的空间和流量的成本,因此我们需要对Apache进行防盗链的配置。

[root@youxi1 ~]# vim /usr/local/apache2.4.39/conf/httpd.conf
<IfModule rewrite_module>
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]
</IFModule>
[root@youxi1 ~]# /etc/init.d/httpd graceful  //重新加载

  HTTP_REFERER是header的一部分,当浏览器向Web服务器发送请求时,会带上Referer来告诉服务器该网页从哪个链接过来的。

(4).禁止浏览目录

  由于开启目录浏览会让我们整个目录下的内容全部都暴露到外面,因此我们必须要禁止目录浏览功能。当然一些目录开放给客户做下载的,可以忽略此项优化。

  做一个测试环境

[root@youxi1 ~]# mkdir /usr/local/apache2.4.39/htdocs/testdir
[root@youxi1 ~]# touch /usr/local/apache2.4.39/htdocs/testdir/file{1,2,3}

  修改配置文件禁止访问目录

[root@youxi1 ~]# vim /usr/local/apache2.4.39/conf/httpd.conf
<Directory "/usr/local/apache2.4.39/htdocs">
...
Options FollowSymLinks  //修改,原本是Options Indexes FollowSymLinks
...
</Directory>
[root@youxi1 ~]# /etc/init.d/httpd graceful  //重新加载

  再次查看

(5).禁止php文件被解析

  企业的站点有时会提供用户进行上传操作,比如让用户上传一个文件或头像图片,而用户上传文件的存放目录,我们是不能给php的解析权限的,否则会对Apache服务和系统造成危害。

  设置主目录下的htdocs/data目录里的php结尾的文件不运行。

[root@youxi1 ~]# vim /usr/local/apache2.4.39/conf/httpd.conf
//加到已有的<Directory></Directory>标签对下面
<Directory "/usr/local/apache2.4.39/htdocs/data" >
<Files ~ ".php">  //以.php结尾的文件
Order allow,deny
Deny from all
</Files>
</Directory>
[root@youxi1 ~]# /etc/init.d/httpd restart

  然后创建测试页面

[root@youxi1 ~]# mkdir /usr/local/apache2.4.39/htdocs/data
[root@youxi1 ~]# vim /usr/local/apache2.4.39/htdocs/data/index.php
<?php
phpinfo();
?>

  然后使用浏览器访问

(6).使用CDN做网络加速

  简单地说,就是通过在现有的Internet中增加一层新的网络架构,将网站的内容发布到最接近用户的缓存服务器内。通过DNS负载均衡的技术,判断用户来源就近访问cache服务器取得所需的内容,杭州的用户访问接近杭州服务器上的内容,北京访问接近北京服务器上的内容。这样可以有效减少数据在网络上传输的事件,提高速度。把静态内容发布到CDN减少了用户的响应时间20%或更多。

  国内有名的CND公司:网宿,蓝汛(chinacache),快网

(7).Apache网站架构优化

  好的网站架构是网站性能强大关键,更是网站安全的关键。在生产环境中建议将程序页面服务器、图片附件服务器和上传服务器三者的功能尽量分离。

  分离方法:1、分离最佳方式是分别使用独立的服务器(需要程序支持);2、次选方案在前端负载均衡器通过haproxy/nginx来根据用户请求的目录或扩展名来对后端的服务器发出请求。

  例如:请求http://www.xxxxxx.cn/a/b.jpg就抛给图片服务器(CDN最好),这里是根据扩展名.jpg分发

     请求http:// /www.xxxxxx.cn /upload/login.php就抛给Apache服务器,这里是根据URL路径分发。

     均不符合上面两个要求的,默认就都是抛给主web服务器。

Apache调优(二)的更多相关文章

  1. 第三篇、调优之路 Apache调优

    1.  简介 在第一篇中整合了apache + tomcat ,利用了apache解析静态文件为tomcat解压.但是在测试机上发现两者性能不足,不能充分利用服务器的性能,该篇中将对apache进行性 ...

  2. LAMP之Apache调优

    一.环境的搭建 实验环境: 操作系统:Centos 7.4 [root@xuegod70 ~]# ls apr-1.6.3.tar.gz apr-util-1.6.1.tar.bz2 httpd-2. ...

  3. Apache调优

    1.调整文件描述符大小,默认Linux系统的文件描述符是1024,对于squid等一些服务来说                在高负载的情况下这些文件描述符是远远不够的,所以在部署该类服务器时修改文件 ...

  4. 【机器学习基础】SVM实现分类识别及参数调优(二)

    前言 实现分类可以使用SVM方法,但是需要人工调参,具体过程请参考here,这个比较麻烦,小鹅不喜欢麻烦,正好看到SVM可以自动调优,甚好! 注意 1.reshape的使用: https://docs ...

  5. [Apache]网站页面静态化与Apache调优(图)

    ---------------------------------------------------------------------------------------------------- ...

  6. Apache调优(一)

    (1).Apache和Tomcat的关系 Apache HTTPD Server与Apache Tomcat同属于Apache的开源项目.两个都可以单独作为web server使用,但是又都有各自的特 ...

  7. apache调优技巧之一隐藏apahce版本信息

    如果你的服务器版本信息是这样的,是很 危险的. [root@xinsz63 httpd-2.2.27]# curl -I 192.168.1.38 HTTP/1.1 403 Forbidden Dat ...

  8. JVM基础和调优(二)

    主要讲述java虚拟机的内存体系结构 了解了JVM 的一些基础之后,我们来看看java虚拟机内存的体系结构,这个是理解JVM垃圾收集算法的前提,理解了内存结构我们才能够针对不同的部分根据我们的程序进行 ...

  9. 【转】tomcat性能调优

    一.总结前一天的学习 从"第三天"的性能测试一节中,我们得知了决定性能测试的几个重要指标,它们是: ü   吞吐量 ü   Responsetime ü   Cpuload ü   ...

随机推荐

  1. 《转》BAT批处理教程

    第一章 批处理基础第一节 常用批处理内部命令简介 批处理定义:顾名思义,批处理文件是将一系列命令按一定的顺序集合为一个可执行的文本文件,其扩展名为BAT或者CMD.这些命令统称批处理命令.小知识:可以 ...

  2. 单片机开发之C语言编程基本规范

    为了提高源程序的质量和可维护性,从而最终提高软件产品生产力,特编写此规范.本标准规定了程序设计人员进行程序设计时必须遵循的规范.本规范主要针对单片机编程语言和08编译器而言,包括排版.注释.命名.变量 ...

  3. zmq使用记录

    zmq套接字介绍 https://www.cnblogs.com/fengbohello/p/4354989.html zmq示例 https://github.com/booksbyus/zguid ...

  4. HttpMessageConverter(消息转换器 )和@responsebody使用(转)

    @responsebody表示该方法的返回结果直接写入HTTP response body中 一般在异步获取数据时使用,在使用@RequestMapping后,返回值通常解析为跳转路径,加上@resp ...

  5. 使用notepad++/excle快速将cvs文件转换为insert语句技巧以及注意点

    使用notepad++/excle快速将cvs文件转换为insert语句技巧以及注意点 业务场景 最近nc项目经理从第三方弄来了一个300w行的csv文件,让导入数据库做处理,出现了下列问题: csv ...

  6. React vs Angular vs Vue 2019

    React vs Angular vs Vue 看待这三个主流框架给出的想法 Angular is the entire kitchen that gives you all the tools ne ...

  7. Hive 模式设计

    Hive看上去很像关系型数据库.不过,Hive实现和使用的方式和传统的关系型数据库非常不同.Hive是反模式的. 本文将重点介绍Hive中哪些模式是用户应该使用的,儿哪些是应该避免的 一.按天划分的表 ...

  8. loj #6191. 「美团 CodeM 复赛」配对游戏 期望dp

    题意:有一个栈,随机插入 $n$ 次 $0$/$1$ 如果栈顶是 $1$,然后插入 $0$,则将这两个元素都弹出,否则,插入栈顶. 求:$n$ 次操作后栈中期望的元素个数. 我们发现,按照上述弹栈方式 ...

  9. Python学习之--字典

    一.字典的表示 字典用放在花括号{} 中的一系列键—值对表示,键—值对是两个相关联的值:键和值之间用冒号分隔,如circle = {'color':'green', 'points':5} 二.取值 ...

  10. noi.ac #39 MST

    MST 模板题 #include <iostream> #include <cstdio> #include <algorithm> #include <cm ...