Amazon Elastic Compute Cloud
User Guide for Linux (API Version 2014-09-01)
« PreviousNext »
View the PDF for this guide.Go to the AWS Discussion Forum for this product.Go to the Kindle Store to download this guide in Kindle format.Did this page help you?  Yes | No |  Tell us about it...

Tutorial: Hosting a WordPress Blog with Amazon EC2

The following procedures will help you install, configure, and secure a WordPress blog on your Amazon EC2 instance.

Important

These procedures are intended for use with Amazon Linux, but the commands and file locations are similar for Red Hat and CentOS. For more information about other distributions, see their specific documentation.

This tutorial is a good introduction to using Amazon EC2 in that you have full control over a web server that hosts your WordPress blog, which is not typical with a traditional hosting service. Of course, that means that you are responsible for updating the software packages and maintaining security patches for your server as well. For a more automated WordPress installation that does not require direct interaction with the web server configuration, the AWS CloudFormation service provides a WordPress template that can also get you started quickly. For more information, see Get Started in the AWS CloudFormation User Guide. If you'd prefer to host your WordPress blog on a Windows instance, see Deploying a WordPress Blog on Your Amazon EC2 Windows Instance in the Amazon EC2 User Guide for Microsoft Windows Instances.

Prerequisites

This tutorial assumes that you have launched an instance with a functional web server with PHP and MySQL support. Your Amazon EC2 security group should also allow HTTP and HTTPS traffic. If you do not already have a functional web server, see Tutorial: Installing a LAMP Web Server to create one and then return to this tutorial to install WordPress. For information about adding rules to your security group, see Adding Rules to a Security Group.

To download and unzip the WordPress installation package

  1. Download the latest WordPress installation package with the wget command. The following command should always download the latest release.

    [ec2-user ~]$ wget https://wordpress.org/latest.tar.gz
    --2013-08-09 17:19:01--  https://wordpress.org/latest.tar.gz
    Resolving wordpress.org (wordpress.org)... 66.155.40.249, 66.155.40.250
    Connecting to wordpress.org (wordpress.org)|66.155.40.249|:443... connected.
    HTTP request sent, awaiting response... 200 OK
    Length: 4028740 (3.8M) [application/x-gzip]
    Saving to: latest.tar.gz
    
    100%[======================================>] 4,028,740   20.1MB/s   in 0.2s
    
    2013-08-09 17:19:02 (20.1 MB/s) - latest.tar.gz saved [4028740/4028740]
    
  2. Unzip and unarchive the installation package. The installation folder is unzipped to a folder called wordpress.

    [ec2-user ~]$ tar -xzf latest.tar.gz
    [ec2-user ~]$ ls
    latest.tar.gz  wordpress
    

To create a MySQL user and database for your WordPress installation

Your WordPress installation needs to store information, such as blog post entries and user comments, in a database. This procedure will help you create a database for your blog and a user that is authorized to read and save information to that database.

  1. Start the MySQL server.

    [ec2-user ~]$ sudo service mysqld start
  2. Log in to the MySQL server as the root user. Enter your MySQL root password when prompted; this may be different than your root system password, or it may even be empty if you have not secured your MySQL server.

    Important

    If you have not secured your MySQL server yet, it is very important that you do so. For more information, see To secure the MySQL server.

    [ec2-user ~]$ mysql -u root -p
    Enter password:
  3. Create a user and password for your MySQL database. Your WordPress installation uses these values to communicate with your MySQL database. Enter the following command, substituting a unique user name and password.

    mysql> CREATE USER 'wordpress-user'@'localhost' IDENTIFIED BY 'your_strong_password';
    Query OK, 0 rows affected (0.00 sec)

    Make sure that you create a strong password for your user. Do not use the single quote character ( ' ) in your password, because this will break the preceding command. For more information about creating a secure password, go to http://www.pctools.com/guides/password/. Do not reuse an existing password, and make sure to store this password in a safe place.

  4. Create your database. Give your database a descriptive, meaningful name, such as wordpress-db.

    Note

    The punctuation marks surrounding the database name in the command below are called backticks. The backtick (`) key is usually located above the Tab key on a standard keyboard. Backticks are not always required, but they allow you to use otherwise illegal characters, such as hyphens, in database names.

    mysql> CREATE DATABASE `wordpress-db`;
    Query OK, 1 row affected (0.01 sec)
  5. Grant full privileges for your database to the WordPress user you created earlier.

    mysql> GRANT ALL PRIVILEGES ON `wordpress-db`.* TO "wordpress-user"@"localhost";
    Query OK, 0 rows affected (0.00 sec)
  6. Flush the MySQL privileges to pick up all of your changes.

    mysql> FLUSH PRIVILEGES;
    Query OK, 0 rows affected (0.01 sec)
  7. Exit the mysql client.

    mysql> exit
    Bye

To create and edit the wp-config.php file

The WordPress installation folder contains a sample configuration file called wp-config-sample.php. In this procedure, you copy this file and edit it to fit your specific configuration.

  1. Copy the wp-config-sample.php file to a file called wp-config.php. This creates a new configuration file and keeps the original sample file intact as a backup.

    [ec2-user ~]$ cd wordpress/
    [ec2-user wordpress]$ cp wp-config-sample.php wp-config.php
  2. Edit the wp-config.php file with your favorite text editor (such as nano or vim) and enter values for your installation. If you do not have a favorite text editor, nano is much easier for beginners to use.

    [ec2-user wordpress]$ nano wp-config.php
    1. Find the line that defines DB_NAME and change database_name_here to the database name you created in Step 4 of To create a MySQL user and database for your WordPress installation.

      define('DB_NAME', 'wordpress-db');
    2. Find the line that defines DB_USER and change username_here to the database user you created in Step 3 of To create a MySQL user and database for your WordPress installation.

      define('DB_USER', 'wordpress-user');
    3. Find the line that defines DB_PASSWORD and change password_here to the strong password you created in Step 3 of To create a MySQL user and database for your WordPress installation.

      define('DB_PASSWORD', 'your_strong_password');
    4. Find the section called Authentication Unique Keys and Salts. These KEY and SALT values provide a layer of encryption to the browser cookies that WordPress users store on their local machines. Basically, adding long, random values here makes your site more secure. Visit https://api.wordpress.org/secret-key/1.1/salt/ to randomly generate a set of key values that you can copy and paste into your wp-config.php file. To paste text into a PuTTY terminal, place the cursor where you want to paste the text and right-click your mouse inside the PuTTY terminal.

      For more information about security keys, go to http://codex.wordpress.org/Editing_wp-config.php#Security_Keys.

      Note

      The values below are for example purposes only; do not use these values for your installation.

      define('AUTH_KEY',         ' #U$$+[RXN8:b^-L 0(WU_+ c+WFkI~c]o]-bHw+)/Aj[wTwSiZ<Qb[mghEXcRh-');
      define('SECURE_AUTH_KEY',  'Zsz._P=l/|y.Lq)XjlkwS1y5NJ76E6EJ.AV0pCKZZB,*~*r ?6OP$eJT@;+(ndLg');
      define('LOGGED_IN_KEY',    'ju}qwre3V*+8f_zOWf?{LlGsQ]Ye@2Jh^,8x>)Y |;(^[Iw]Pi+LG#A4R?7N`YB3');
      define('NONCE_KEY',        'P(g62HeZxEes|LnI^i=H,[XwK9I&[2s|:?0N}VJM%?;v2v]v+;+^9eXUahg@::Cj');
      define('AUTH_SALT',        'C$DpB4Hj[JK:?{ql`sRVa:{:7yShy(9A@5wg+`JJVb1fk%_-Bx*M4(qc[Qg%JT!h');
      define('SECURE_AUTH_SALT', 'd!uRu#}+q#{f$Z?Z9uFPG.${+S{n~1M&%@~gL>U>NV<zpD-@2-Es7Q1O-bp28EKv');
      define('LOGGED_IN_SALT',   ';j{00P*owZf)kVD+FVLn-~ >.|Y%Ug4#I^*LVd9QeZ^&XmK|e(76miC+&W&+^0P/');
      define('NONCE_SALT',       '-97r*V/cgxLmp?Zy4zUU4r99QQ_rGs2LTd%P;|_e1tS)8_B/,.6[=UK<J_y9?JWG');
    5. Save the file and exit your text editor.

To move your WordPress installation to the Apache document root

Now that you've unzipped the installation folder, created a MySQL database and user, and customized the WordPress configuration file, you are ready to move your installation files to your web server document root so you can run the installation script that completes your installation. The location of these files depends on whether you want your WordPress blog to be available at the root of your web server (for example, my.public.dns.amazonaws.com) or in a subdirectory or folder (for example, my.public.dns.amazonaws.com/blog).

Important

Choose the location where you want your blog to be available and only run the mv associated with that location. If you run both sets of commands below, you will get an error message on the second mv command because the files you are trying to move are no longer there.

  1. To make your blog available at my.public.dns.amazonaws.com, move the files in the wordpress folder (but not the folder itself) to the Apache document root (/var/www/html on Amazon Linux instances).

    [ec2-user wordpress]$ mv * /var/www/html/
  2. OR, to make your blog available at my.public.dns.amazonaws.com/blog instead, create a new folder called blog inside the Apache document root and move the files in the wordpress folder (but not the folder itself) to the new blog folder.

    [ec2-user wordpress]$ mkdir /var/www/html/blog
    [ec2-user wordpress]$ mv * /var/www/html/blog

Important

If you are not moving on to the next procedure immediately, stop the Apache web server (httpd) now for security purposes. After you move your installation to the Apache document root, the WordPress installation script is unprotected and an attacker could gain access to your blog if the Apache web server were running. To stop the Apache web server, enter the command sudo service httpd stop. If you are moving on to the next procedure, you do not need to stop the Apache web server.

To fix file permissions for the Apache web server

Some of the available features in WordPress require write access to the Apache document root (such as uploading media though the Administration screens). The web server runs as the apache user, so you need to add that user to the www group that was created in the LAMP web server tutorial.

  1. Add the apache user to the www group.

    [ec2-user wordpress]$ sudo usermod -a -G www apache
  2. Change the group ownership of /var/www and its contents to the www group.

    [ec2-user wordpress]$ sudo chgrp -R www /var/www
  3. Change the directory permissions of /var/www and its subdirectories to add group write permissions and to set the group ID on future subdirectories.

    [ec2-user wordpress]$ sudo chmod 2775 /var/www
    [ec2-user wordpress]$ find /var/www -type d -exec sudo chmod 2775 {} +
  4. Recursively change the file permissions of /var/www and its subdirectories to add group write permissions.

    [ec2-user wordpress]$ find /var/www -type f -exec sudo chmod 0664 {} +
  5. Restart the Apache web server to pick up the new group and permissions.

    [ec2-user wordpress]$ sudo service httpd restart
    Stopping httpd:                                            [  OK  ]
    Starting httpd:                                            [  OK  ]

To run the WordPress installation script

  1. Use the chkconfig command to ensure that the httpd and mysqld services start at every system boot.

    [ec2-user wordpress]$ sudo chkconfig httpd on
    [ec2-user wordpress]$ sudo chkconfig mysqld on
  2. Verify that the MySQL server (mysqld) is running.

    [ec2-user wordpress]$ sudo service mysqld status
    mysqld (pid  4746) is running...

    If the mysqld service is not running, start it.

    [ec2-user wordpress]$ sudo service mysqld start
    Starting mysqld:                                           [  OK  ]
  3. Verify that your Apache web server (httpd) is running.

    [ec2-user wordpress]$ sudo service httpd status
    httpd (pid  502) is running...

    If the httpd service is not running, start it.

    [ec2-user wordpress]$ sudo service httpd start
    Starting httpd:                                            [  OK  ]
  4. Verify that the php and php-mysql packages are installed. Your output may look slightly different, but look for the Installed Packages section.

    [ec2-user wordpress]$ yum list installed php php-mysql
    Loaded plugins: priorities, security, update-motd, upgrade-helper
    amzn-main                                                | 2.1 kB     00:00
    amzn-updates                                             | 2.3 kB     00:00
    Installed Packages
    php.x86_64                       5.3.27-1.0.amzn1                  @amzn-updates
    php-mysql.x86_64                 5.3.27-1.0.amzn1                  @amzn-updates

    Note

    If either of these packages are not listed as installed, install them with the following command and then restart the httpd service.

    [ec2-user wordpress]$ sudo yum install -y php php-mysql
    [ec2-user wordpress]$ sudo service httpd restart
  5. In a web browser, enter the URL of your WordPress blog (either the public DNS address for your instance, or that address followed by the blog folder). You should see the WordPress installation screen.

    http://my.public.dns.amazonaws.com
  6. Enter the remaining installation information into the WordPress installation wizard.

    FieldValue
    Site TitleEnter a name for your WordPress site.
    UsernameEnter a name for your WordPress administrator. For security purposes you should choose a unique name for this user, since this will be more difficult to exploit than the default user name, admin.
    PasswordEnter a strong password, and then enter it again to confirm. Do not reuse an existing password, and make sure to store this password in a safe place.
    Your E-mailEnter the email address you want to use for notifications.
  7. Click Install WordPress to complete the installation.

Congratulations, you should now be able to log into your WordPress blog and start posting entries.

If your WordPress blog becomes popular and you need more compute power, you might consider migrating to a larger instance type; for more information, see Resizing Your Instance. If your blog requires more storage space than you originally accounted for, you could expand the storage space on your instance; for more information, see Expanding the Storage Space of a Volume. If your MySQL database needs to grow, you could consider moving it to Amazon RDS to take advantage of the service's autoscaling abilities.

For information about WordPress, see the WordPress Codex help documentation at http://codex.wordpress.org/. For more information about troubleshooting your installation, go to http://codex.wordpress.org/Installing_WordPress#Common_Installation_Problems. For information about making your WordPress blog more secure, go to http://codex.wordpress.org/Hardening_WordPress. For information about keeping your WordPress blog up-to-date, go to http://codex.wordpress.org/Updating_WordPress.