Status: Deprecated This article covers a version of Ubuntu that is no longer supported. If you are currently operate a server running Ubuntu 12. This guide is no longer maintained. See Instead: This guide might still be useful as a reference, but may not work on other Ubuntu releases. If available, we strongly recommend using a guide written for the version of Ubuntu you are using. You can use the search functionality at the top of the page to find a more recent version. Introduction Apache is an amazingly powerful and capable web server. In order to make initial setup as easy as possible, it comes with numerous modules pre-installed. This makes it a great choice for new projects when you need to quickly be productive. However, as your site grows you may start to bump into performance problems. What first attracted me to DigitalOcean was the low cost to get started. The smallest and cheapest droplets have 512MB of RAM, which doesn't seem like much in today's world of big frameworks. However, you'd be surprised what you can do with a small server like this if you take a little time to tweak the settings. If you're running Apache on one of the smaller sizes of droplets, or if you want to maximize your performance on the bigger droplets, here are a few things you should do. I'll be using Ubuntu 12. The mods-available folder is a list of all the modules installed on a particular server and mods-enabled is the modules that are currently active. On my VPS I have 17 modules active by default. This is too many and most aren't needed for my application. Unfortunately, the modules you need may not be precisely clear because some are dependencies of others. What I suggest doing is making a list of all the currently active modules and saving it for future reference in case you need to revert back. Then simply disable modules one-by-one and restart your Apache after each change to see if errors occur. If you can get by with alias then disable rewrite. Rewrite is one of the more burdensome modules, but it also imbues Apache with some remarkable powers. After you disable a module and reload the Apache configuration, you can check the apache error log for messages. That means that the module I just disabled was needed. It may take several tries before you get the minimum list sorted out. Be patient, it's worth it. The problem with this is that the C code for the interpreter for that language is embedded into Apache, thereby using more memory on every page view. If a popular page on your site causes 30 HTTP requests, one of those will be for the dynamic page, and the other 29 are likely for static resources like images, css and javascript. Why use up a bloated Apache for those 29 requests that don't serve any dynamic content? The difference can be dramatic. Considering that, by default, your Apache server may have 25 or more processes running, you can see why this can become an issue. A downside to making this change is that it's harder to get things working initially. In some cases, the documentation is very good. In other cases, cough php-fpm cough the documentation is sparse. Generally what happens is that a special server process for PHP or Python or Ruby is started, then Apache, instead of instinctively knowing how to deal with these requests through embedded code, merely forwards the call for dynamic content onto this backend process. You'll be amazed at how much of a difference this makes. I was able to serve all of my dynamic content with just two php backend processes that used merely 60MB each. Limit the Number of Apache Processes and Children Most operating systems' default Apache configurations are not well suited for smaller servers-- 25 child processes or more is common. If each of your Apache child processes uses 120MB of RAM, then your VPS would need 3GB just for Apache. One visitor's web browser may request 4 items from the website at once, so with only 7 or 8 people trying to load a page at the same time your cloud server can become overloaded. This causes the web page to hang in a constantly loading state for what seems like an eternity. It is often the case that the server will keep these dead Apache processes active, attempting to serve content long after the user gave up, which reduces the number of processes available to serve users and reduces the amount of system RAM available. This causes what is commonly known as a downward spiral that ends in a bad experience for both you and your site's visitors. What you should do is figure out how much RAM your application needs, and then figure out how much is left, and allocate most of that to Apache. For example, if you have three php-fpm processes handling dynamic content, and each can use up to 70MB of RAM, and your MySQL server may use up to 120MB of RAM, that combines for a total of 330MB used by the application. This allows you to allocate about 150MB to Apache. While Apache is running open the top command on the server. For example, on my virtual server which has been well optimized, the value is 9,644, which means it's using not quite 10MB of RAM. If I limit Apache to a maximum of 15 child processes, then it should max out at about 150MB of RAM. Look for the MaxClients line and set it to 15, then save and restart Apache. Here is an example of what you'll look for in Ubuntu: StartServers 3 MinSpareServers 3 MaxSpareServers 5 MaxClients 30 MaxRequestsPerChild 0 See the MaxClients line there? We need to change that value to a lower number. If your VPS gets overloaded, and reaches the maximum number of clients it can serve at once, it will serve those and other users will simply get a quick failure. They can then reload the page and maybe have greater success on the second try. This sounds bad, but believe me, it's much better to have these connections close quickly but leave the server in a healthy state rather than hanging open for an eternity. Surprisingly you can get better performance from a server that has fewer child processes but responds faster than it is to have a server with more child processes that it is unable to handle. Case in point, a Wordpress site I manage is hosted on a 1GB droplet using 4 php-fpm processes and is able to serve over 950 simultaneous users at one time. This translate to a peak capacity of about 42 million page views per day, should this website ever become popular enough! Consider Alternate MPM Configuration Most Apache configurations have historically used the prefork mpm, which is thread safe and therefore suitable for use with PHP and other embedded languages. If you get rid of external modules such as PHP or Rails then you can consider the worker MPM, which often is faster than prefork. In order to enable the worker module you have to install it. Need to get 2,284 B of archives. After this operation, 8,718 kB disk space will be freed. Here we've discussed four optimizations you can make to Apache that should greatly boost your application performance, even if you have a small droplet. I strongly suggest trying this out on a test droplet rather than your production server. The beauty of DigitalOcean's service is that you can spin up a new droplet for just the amount of time you need to test the changes, and shut it down when you're done. With hourly billing, it is a low-risk, low-cost way to find the perfect configuration for your VPS. Apache is an amazingly powerful and capable web server. In order to make initial setup as easy as possible, it comes with numerous modules pre-installed. This makes it a great choice for new projects when you need to quickly be productive, but as your site grows you may start to bump into performance problems.