Tweaking your server to not get the “Error establishing a database connection”

For months now my server has been running ok, I only had a small issue with a misconfigured varnish server, that caused the php session cookies to not work.

In the past I have had issues with my Ubuntu 14.04 Server, almost on a daily basis the server crashed with the error “Error establishing a database connection”, as my host is Digital Ocean there was others who experienced similar problems, it seems that MySWL is running out of RAM and crash, that could be due to a traffic spike.

There is several solution available, the simples solution, is to add swap file on the server, or upgrade your droplet to the next plan so that there’s more RAM available for MySQL. I took both steps, I added swap file and I also upgraded to the next plan.

This worked tills a few days ago when the server start crashing again with “Error establishing a database connection”, so I started to look into how to add performance to the server, I came across an article on how to tweak the Apache  Mpm prefork values, it seems on my server it was set a bit to high. So I changed it to a more suitable number for the traffic I have.

The Mpm prefork values should be located in /etc/apache2/apache2.conf file or /etc/apache2/mods-enabled/mpmprefork.conf file. If you don’t have these values in apache2 file and you don’t have mpmprefork.conf file, then you have to install mpmprefork module and restart apache.

Here are the values that I defined, seems to work fine now:

StartServers          2
MinSpareServers       3
MaxSpareServers       5
MaxClients           100
ServerLimit          100
MaxRequestsPerChild 3000

What do these values means, here are some explanations:

  • StartServers – this is how many apache instances should start at the very beginning when apache is started. I set it to 2, and it works fine for me.
  • MinSpareServers – minimum number of spare servers that should be running waiting for potential requests. I set it to 3, works fine for me.
  • MaxSpareServers – maximum number of spare servers that should be running waiting for potential requests, obviously >= MinSpareServers. In my working example MaxSpareServers=5.
  • MaxClients – You need to figure out how much memory is consumed by one Apache process, when you know average amount of memory consumed by Apache and total amount of memory of your server, it is possible to calculate value to be used for MaxClients setting. For example, if in average one Apache process consumes 50MB RAM and server RAM is 2GB, and you want to leave 512MB for the rest processes, then:MaxClients = (2GB – 512MB)/50MB = 30.72 ~ 30.
  • ServerLimit value is MaxClients should always be <= ServerLimit. To make it easy, I set ServerLimit = MaxClients to the same value. ,For new ServerLimit value to take effect Apache restart is required.
  • By default MaxRequestsPerChild = 0, which means that httpd process will never expire. However, it can happen that there are some memory leaks in your PHP scripts (especially if you are using lot’s of third-party contributed modules). To protect yourself from accidental memory leaks, you can set how many requests should be processed by Apache process before it dies. In my example I used MaxRequestsPerChild = 3000 and it works fine.

If you are running WordPress on your server, then you may also want to take a look at MySQL database and make some changes, WordPress itself are installed with the InnoDB engine, I have noticed that some plugins are using MyISAM engine, which means that you will run two engines. you can fix this with PhpMyAdmin and repair your tables and switched all tables from MyISAM to InnoDB. Before any work on the database, do a backup.

I hope this will help someone who has problem, please comment below.