How to Tune and Optimize the Performance of Apache

1. Optimize hardware and operating system

a) RAM

Ensure you have enough RAM space to increase apache web server performance especially during caching. If RAM fills up the requests will be redirected to swap space which increases latency. This translates to users having to reload their request, hence increasing the load further. To resolve this issue i.e. limit the number of child process spawned by the Apache web server beyond which they are redirected to swap space, you have to set the MaxRequestWorkers. To get the best value for this do the following procedure:

  1. Use the top command to check the average RAM size used by apache process
  2. Divide the total available RAM size by the average RAM size used by apache to get the number of MaxRequestWorkers

To increase the performance of Apache, ensure you have faster CPU, faster network card, and faster disks.

b) Write Buffer Size

Increase the write buffer size by increasing the value in the two files:

/proc/sys/net/core/wmem_max
/proc/sys/net/core/wmem_default

c) Maximum Open Files

If apache web server is handling high loads, it’s recommended to increase the maximum number of allowed open files by increasing the value in the file:

/proc/sys/fs/file-max

Then run the command:

$ ulimit -H -n 4096

2. Tune Run-Time Configuration

a) Disable .htaccess using AllowOverride

Enabling AllowOverride makes apache try to open .htaccess whenever a request is made. This really reduces the performance of the Apache web server. To resolve this, use the option AllowOverride None as shown below:

DocumentRoot "/www/var/html"
<Directory "/">
  AllowOverride None
</Directory>

b) Disable DNS Lookups using HostnameLookups

When HostnameLookups is enabled i.e. turned ON, it increases latency for each request to be completed after performing DNS lookup. There are two solutions to this:

  1. For logging files with resolved names, do post-processing of the logs on a different machine to prevent slow-down of performance in production server.
  2. If you don’t necessarily need name resolution then use IP addresses, and disable DNS lookup altogether by using the option below:
HostnameLookups off

3. Optimize Compile-Time Configuration

a) Multi-Processing Modules (MPMs)

MPM help apache be able to bind to network ports, utilize children processes and threads alternately to accept and handle requests. There are 3 different types of MPMs and each is suitable for different requirements.

worker: Utilizes multiple child processes, each with many threads, while each thread is handling one connection at a time. This is suitable for high traffic servers owing to its smaller memory footprint than prefork.

event: Similar to the worker MPM in regards to threading, but allows for simultaneous serving of more requests through passing off some processing to supporting threads. This helps free up memory which is allocated to other threads. Not suitable for use with non-thread-safe modules like mod_php.

prefork: Utilizes multiple child processes, each with one thread. Each process handles one connection at a time. It’s faster than a worker but uses more memory. Suitable for debugging applications using non-thread-safe modules like mod_php.

To check your MPM version, run command

$ sudo httpd -V

Output:

[linuxuser@centos7-apache ~]$ sudo httpd -V
[sudo] password for linuxuser:
Server version: Apache/2.4.6 (CentOS)
Server built:   Apr 20 2018 18:10:38
Server's Module Magic Number: 20120211:24
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:     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="/etc/httpd"
 -D SUEXEC_BIN="/usr/sbin/suexec"
 -D DEFAULT_PIDLOG="/run/httpd/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"

The current MPM is prefork, if you want to change it, edit as follows:

For Centos 7

$ sudo vim /etc/httpd/conf.modules.d/00-mpm.conf

For Ubuntu 16.04

$ sudo vim /etc/apache2/mods-available/<mpm>.load

Where <mpm> is mpm_prefork, mpm_event or mpm_worker

b) Remove Unnecessary Modules

Some of the modules that you may not need in your web server include but not limited to mod_mime, mod_dir, mod_php, mod_perl, mod_ruby, e.t.c. This will help save RAM memory used by the web server.

In Centos 7, to disable or unload a module, comment out< the line that starts with LoadModule in the main config file or files inside /etc/httpd/conf.modules.d/

In Ubuntu 16.04, to disable or unload a module, run the command:

$ sudo a2dismod module_name

To enable a module

$ sudo a2enmod module_name

Then restart apache service.

 

Check out the top 3 Best web hosting services

HostArmada
$2.49 /mo
Starting price
Visit HostArmada
Rating based on expert review
  • User Friendly
    4.5
  • Support
    4.5
  • Features
    4.5
  • Reliability
    4.5
  • Pricing
    4.0
Kamatera
$4.00 /mo
Starting price
Visit Kamatera
Rating based on expert review
  • User Friendly
    3.5
  • Support
    3.0
  • Features
    3.9
  • Reliability
    4.0
  • Pricing
    4.3
Hostens
$2.00 /mo
Starting price
Visit Hostens
Rating based on expert review
  • User Friendly
    4.5
  • Support
    3.8
  • Features
    4.3
  • Reliability
    4.5
  • Pricing
    4.8

How to Configure Nginx and Apache on the same Ubuntu VPS or Dedicated Server

Nginx and Apache are great and powerful web servers. However, they both have dra
2 min read
Idan Cohen
Idan Cohen
Marketing Expert

How to Harden the Apache web server on a CentOS 7 VPS or Dedicated Server

In this how-to article, we illustrate how to harden an Apache web server, runnin
2 min read
Eliran Ouzan
Eliran Ouzan
Web Designer & Hosting Expert

How to Install Apache Cassandra on an Ubuntu 18.04 VPS or Dedicated Server

This tutorial will help you install and configure Apache Cassandra (an opensourc
3 min read
Max Ostryzhko
Max Ostryzhko
Senior Web Developer, HostAdvice CTO

How to Host Multiple Websites on an Ubuntu 18.04 VPS or Dedicated Server

This article will show you how to host two or more websites on a single Virtual
5 min read
Idan Cohen
Idan Cohen
Marketing Expert
HostAdvice.com provides professional web hosting reviews fully independent of any other entity. Our reviews are unbiased, honest, and apply the same evaluation standards to all those reviewed. While monetary compensation is received from a few of the companies listed on this site, compensation of services and products have no influence on the direction or conclusions of our reviews. Nor does the compensation influence our rankings for certain host companies. This compensation covers account purchasing costs, testing costs and royalties paid to reviewers.