Hosting WordPress in the App Engine flexible environment

This tutorial shows how to deploy a small WordPress site to the App Engine flexible environment.

Objectives

  • Create a Cloud SQL Second Generation instance.
  • Configure a sample WordPress site.
  • Deploy the sample WordPress site to the App Engine flexible environment.

Costs

Before you begin

  1. Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
  2. In the Google Cloud Console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  3. Make sure that billing is enabled for your Cloud project. Learn how to confirm that billing is enabled for your project.

  4. Enable the required APIs.

    Enable the APIs

  5. Install and initialize the Cloud SDK.
  6. Create credentials by following these steps:
    • In the Cloud Console, go to the Credentials page.

      Open the API Credentials Page

    • Click Create credentials and select Service account key.
    • Select Service account > App Engine default service account.
    • Click Create.
    • Save the downloaded key in a secure place.
  7. Install PHP and Composer.
  8. Download the Cloud SQL Proxy and make it executable. Also add the location of the Cloud SQL Proxy executable file to your PATH environment variable.
  9. Install a MySQL client and verify that the location of the mysql executable file is in your PATH environment variable.

Creating and configuring a Cloud SQL Second Generation instance

  1. Create a Cloud SQL Second Generation instance:

    gcloud sql instances create tutorial-sql-instance \
        --activation-policy=ALWAYS \
        --tier=db-n1-standard-1 \
        --region=us-central1
    
  2. Set the root password for your instance:

    gcloud sql users set-password root --instance tutorial-sql-instance \
        --password [YOUR_SQL_ROOT_PASSWORD] \
        --host %
    

    where [YOUR_SQL_ROOT_PASSWORD] is a secure password of your choice.

  3. Download and run the Cloud SQL Proxy:

    wget https://dl.google.com/cloudsql/cloud_sql_proxy.linux.amd64 -O cloud_sql_proxy
    cloud_sql_proxy \
        -dir /tmp/cloudsql \
        -instances=[YOUR_PROJECT_ID]:us-central1:tutorial-sql-instance=tcp:3306 \
        -credential_file=[PATH_TO_YOUR_SERVICE_ACCOUNT_JSON]
    

    where

    • [YOUR_PROJECT_ID] is your Google Cloud project ID.

    • [PATH_TO_YOUR_SERVICE_ACCOUNT_JSON] is the path to the service account JSON file that you downloaded previously.

    The following output indicates that the proxy is ready for new connections:

    Listening on 127.0.0.1:3306 for [YOUR_PROJECT_ID]:us-central1:tutorial-sql-instance
    Ready for new connections
    
  4. In another terminal window, create a new database and a user:

    mysql -h 127.0.0.1 -u root --password=[YOUR_SQL_ROOT_PASSWORD]
    mysql> create database tutorialdb;
    mysql> create user 'tutorial-user'@'%' identified by '[YOUR_DATABASE_PASSWORD]';
    mysql> grant all on tutorialdb.* to 'tutorial-user'@'%';
    mysql> exit
    

    where:

    • [YOUR_SQL_ROOT_PASSWORD] is the root password for your Cloud SQL instance.
    • [YOUR_DATABASE_PASSWORD] is a secure password of your choice.

Setting up the WordPress project

  1. Clone the sample repository:

    git clone https://github.com/GoogleCloudPlatform/php-docs-samples.git
    
  2. Go to the directory that contains the sample code:

    cd php-docs-samples/appengine/flexible/wordpress
    
  3. Install dependencies:

    composer install
    
  4. Run the helper script:

    php wordpress.php setup -n \
        --dir=./wordpress-project \
        --db_instance=tutorial-sql-instance \
        --db_name=tutorialdb \
        --db_user=tutorial-user \
        --project_id=[YOUR_PROJECT_ID] \
        --db_password=[YOUR_DATABASE_PASSWORD]
    

    where:

    • [YOUR_PROJECT_ID] is your project ID.
    • [YOUR_DATABASE_PASSWORD] is your database password.

    The -dir parameter specifies the location of your WordPress project.

  5. The helper script writes information to wordpress-project/wordpress/wp-config.php. Inspect the content of wp-config.php to verify that your names, project ID, and database password are correct.

    if ($onGae) {
        /** Production environment */
        define('DB_HOST', ':/cloudsql/[YOUR_PROJECT_ID]:us-central1:tutorial-sql-instance');
        /** The name of the database for WordPress */
        define('DB_NAME', 'tutorialdb');
        /** MySQL database username */
        define('DB_USER', 'tutorial-user');
        /** MySQL database password */
        define('DB_PASSWORD', '[YOUR_DATABASE_PASSWORD]');
    } else {
        /** Local environment */
        define('DB_HOST', '127.0.0.1');
        /** The name of the database for WordPress */
        define('DB_NAME', 'tutorialdb');
        /** MySQL database username */
        define('DB_USER', 'tutorial-user');
        /** MySQL database password */
        define('DB_PASSWORD', '[YOUR_DATABASE_PASSWORD]');
    }
    

Deploying the WordPress project to the App Engine flexible environment

  1. Go to your WordPress project directory:

    cd wordpress-project
    
  2. Deploy the WordPress project:

    gcloud app deploy \
        --promote --stop-previous-version app.yaml cron.yaml
    
  3. In your browser, enter the following URL:

    https://PROJECT_ID.REGION_ID.r.appspot.com

    Replace the following:

Updating WordPress, plugins, and themes

It's important to keep WordPress, plugins, and themes up to date. You can keep these items updated by using the wp tool. After an update, you need to re- deploy the WordPress project.

  1. Update WordPress itself:

    vendor/bin/wp core update --path=wordpress
    
  2. Update plugins:

    vendor/bin/wp plugin update --all --path=wordpress
    # Just in case it updates any of the dropins, copy the files:
    cp wordpress/wp-content/plugins/batcache/advanced-cache.php \
        wordpress/wp-content/plugins/memcached/object-cache.php \
        wordpress/wp-content
    
  3. Update themes:

    vendor/bin/wp theme update --all --path=wordpress
    
  4. Deploy the project again:

    gcloud app deploy \
        --promote --stop-previous-version app.yaml cron.yaml
    

Cleaning up

To avoid incurring charges to your Google Cloud account for the resources used in this tutorial, either delete the project that contains the resources, or keep the project and delete the individual resources.

Delete the project

The easiest way to eliminate billing is to delete the project that you created for the tutorial.

To delete the project:

  1. In the Cloud Console, go to the Manage resources page.

    Go to Manage resources

  2. In the project list, select the project that you want to delete, and then click Delete.
  3. In the dialog, type the project ID, and then click Shut down to delete the project.

Delete non-default versions of your app

If you don't want to delete your project, you can reduce costs by deleting the non-default versions of your app.

To delete an app version:

  1. In the Cloud Console, go to the Versions page for App Engine.

    Go to Versions

  2. Select the checkbox for the non-default app version that you want to delete.
  3. To delete the app version, click Delete.

Delete your Cloud SQL instance

To delete a Cloud SQL instance:

  1. In the Cloud Console, go to the Instances page.

    Go to Instances

  2. Click the name of the SQL instance you that want to delete.
  3. To delete the instance, click Delete, and then follow the instructions.

What's next