Listen to this article
This post walks you through what to consider when architecting a scalable, redundant WordPress site. It discusses how WordPress stores such elements as user accounts, posts, settings, media, and themes, and how to configure WordPress to work with a standalone database.
This walkthrough deploys a WordPress site on Amazon Lightsail. Lightsail is the easiest way to get started on AWS, and it might be the easiest (and least expensive) way to get started on WordPress. You can launch a new WordPress site in a few clicks with one of Lightsail’s blueprints, for a few dollars a month. This gives you a single Lightsail instance to host your WordPress site that’s perfect for a small personal blog.
However, you may need a more resilient site capable of scaling to meet increased demand and architected to provide a degree of redundancy. If you’re a novice cloud user, the idea of setting up a highly available WordPress implementation might seem daunting. But with Lightsail and other AWS services, it doesn’t need to be.
What’s under the hood?
Even though you’re a WordPress user, you may not have thought about how WordPress is built. However, if you’re moving into managing your WordPress site, it’s essential to understand what’s under the hood. As a content management system (CMS), WordPress provides a lot of functionality; this post focuses on some of the more essential features in the context of how they relate to architecting your highly available WordPress site.
WordPress manages a variety of different data. There are user accounts, posts, media (such as images and videos), themes (code that customizes the look and feel of a given WordPress site), plugins (code that adds additional functionality to your site), and configuration settings.
Where WordPress stores your data varies depending on the type of data. At the most basic level, WordPress is a PHP application running on a web server and database. The web server is the instance that you create in Lightsail, and includes WordPress software and the MySQL database. The following diagram shows the Lightsail VPC architecture.
The database stores a big chunk of the data that WordPress needs; for example, all of the user account information and blog posts. However, the web server’s file system stores another portion of data; for example, a new image you upload to your WordPress server. Finally, with themes and plugins, both the database and the file system store information. For example, the database holds information on what plugins and which theme is currently active, but the file system stores the actual code for the themes and plugins.
To provide a highly available WordPress implementation, you need to provide redundancy not only for the database, but also the content that may live on the file system.
This solution has the following prerequisites:
- A new WordPress instance on Lightsail.
- A standalone highly available MySQL database on Lightsail.
This post and the subsequent posts deal with setting up a new WordPress site. If you have an existing site, the processes to follow are similar, but you should consult the documentation for both Lightsail and WordPress. Also, be sure to back up your existing database as well as snapshot your existing WordPress instance.
Configuring the database
The standalone MySQL database you created is not yet configured to work with WordPress. You need to create the actual database and define the tables that WordPress needs. The easiest method is to export the table from the database on your WordPress instance and import it into your standalone MySQL database. To do so, complete the following steps:
- Connect to your WordPress instance by using your SSH client or the web-based SSH client in the Lightsail console. The screenshot below highlights the icon to click.
- From the terminal prompt for your WordPress instance, set two environment variables (
LSDB_ENDPOINT) that contain the connection information for your standalone database.
You can find that information on the database’s management page from the Lightsail console. See the following screenshot of the Connection details page.
- To set the environment variables, substitute the values for your instance into the following code example and input each line one at a time at the terminal prompt:
For example, your input should look similar to the following code:
- Retrieve the Bitnami application password for the database running on your WordPress instance.
This password is stored at
Enter the following cat command in the terminal to display the value:
- Copy and paste the following code into a text document and copy the password
You need this password in the following steps.
- Enter the following command into the terminal window:
mysqldump \ -u root \ --databases bitnami_wordpress \ --single-transaction \ --order-by-primary \ -p > dump.sql
This command creates a file (dump.sql) that defines the database and all the needed tables.
- When prompted for a password, enter the Bitnami application password you recorded previously.
The terminal window doesn’t show the password as you enter it.
Now that you have the right database structure exported, import that into your standalone database. You’ll do this by entering the contents of your dump file into the mysql command line.
cat dump.sql | mysql \ --user $LSDB_USERNAME \ --host $LSDB_ENDPOINT \ -p
- When prompted for a password, enter the password for your Lightsail database.
The terminal window doesn’t show the password as you enter it.
- Enter the following mysql command in the instance terminal:
echo 'use bitnami_wordpress; show tables' | \ mysql \ --user $LSDB_USERNAME \ --host $LSDB_ENDPOINT \ -p
This command shows the structure of the WordPress database, and verifies that you created the database on your Lightsail instance successfully.
- When prompted for a password, enter the password for your standalone database.
You should receive the following output:
Tables_in_bitnami_wordpress wp_commentmeta wp_comments wp_links wp_options wp_postmeta wp_posts wp_term_relationships wp_term_taxonomy wp_termmeta wp_terms wp_usermeta wp_users
This test confirms that your standalone database is ready for you to use with your WordPress instance.
Now that you have the standalone database configured, modify the WordPress configuration file (
wp-config.php) to direct the WordPress instance to use the standalone database instead of the database on the instance.
The first step is to back up your existing configuration file. If you run into trouble, copy
wp-config.php.bak over to
wp-config.php to roll back any changes.
- Enter the following code:
cp /home/bitnami/apps/wordpress/htdocs/wp-config.php /home/bitnami/apps/wordpress/htdocs/wp-config.php.bak
You are using
wp-cli to modify the
- Swap out the following values with those for your Lightsail database:
wp config set DB_USER UserName wp config set DB_PASSWORD Password wp config set DB_HOST Endpoint
The following screenshot shows the example database values.
wp config set DB_USER dbmasteruser wp config set DB_PASSWORD ‘MySecurePassword!2019’ wp config set DB_HOST ls.rds.amazonaws.com
To avoid issues with any special characters the password may contain, make sure to wrap the password value in single quotes (‘).
- Enter the following command:
wp config list
The output should match the values on the database’s management page in the Lightsail console. This confirms that the changes went through.
- Restart WordPress by entering the following command:
sudo /opt/bitnami/ctlscript.sh restart
This post covered a lot of ground. Hopefully it educated and inspired you to sign up for a free AWS account and start building out a robust WordPress site. Subsequent posts in this series show how to deal with your uploaded media and scale the web front end with a Lightsail load balancer.