There are a lot of things you can do to optimize WordPress to run as smooth as possible including optimizing Apache and MySQL, introducing cache layers and more. That is just fine, and they should be done in a production environment. In a development environment however, it is another story. Here you have the option to do radical things for radical results. Like, moving all data into RAM!
I like WordPress, and I do WordPress development on a daily basis. But WordPress has VERY bad performance and that will eventually become quite annoying when developing and testing a lot. Introducing a cache layer on a development machine is not really an option since you would like to see the results of your work instantly. So, why not move all WordPress files including the database into RAM and boost that performance quite a bit.
The concept is quite simple:
- Create a boot script that creates a RAM-drive and copies data to it.
- Configure Apache and MySQL to work against this drive.
- Create a shutdown script that copies back everything from RAM to the HDD again.
I am using an Ubuntu Server 11.04 with Apache, MySQL and WordPress installed; I will not cover how to install them in this blog post (Google it).
File structure
The RAM-drive will be mounted on /ram
, and on that drive the copied files will maintain their relative file structure, kind of. /var/www
will become /ram/var/www
etc.
Configuring MySQL
First of all you need to stop the MySQL daemon using
stop mysql
Once stopped, we need to edit the /etc/init/mysql.conf
in order to disable MySQL autostart:
nano /etc/init/mysql.conf
Comment out these three lines:
#start on (net-device-up
#Â Â Â Â Â Â Â Â Â and local-filesystems
#Â Â Â Â Â Â Â Â and runlevel [2345])
Save your changes. Next we need to change the path were MySQL stores its data. Edit /etc/mysql/my.cnf
:
nano /etc/mysql/my.cnf
Two lines should be altered here:
datadir = /ram/var/lib/mysql
tmpdir = /ram/tmp
If you are running AppArmour (most likely if you are running Ubuntu), you will need to allow access to the new paths. Edit /etc/apparmor.d/usr.sbin.mysqld
:
Add /ram before the two lines starting with /var/lib/mysql like so:
/ram/var/lib/mysql/ r,
/ram/var/lib/mysql/** rwk,
Also add the following line below the previously altered rows:
/ram/tmp/** rwk,
Save your changes.
Configuring Apache
Apache is very simple to configure, just make sure your VHOST-files are pointing to the RAM-drive. My document root for the default site (or WordPress installation) is:
/ram/var/www
Then you need to stop Apache from auto starting, we will start it using a startup script instead. An easy way to do this is to install sys-rc-conf:
apt-get install sysv-rc-conf
Then just start it:
sysv-rc-conf
Uncheck every checkbox on the apache2 line using space. When you are done, press âqâ to quit.
Create a mount point
This is where it all will happen:
mkdir /ram
Startup script
Now on to the interesting parts, the startup script. By all means, this script could certainly be optimized, but I have been successfully used it for some time.
Create a new file in your home directory, or any other location you prefer. I have placed mine in /home/puffy/scripts/startup.sh
:
Insert the following script:
# Create RAM drive.
mount -t ramfs -o size=3072m ramfs /ram
# Copy Apache data.
mkdir /ram/var
cp -a /var/www /ram/var/www
chown -R www-data:www-data /ram/var/www
chmod -R 775 /ram/var/www
/etc/init.d/apache2 start
# Copy MySQL data.
mkdir /ram/var/lib
cp -a /var/lib/mysql /ram/var/lib/mysql
chown -R mysql:mysql /ram/var/lib/mysql
chmod -R 700 /ram/var/lib/mysql
# Create tmp folder.
mkdir /ram/tmp
chmod 777 /ram/tmp
start mysql
Save the file and then make it executable:
chmod +x /home/puffy/scripts/startup.sh
Now make this execute during startup by adding it to the /etc/rc.local
file. My rc.local looks like this:
/home/puffy/scripts/startup.sh
exit 0
Shutdown script
Create a new file named /home/puffy/scripts/shutdown.sh
and insert this script:
# Backup Apache
/etc/init.d/apache2 stop
rm -R /var/www
cp -a /ram/var/www /var/www
# Backup MySQL
stop mysql
rm -R /var/lib/mysql/*
cp -Rf /ram/var/lib/mysql/* /var/lib/mysql/
Save the file and then make it executable:
chmod +x /home/puffy/scripts/shutdown.sh
Now we need to make this file execute prior to shutting down our server. Do this by creating a symbolic link:
ln âs /home/puffy/scripts/shutdown.sh /etc/rc6.d/K99shutdown.sh
Thatâs it!
Did it work?
Restart your server and make sure that the RAM-drive is mounted properly. Run:
df âa
You should be able to see the ramfs drive mounted on /ram:
Filesystem          1K-blocks     Used Available Use% Mounted on
/dev/sda1Â Â Â Â Â Â Â Â Â Â Â Â Â 7852740Â Â 2259924Â Â 5193920Â 31% /
proc                        0        0        0  - /proc
none                        0        0        0  - /sys
fusectl                     0        0        0  - /sys/fs/fuse/connections
none                        0        0        0  - /sys/kernel/debug
none                        0        0        0  - /sys/kernel/security
none                  2020756      188  2020568  1% /dev
none                        0        0        0  - /dev/pts
none                  2028324         0  2028324  0% /dev/shm
none                  2028324       68  2028256  1% /var/run
none                  2028324        0  2028324  0% /var/lock
ramfs                       0        0        0  - /ram
Now, check your WordPress installation by surfing to it using your browser. You will probably notice quite a difference!
Sweet. this sounds very cool. unfortunately I’m not running such a set-up!