User Tools

Site Tools


apache:architecture

Apache Architecture

MPM Prefork Architecture

Basic configuration:

  • StartServers: number of server processes to start
  • MinSpareServers: minimum number of server processes which are kept spare
  • MaxSpareServers: maximum number of server processes which are kept spare
  • MaxClients: maximum number of server processes allowed to start ⇒ Limist number of httpd created and processing the request. For example: MaxClients 10, And clients send 100 concurrency requests to server, The server only create max 10 server process httpd for processing, and 99 remain requests will waiting in the queues

Config example:

<IfModule mpm_prefork_module>
    StartServers          6
    MinSpareServers       6
    MaxSpareServers      12
    MaxClients          12
    MaxRequestsPerChild   0
</IfModule>

check config:

  • check number of httpd process with none client request:
    ps -eaf | grep httpd

    output:

    root      1629     1  0 20:56 ?        00:00:00 /usr/local/apache/bin/httpd
    apache    1631  1629  0 20:56 ?        00:00:00 /usr/local/apache/bin/httpd
    apache    1632  1629  0 20:56 ?        00:00:00 /usr/local/apache/bin/httpd
    apache    1633  1629  0 20:56 ?        00:00:00 /usr/local/apache/bin/httpd
    apache    1634  1629  0 20:56 ?        00:00:00 /usr/local/apache/bin/httpd
    apache    1635  1629  0 20:56 ?        00:00:00 /usr/local/apache/bin/httpd
    apache    1636  1629  0 20:56 ?        00:00:00 /usr/local/apache/bin/httpd

    ⇒ 7 processes = MinSpareServers + 1

  • run load test with 20 concurrecy requests to server:
    ab -n 200 -c 20 http://shop.babies.vn/

    And check number of httpd processes:

    ps -eaf | grep httpd
    root      1013     1  0 19:50 ?        00:00:00 /usr/local/apache/bin/httpd
    apache    1144  1013  0 20:10 ?        00:00:09 /usr/local/apache/bin/httpd
    apache    1210  1013  1 20:29 ?        00:00:05 /usr/local/apache/bin/httpd
    apache    1216  1013  2 20:30 ?        00:00:05 /usr/local/apache/bin/httpd
    apache    1219  1013  2 20:30 ?        00:00:06 /usr/local/apache/bin/httpd
    apache    1220  1013  2 20:30 ?        00:00:05 /usr/local/apache/bin/httpd
    apache    1226  1013  8 20:33 ?        00:00:06 /usr/local/apache/bin/httpd
    apache    1227  1013  8 20:33 ?        00:00:06 /usr/local/apache/bin/httpd
    apache    1228  1013  8 20:33 ?        00:00:06 /usr/local/apache/bin/httpd
    apache    1229  1013  7 20:33 ?        00:00:05 /usr/local/apache/bin/httpd
    apache    1230  1013  6 20:33 ?        00:00:04 /usr/local/apache/bin/httpd
    apache    1231  1013  8 20:33 ?        00:00:05 /usr/local/apache/bin/httpd
    apache    1288  1013  8 20:34 ?        00:00:03 /usr/local/apache/bin/httpd

    ⇒ max httpd processes = 13 = maxClients + 1

MPM worker Architecture

  • StartServers: initial number of server processes to start
  • MinSpareThreads: minimum number of worker threads which are kept spare
  • MaxSpareThreads: maximum number of worker threads which are kept spare
  • ThreadsPerChild: constant number of worker threads in each server process

Debug architecture of apache

Get current MPM is running: MPM Prefork or MPM worker

apachectl -V
Server version: Apache/2.2.15 (Unix)
Server built:   Apr  3 2014 23:56:16
Server's Module Magic Number: 20051115:25
Server loaded:  APR 1.3.9, APR-Util 1.3.9
Compiled using: APR 1.3.9, APR-Util 1.3.9
Architecture:   64-bit
Server MPM:     Prefork
  threaded:     no
    forked:     yes (variable process count)
Server compiled with....
 -D APACHE_MPM_DIR="server/mpm/prefork"
...........................

compiled modules in MPM Prefork(httpd) and MPM worker(httpd.worker)

  • httpd -V
    Server version: Apache/2.2.15 (Unix)
    Server built:   Apr  3 2014 23:56:16
    Server's Module Magic Number: 20051115:25
    Server loaded:  APR 1.3.9, APR-Util 1.3.9
    Compiled using: APR 1.3.9, APR-Util 1.3.9
    Architecture:   64-bit
    Server MPM:     Prefork
      threaded:     no
        forked:     yes (variable process count)
    Server compiled with....
     -D APACHE_MPM_DIR="server/mpm/prefork"
     -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=128
     -D HTTPD_ROOT="/etc/httpd"
     -D SUEXEC_BIN="/usr/sbin/suexec"
     -D DEFAULT_PIDLOG="run/httpd.pid"
     -D DEFAULT_SCOREBOARD="logs/apache_runtime_status"
     -D DEFAULT_LOCKFILE="logs/accept.lock"
     -D DEFAULT_ERRORLOG="logs/error_log"
     -D AP_TYPES_CONFIG_FILE="conf/mime.types"
     -D SERVER_CONFIG_FILE="conf/httpd.conf"
  • httpd.worker -V
    Server version: Apache/2.2.15 (Unix)
    Server built:   Apr  3 2014 23:56:59
    Server's Module Magic Number: 20051115:25
    Server loaded:  APR 1.3.9, APR-Util 1.3.9
    Compiled using: APR 1.3.9, APR-Util 1.3.9
    Architecture:   64-bit
    Server MPM:     Worker
      threaded:     yes (fixed thread count)
        forked:     yes (variable process count)
    Server compiled with....
     -D APACHE_MPM_DIR="server/mpm/worker"
     -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=128
     -D HTTPD_ROOT="/etc/httpd"
     -D SUEXEC_BIN="/usr/sbin/suexec"
     -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"
  • Difference between “httpd -V” and “httpd.worker -V”
    • httpd -V
      Server MPM:     Prefork
        threaded:     no
          forked:     yes (variable process count)
      Server compiled with....
       -D APACHE_MPM_DIR="server/mpm/prefork"
          
    • httpd.worker -V
      Server MPM:     Worker
        threaded:     yes (fixed thread count)
          forked:     yes (variable process count)
      Server compiled with....
       -D APACHE_MPM_DIR="server/mpm/worker"
          
  • httpd -l
    Compiled in modules:
      core.c
      prefork.c
      http_core.c
      mod_so.c
  • httpd.worker -l
    Compiled in modules:
      core.c
      worker.c
      http_core.c
      mod_so.c

Debug processes and used memory, cpu

  • netstat -anp | grep 80 | grep LISTEN
    tcp        0      0 :::80                       :::*                        LISTEN      5141/httpd
    => http listen on port 80 with PID(ProcessID) 5141
  • ps -eaf | grep 5141
    ps -eaf | grep 5141
    UID        PID  PPID  C STIME TTY      TIME      CMD
    root      5141     1  0 15:38 ?        00:00:00 /usr/sbin/httpd
    apache    5176  5141  0 15:40 ?        00:00:01 /usr/sbin/httpd
    apache    5196  5141  0 15:42 ?        00:00:02 /usr/sbin/httpd
    apache    5353  5141  0 15:58 ?        00:00:00 /usr/sbin/httpd
    apache    5358  5141  0 15:58 ?        00:00:00 /usr/sbin/httpd
    apache    5360  5141  0 15:59 ?        00:00:00 /usr/sbin/httpd

    ⇒ PPID(Parent PID). the master process is 5141, and sub processes are 5176, 5196, 5353, 5358, 5360 with CMD is /usr/sbin/httpd

  • ps -aux | grep /usr/sbin/httpd
    ps -aux | grep /usr/sbin/httpd
    USER      PID  %CPU  %MEM  VSZ   RSS TTY  STAT START   TIME COMMAND
    root      5141  0.0  1.9 254904  9920 ?   Ss   15:38   0:00 /usr/sbin/httpd
    apache    5176  0.1  9.0 290320 45340 ?   S    15:40   0:01 /usr/sbin/httpd
    apache    5196  0.1  9.3 291896 46956 ?   S    15:42   0:02 /usr/sbin/httpd
    apache    5353  0.1  6.8 279708 34160 ?   S    15:58   0:00 /usr/sbin/httpd
    apache    5358  0.0  3.3 263124 16592 ?   S    15:58   0:00 /usr/sbin/httpd
    apache    5360  0.1  7.6 283964 38312 ?   S    15:59   0:00 /usr/sbin/httpd

    With VSZ is Virtual Memory Size(address space allocated) , and RSS is Resident Set Size (physically resident memory)

  • pmap -x 6726 | sort -nk +2
    pmap -x 6812 | sort -nk +2
    00007fcacac95000    2048       0       0 -----  mod_mime_magic.so
    00007fcacb4a8000    2048       0       0 -----  mod_log_config.so
    00007fcacc0c1000    2048       0       0 -----  mod_authz_user.so
    00007fcacccd7000    2048       0       0 -----  mod_auth_digest.so
    00007fcacd559000    2048       0       0 -----  libdl-2.12.so
    00007fcacdb06000    2048       0       0 -----  libpthread-2.12.so
    00007fcace4db000    2048       0       0 -----  libcrypt-2.12.so
    00007fcad1562000    2384    2356    2356 rw---    [ anon ]
    00007fcac723b000    3268    1672       0 r-x--  libphp5.so
    00007fcad17b6000   47848   47488   47488 rw---    [ anon ]

Optimize apache and PHP config

optimize load module apache

Config Optimize load modules for httpd with Explain directives with these modules:

LoadModule authz_host_module modules/mod_authz_host.so#Order
LoadModule access_compat_module modules/mod_access_compat.so#Require
LoadModule log_config_module modules/mod_log_config.so#LogFormat,TransferLog
LoadModule expires_module modules/mod_expires.so
LoadModule deflate_module modules/mod_deflate.so
LoadModule headers_module modules/mod_headers.so
LoadModule env_module modules/mod_env.so
LoadModule setenvif_module modules/mod_setenvif.so#BrowserMatch
LoadModule mime_module modules/mod_mime.so#AddHandler
LoadModule autoindex_module modules/mod_autoindex.so#IndexOptions
LoadModule negotiation_module modules/mod_negotiation.so#LanguagePriority
LoadModule dir_module modules/mod_dir.so#DirectoryIndex
LoadModule alias_module modules/mod_alias.so#Alias
LoadModule rewrite_module modules/mod_rewrite.so

optimize load module php

Custom Config for Apache

Config disable warning log from browser

With this config, the log will display in PHP error log but they don't display in browser side\
Update httpd.conf

<IfModule mod_php5.c>
    php_admin_flag display_errors off
</IfModule>
apache/architecture.txt · Last modified: 2017/01/12 09:12 (external edit)