Differences

This shows you the differences between two versions of the page.

Link to this comparison view

en:ressources:dossiers:apache:build_install [2011/03/16 00:30] (current)
Line 1: Line 1:
 +====== Build and Install Apache 2.2.14 with MPM-EVENT on Debian Lenny ======
 +
 +{{tag>​apache debian http tuning}}
 +
 +
 +In this article we will discuss the building and installation of the last version of Apache in date (10/​05/​2009) on a Debian System.
 +I started this serie because I wanted to try the new mpm engine implemented by the Apache foundation in its httpd server: [[http://​httpd.apache.org/​docs/​2.2/​mod/​event.html|mpm-event]]
 +
 +First, get the last version of the httpd server from the [[http://​httpd.apache.org/​download.cgi|official page]] and untar the source code in a specific repository.
 +
 +===== Build it =====
 +
 +
 +Then, make sure you have the classic building packages like //gcc// or //make// and also some specific ones like **libssl-dev**.
 +
 +The configure command I used is as follow. ​
 +
 +<​code>​
 +CFLAGS="​-O3 -falign-functions=4 -falign-jumps -falign-loops"​ \
 +./configure --prefix=**/​targetfolder/​apache-httpd-2.2.14/​** \
 +--with-included-apr --enable-non-portable-atomics=yes **--with-mpm=event** \
 +--enable-mods-shared="​auth-dbm auth-digest cache disk-cache file-cache \
 +mem-cache headers info logio deflate expires proxy proxy-ajp proxy-http \
 +proxy-balancer ssl mime-magic"​
 +</​code>​
 +
 +Then follow the regular **make** and **make install** commands.
 +Everything can be run as user, as long as your **targetfolder** is accessible to the user.
 +
 +===== Basic configuration =====
 +
 +The content of the targetfolder is pretty easy to understand :
 +
 +<​file>​
 +$ ls -l
 +total 60
 +drwxr-xr-x ​ 2 julien julien ​ 4096 oct  6 17:29 bin
 +drwxr-xr-x ​ 2 julien julien ​ 4096 oct  6 17:29 build
 +drwxr-xr-x ​ 2 julien julien ​ 4096 oct  6 17:29 cgi-bin
 +drwxr-xr-x ​ 4 julien julien ​ 4096 oct  6 17:34 conf
 +drwxr-xr-x ​ 3 julien julien ​ 4096 oct  6 17:29 error
 +drwxr-xr-x ​ 2 julien julien ​ 4096 sep 24 01:28 htdocs
 +drwxr-xr-x ​ 3 julien julien ​ 4096 oct  6 17:29 icons
 +drwxr-xr-x ​ 2 julien julien ​ 4096 oct  6 17:29 include
 +drwxr-xr-x ​ 3 julien julien ​ 4096 oct  6 17:28 lib
 +drwxr-xr-x ​ 2 julien julien ​ 4096 oct  6 17:34 logs
 +drwxr-xr-x ​ 4 julien julien ​ 4096 oct  6 17:29 man
 +drwxr-xr-x 14 julien julien 12288 sep 24 01:29 manual
 +drwxr-xr-x ​ 2 julien julien ​ 4096 oct  6 17:29 modules
 +</​file>​
 +
 +Let's edit **conf/​httpd.conf** and change the Listen directive to another port than **80** (since this one is already in use on the system, by another Apache instance.
 +
 +<​code>​
 +$vim conf/​httpd.conf
 +[...]
 +Listen 12345
 +</​code>​
 +
 +Also, edit the **LoadModule** list to comment everything. We don't need same and they will add some unwanted memory usage.
 +
 +<​file>​
 + 54 #LoadModule auth_digest_module modules/​mod_auth_digest.so
 + 55 #LoadModule file_cache_module modules/​mod_file_cache.so
 + 56 #LoadModule cache_module modules/​mod_cache.so
 + 57 #LoadModule disk_cache_module modules/​mod_disk_cache.so
 + 58 #LoadModule mem_cache_module modules/​mod_mem_cache.so
 + 59 #LoadModule deflate_module modules/​mod_deflate.so
 + 60 #LoadModule logio_module modules/​mod_logio.so
 + 61 #LoadModule mime_magic_module modules/​mod_mime_magic.so
 + 62 #LoadModule expires_module modules/​mod_expires.so
 + 63 #LoadModule headers_module modules/​mod_headers.so
 + 64 #LoadModule proxy_module modules/​mod_proxy.so
 + 65 #LoadModule proxy_connect_module modules/​mod_proxy_connect.so
 + 66 #LoadModule proxy_ftp_module modules/​mod_proxy_ftp.so
 + 67 #LoadModule proxy_http_module modules/​mod_proxy_http.so
 + 68 #LoadModule proxy_scgi_module modules/​mod_proxy_scgi.so
 + 69 #LoadModule proxy_ajp_module modules/​mod_proxy_ajp.so
 + 70 #LoadModule proxy_balancer_module modules/​mod_proxy_balancer.so
 + 71 #LoadModule ssl_module modules/​mod_ssl.so
 + 72 #LoadModule info_module modules/​mod_info.so
 +</​file>​
 +
 +
 +Start the instance :
 +
 +<​code>​
 +$ bin/​apachectl graceful
 +</​code>​
 +
 +Try to connect:
 +<​code>​
 +$ nc localhost 12345
 +GET /index.html HTTP/1.0
 +
 +HTTP/1.1 200 OK
 +Date: Tue, 06 Oct 2009 15:47:54 GMT
 +Server: Apache/​2.2.14 (Unix) mod_ssl/​2.2.14 OpenSSL/​0.9.8g
 +Last-Modified:​ Sat, 20 Nov 2004 20:16:24 GMT
 +ETag: "​9803b-2c-3e9564c23b600"​
 +Accept-Ranges:​ bytes
 +Content-Length:​ 44
 +Connection: close
 +Content-Type:​ text/html
 +
 +
 +<​html><​body><​h1>​It works!</​h1></​body></​html>​
 +</​code>​
 +
 +Good, it's working fine.
 +
 +
 +==== MPM conf ====
 +
 +To change the settings of the mpm engine, we need to edit **httpd.conf** and include the mpm configuration file.
 +Go to **conf/​httpd.conf** and uncomment the following line:
 +
 +<​file>​
 +388 # Server-pool management (MPM specific)
 +389 Include conf/​extra/​httpd-mpm.conf
 +</​file>​
 +
 +Then, go to **conf/​extra/​httpd-mpm.conf** and add an entry for the mpm engine. This entry is not present by default, you need to add it manually.
 +
 +I personnally commented out all of the other engine (except the ones with a "​!"​) and added the following:
 +
 +<​file>​
 + 60 <​IfModule mpm_event_module> ​       ​
 + ​61 ​    ​StartServers ​        1
 + ​62 ​    ​ServerLimit ​         1
 + ​63 ​    ​MaxClients ​          50
 + ​64 ​    ​MinSpareThreads ​      1
 + ​65 ​    ​MaxSpareThreads ​     10
 + ​66 ​    ​ThreadsPerChild ​     50
 + ​67 ​    ​MaxRequestsPerChild ​  0
 + 68 </​IfModule>​
 +</​file>​
 +
 +Ok, don't jump yet, this is just some extreme setting to study the behavior of apache when just one process is handling all the requests.
 +We define up to 50 clients, and thus need 50 threads in the main process to handle them. //(note for later: with epoll, do we still need one thread per client? I need to clarify this...)//
 +
 +==== Benchmark ====
 +
 +
 +OK, server is on and listening. We will now launch some basic benchmark to see how it reacts out of the box:
 +
 +<​code>​
 +$ /​home/​julien/​inject29 -u 10 -H "Host: localhost"​ -G "​localhost:​12345/" ​                     ​
 +
 +   hits ^hits hits/​s ​ ^h/s     ​bytes ​ kB/s  last  errs  tout htime  sdht ptime
 +   ​4048 ​ 4048   ​4658 ​ 4658   ​1190112 ​ 1369  1369     ​0 ​    0 9.9 1.9 9.9
 +   ​8240 ​ 4192   ​4115 ​ 3699   ​2422560 ​ 1210  1087     ​0 ​    0 12.2 1.0 12.2
 +  11968  3728   ​3988 ​ 3728   ​3518592 ​ 1172  1096     ​0 ​    0 12.2 1.0 12.2
 +  15760  3792   ​3935 ​ 3780   ​4633440 ​ 1156  1111     ​0 ​    0 12.0 1.2 12.0
 +  19520  3760   ​3896 ​ 3748   ​5738880 ​ 1145  1102     ​0 ​    0 12.1 1.1 12.1
 +  23248  3728   ​3869 ​ 3728   ​6834912 ​ 1137  1096     ​0 ​    0 12.2 1.0 12.2
 +  27008  3760   ​3854 ​ 3763   ​7940352 ​ 1133  1106     ​0 ​    0 12.1 1.1 12.1
 +
 +[.... snip .... ]
 +
 +Fin.                      ​
 +Clients : 24063            ​
 +Hits    : 1924624 + 0 abortés
 +Octets ​ : 565839456 ​           ​
 +Duree   : 522327ms ​          
 +Debit   : 1083kB/​s ​          
 +Reponse : 3684hits/​s ​          
 +Erreurs : 0            ​
 +Timeouts: 0            ​
 +Temps moyen de hit: 12.0ms ​
 +Temps moyen d'une page complete: 12.0ms
 +Date de demarrage: 1255598701 (15 Oct 2009 - 11:25:01)
 +Ligne de commande : /​home/​julien/​inject29 -u 10 -H Host: localhost -G localhost:​12345/​
 +</​code>​
 +
 +Around 3684hits per seconds without any configuration and with the injector running on the same machine as the server... We can certainly do better, but for a start it's definitely not too bad !
 +
 +==== And memory usage ? ====
 +
 +During the injection, I launch the following command to check the memory usage of apache. And, it is, well... quite huge !
 +
 +<code bash>
 +$ for i in `ps -edf|grep httpd|awk {'​print $2'​}`;​do echo -n "httpd $i ==> ";pmap $i|grep total;done
 +httpd 8437 ==> ​ total     4864K
 +httpd 8570 ==> ​ total     5000K
 +httpd 8571 ==> ​ total   ​434084K
 +</​code>​
 +
 +430Mo of memory to handle 50 simultaneous clients... Apache definitely has a big butt !
 +
 +
 +
 +~~DISCUSSION~~
  
en/ressources/dossiers/apache/build_install.txt · Last modified: 2011/03/16 00:30 (external edit)
CC Attribution-Share Alike 4.0 International
Driven by DokuWiki Recent changes RSS feed Valid CSS Valid XHTML 1.0