AWS Compute Blog
Deploying a highly available WordPress site on Amazon Lightsail, Part 1: Implementing a highly available Lightsail database with WordPress
This post is contributed by Mike Coleman | Developer Advocate for Lightsail | Twitter: @mikegcoleman
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.
Subsequent posts in this series cover managing media files, using CloudFront to increase site security and performance, and scaling the WordPress front-end with a Lightsail load balancer. For reference, here are those blogs:
- Using Amazon S3 with WordPress to securely deliver media files
- Increasing security and performance using Amazon CloudFront
- Increasing performance and scalability with a Lightsail load balancer
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.
Prerequisites
This solution has the following prerequisites:
- A new WordPress instance on Lightsail. For more information, see Tutorial: Launch and configure a WordPress instance in Amazon Lightsail. You only need to complete the first two steps.
- A standalone highly available MySQL database on Lightsail. For more information, see Creating a database in Amazon Lightsail. When you get to step 7, choose high-availability.
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_USERNAME
andLSDB_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:
LSDB_USERNAME=UserName
LSDB_ENDPOINT=Endpoint
For example, your input should look similar to the following code:
LSDB_USERNAME=dbmasteruser
LSDB_ENDPOINT=ls.rds.amazonaws.com
- Retrieve the Bitnami application password for the database running on your WordPress instance.
This password is stored at /home/bitnami/bitnami_application_password
.
Enter the following cat command in the terminal to display the value:
cat /home/bitnami/bitnami_application_password
- Copy and paste the following code into a text document and copy the password
cat /home/bitnami/bitnami_application_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.
- Enter the following command at the terminal prompt:
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.
Configuring WordPress
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 wp-config
file.
- 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.
For example:
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
Conclusion
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.
Be sure to check out part two in the series, Using Amazon S3 with WordPress to securely deliver media files.