In this post, we will look at various methods and configurations that might help you improve the performance of your Apache httpd web server. We will discuss topics like adjusting the server’s maximum number of concurrent connections, enabling compression for faster content delivery, using caching to speed up the delivery of frequently requested resources, and optimizing PHP settings for the server’s resources and the type of PHP applications it will run. By the end of this article, you will have a better understanding of how to fine-tune your Apache web server so that it works at peak performance and can manage even the most heavy traffic.
There are several ways to tune an Apache web server for optimal performance. Here are a the examples and use cases:
1. Tune the Apache MPM (Multi-Processing Module) to match the server’s resources and the type of traffic it receives.
Apache MPM is in responsible for managing the processes and threads that handle incoming server requests. One of the MPM options for Apache is the “event” MPM, which is designed for high-concurrency servers that serve a huge number of connections.
It is critical to match the server’s resources and the type of traffic it receives while establishing the event MPM. Here’s an example of a configuration for a server with 8 cores and 16GB of RAM that receives a high volume of static and dynamic content requests:
<IfModule mpm_event_module> StartServers 4 MinSpareThreads 75 MaxSpareThreads 250 ThreadLimit 64 ThreadsPerChild 25 MaxRequestWorkers 400 MaxConnectionsPerChild 0 </IfModule>
In this example, we are starting 4 servers at the beginning, with a minimum of 75 spare threads and a maximum of 250 spare threads. The ThreadLimit is set to 64, and each server will have 25 threads available to handle requests. The MaxRequestWorkers is set to 400, which is the maximum number of requests that can be handled simultaneously by the server. The MaxConnectionsPerChild is set to 0, which means that there is no limit on the number of connections per child process.
This configuration is designed to take advantage of the server’s 8 cores by utilizing a high number of threads, while also allowing for a large number of simultaneous connections.
2. Adjust the server’s maximum number of simultaneous connections and the timeout values for idle connections.
Below are the examples of how you can adjust the server’s maximum number of simultaneous connections and timeout values for idle connections in an Apache configuration:
a. Limit the number of simultaneous connections:
<IfModule mpm_event_module> MaxClients 150 MaxConnectionsPerChild 0 </IfModule>
in this MPM event, we set MaxClients directive to 150. This means that the server will only allow 150 simultaneous connections at any given time. The MaxConnectionsPerChild directive is set to 0, which means that there is no limit on the number of connections per child process.
b. Adjust the timeout values for idle connections:
Timeout 60 KeepAliveTimeout 30
Above example, we configure the Timeout directive to 60 seconds. This means that if a connection is idle for more than 60 seconds, the server will close the connection. The KeepAliveTimeout directive is set to 30 seconds, which means that the server will close an idle connection after 30 seconds if the KeepAlive option is enabled. This helps to release resources and free up connections for other clients. There are many directives available in Apache that can be used to adjust the server’s maximum number of simultaneous connections and timeout values for idle connections. Other directives that can be used to achieve the same goal include:
You can choose the right configuration based on your use case and the resources available on your server.
3. Enable mod_deflate to compress content before sending it to the client.
Example of how you can enable mod_deflate to compress content before sending it to the client in an Apache configuration:
4. Use mod_expires to set expiration times for static resources.
An example Apache configuration to use mod_expires to set expiration times for static resources as below :
5. Configure mod_cache to cache frequently requested resources in memory.
Here is an example configuration for mod_cache to cache frequently requested resources in memory using the “mem_cache” storage type:
LoadModule cache_module modules/mod_cache.so LoadModule cache_socache_module modules/mod_cache_socache.so <IfModule mod_cache.c> CacheEnable mem / CacheSocacheMemcache "localhost:11211" </IfModule>
In this example, mod_cache is being enabled for the entire website using the “mem” storage type and the “CacheSocacheMemcache” directive is being used to specify the location of the memcached server (localhost on port 11211). This is one way to configure mod_cache, but it is important to note that the configuration will depend on the specific use case and resources of the server.
6. Optimize the PHP settings for the server’s resources and the type of PHP applications it will be running.
Here’s an example of how to optimize PHP settings for a server’s resources and the types of PHP apps that will run on it:
- Increase the memory limit by editing the “memory_limit” setting in the “php.ini” file. For example, to increase the limit to 256MB, change the line to “memory_limit = 256M”
- Adjust the maximum execution time for PHP scripts by editing the “max_execution_time” setting in the “php.ini” file. For example, to set the maximum execution time to 30 seconds, change the line to “max_execution_time = 30”
- Increase the maximum file upload size by editing the “upload_max_filesize” setting in the “php.ini” file. For example, to increase the maximum file upload size to 50MB, change the line to “upload_max_filesize = 50M”
- Enable the OpCache extension to improve PHP performance by adding “zend_extension=opcache.so” in the “php.ini” file and setting “opcache.enable=1”
- Set the session save path to a directory outside of the web root by editing the “session.save_path” setting in the “php.ini” file. For example, “session.save_path = /var/lib/php/sessions”
- Adjust the log level of errors by editing the “error_reporting” setting in the “php.ini” file. For example, to show all errors except notices and warnings, change the line to “error_reporting = E_ALL & ~E_NOTICE & ~E_WARNING”
It is important to understand that these settings may differ based on the specific requirements of your PHP applications and the server resources available.
Tuning your Apache web server can significantly boost your website’s performance and scalability. You can improve the server’s resources and handle more traffic by tweaking the MPM settings, connection timeout values, and enabling modules such as mod deflate, mod expires, and mod cache. Furthermore, optimizing PHP settings might enhance the performance of your PHP apps. Always test your changes and monitor the server’s performance to ensure that they produce the desired effect. Your website can handle more traffic, load pages faster, and provide a better user experience for your visitors if it is configured properly.