[Yandex Cloud documentation](../../../index.md) > [Tutorials](../../index.md) > Application solutions > Creating a website > WordPress website > [WordPress website on a MySQL® database](index.md) > Management console

# Creating a WordPress website with a MySQL® database cluster using the management console

To create an infrastructure for a [WordPress website with a MySQL® database cluster](index.md) using the Yandex Cloud management console:

To set up a WordPress website with a MySQL® cluster:
1. [Get your cloud ready](#before-you-begin).
1. [Create a VM for WordPress](#create-vm).
1. [Create a MySQL® DB cluster](#create-cluster).
1. [Configure Nginx web server](#configure-nginx).
1. [Install WordPress and additional components](#install-wordpress).
1. [Complete WordPress configuration](#configure-wordpress).
1. [Configure DNS](#configure-dns).
1. [Test the website](#test-site).

If you no longer need the resources you created, [delete them](#clear-out).

## Get your cloud ready {#before-you-begin}

Sign up for Yandex Cloud and create a [billing account](../../../billing/concepts/billing-account.md):
1. Navigate to the [management console](https://console.yandex.cloud) and log in to Yandex Cloud or create a new account.
1. On the **[Yandex Cloud Billing](https://center.yandex.cloud/billing/accounts)** page, make sure you have a billing account linked and it has the `ACTIVE` or `TRIAL_ACTIVE` [status](../../../billing/concepts/billing-account-statuses.md). If you do not have a billing account, [create one](../../../billing/quickstart/index.md) and [link](../../../billing/operations/pin-cloud.md) a cloud to it.

If you have an active billing account, you can create or select a [folder](../../../resource-manager/concepts/resources-hierarchy.md#folder) for your infrastructure on the [cloud page](https://console.yandex.cloud/cloud).

[Learn more about clouds and folders here](../../../resource-manager/concepts/resources-hierarchy.md).

### Required paid resources {#paid-resources}

* VM instance: use of computing resources, storage, public IP address, and OS (see [Compute Cloud pricing](../../../compute/pricing.md)).

* Managed Service for MySQL® cluster: computing resources allocated to hosts, size of storage and backups (see [Managed Service for MySQL® pricing](../../../managed-mysql/pricing.md)).
* Public IP addresses if public access is enabled for cluster hosts (see [Virtual Private Cloud pricing](../../../vpc/pricing.md)).
* Public DNS queries and [DNS zones](../../../dns/concepts/dns-zone.md) (see [Cloud DNS pricing](../../../dns/pricing.md)).

## Create a VM for WordPress {#create-vm}

To create a VM for WordPress:

{% list tabs group=instructions %}

- Management console {#console}

  1. On the [folder](../../../resource-manager/concepts/resources-hierarchy.md#folder) dashboard in the [management console](https://console.yandex.cloud), click ![plus](../../../_assets/console-icons/plus.svg) **Create resource** and select `Virtual machine instance`.
  1. Under **Boot disk image**, select a public image: [Debian 11](https://yandex.cloud/en/marketplace/products/yc/debian-11), [Ubuntu 20.04 LTS](https://yandex.cloud/en/marketplace/products/yc/ubuntu-20-04-lts), or [CentOS 7](https://yandex.cloud/en/marketplace/products/yc/centos-7).
  1. Under **Location**, select the [availability zone](../../../overview/concepts/geo-scope.md) where your VM will reside. If you are not sure which one to choose, leave the default.
  1. Under **Computing resources**, navigate to the `Custom` tab and specify the [platform](../../../compute/concepts/vm-platforms.md), number of vCPUs, and amount of RAM:

      * **Platform**: `Intel Ice Lake`
      * **vCPU**: `2`
      * **Guaranteed vCPU performance**: `20%`
      * **RAM**: `2 GB`
  
  1. Under **Network settings**:

      * In the **Subnet** field, select the network and subnet to connect your VM to. If the relevant [network](../../../vpc/concepts/network.md#network) or [subnet](../../../vpc/concepts/network.md#subnet) is missing, [create it](../../../vpc/operations/subnet-create.md).
      * In the **Public IP address** field, keep `Auto` to assign the VM a random external IP address from the Yandex Cloud pool or select a static address from the list if you reserved one in advance.

  1. Under **Access**, select **SSH key** and specify the VM access data:

      * In the **Login** field, enter a username, e.g., `yc-user`. Do not use `root` or other reserved usernames. To perform operations requiring root privileges, use the `sudo` command.
      * In the **SSH key** field, select the SSH key saved in your [organization user](../../../organization/concepts/membership.md) profile.
        
        If there are no SSH keys in your profile or you want to add a new key:
        
        1. Click **Add key**.
        1. Enter a name for the SSH key.
        1. Select one of the following:
        
            * `Enter manually`: Paste the contents of the public SSH key. You need to [create](../../../compute/operations/vm-connect/ssh.md#creating-ssh-keys) an SSH key pair on your own.
            * `Load from file`: Upload the public part of the SSH key. You need to create an SSH key pair on your own.
            * `Generate key`: Automatically create an SSH key pair.
            
              When adding a new SSH key, an archive containing the key pair will be created and downloaded. In Linux or macOS-based operating systems, unpack the archive to the `/home/<user_name>/.ssh` directory. In Windows, unpack the archive to the `C:\Users\<user_name>/.ssh` directory. You do not need additionally enter the public key in the management console.
        
        1. Click **Add**.
        
        The system will add the SSH key to your organization user profile. If the organization has [disabled](../../../organization/operations/os-login-access.md) the ability for users to add SSH keys to their profiles, the added public SSH key will only be saved in the user profile inside the newly created resource.

  1. Under **General information**, specify the VM name: `wp-mysql-tutorial-web`.

      {% note alert %}

      Once created, the VM gets an IP address and a [host name (FQDN)](../../../compute/concepts/network.md#hostname) for connections. If you selected `No address` in the **Public IP address** field, you will not be able to access the VM from the internet.

      {% endnote %}

  1. Click **Create VM**.

{% endlist %}

It may take a few minutes to create your VM. When the VM [status](../../../compute/concepts/vm-statuses.md) changes to `RUNNING`, proceed to the next step.

Once created, the VM is assigned a public IP address and a host name (FQDN). You can use them for SSH access.

## Create a MySQL® DB cluster {#create-cluster}

To create a MySQL® DB cluster:

{% list tabs group=instructions %}

- Management console {#console}

  1. On the folder dashboard in the [management console](https://console.yandex.cloud), click ![plus](../../../_assets/console-icons/plus.svg) **Create resource** and select **MySQL cluster**.
  1. In the **Cluster name** field, enter the name: `wp-mysql-tutorial-db-cluster`.
  1. Under **Host class**, select `s3-c2-m8`.
  1. Under **Storage size**, specify: `10 GB`.
  1. Under **Database**:
     * In the **DB name** field, enter `wp-mysql-tutorial-db`.
     * In the **Username** field, enter `wordpress`.
     * In the **Password** field, enter the password you will use to access the DB.
  1. Under **Network settings**, select the network your cluster will be connected to.


  1. Under **Hosts**, add two more [hosts](../../../managed-mysql/concepts/instance-types.md) in the other availability zones. When creating hosts, do not enable **Public access** for them.


  1. Under **DBMS settings**, click **Settings**.

     In the **default_authentication_plugin** field, select `mysql_native_password` and click **Save**.
  1. Click **Create cluster**.

{% endlist %}

Creating a DB cluster may take a few minutes.

## Configure the Nginx web server {#configure-nginx}

After the `wp-mysql-tutorial-web` VM's status changes to `RUNNING`:
1. Under **Network** on the VM page in the [management console](https://console.yandex.cloud), find the VM's public IP address.
1. [Connect](../../../compute/operations/vm-connect/ssh.md) to the VM via SSH. You can use the `ssh` utility in Linux or macOS, or [PuTTY](https://www.chiark.greenend.org.uk/~sgtatham/putty/) in Windows.

   The recommended authentication method when connecting over SSH is using a key pair. Make sure to configure the generated key pair so that the private key matches the public key sent to the VM.
1. Install Nginx, PHP-FPM process manager, and additional packages:

   {% list tabs group=operating_system %}

   - Debian/Ubuntu {#ubuntu}

      ```bash
      sudo apt-get update
      sudo apt-get install -y nginx-full php-fpm php-mysql
      sudo systemctl enable nginx
      ```

   - CentOS {#centos}

      ```bash
      sudo yum -y install epel-release
      sudo yum -y install nginx
      sudo rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
      sudo yum -y --enablerepo=remi-php74 install php php-mysql php-xml php-soap php-xmlrpc php-mbstring php-json php-gd php-mcrypt
      sudo yum -y --enablerepo=remi-php74 install php-fpm
      sudo systemctl enable nginx
      sudo systemctl enable php-fpm
      ```

   {% endlist %}

1. Use the Nginx configuration files to configure the web server:

   {% list tabs group=operating_system %}

   - Debian/Ubuntu {#ubuntu}

      1. You can edit files in the `nano` editor:

         ```bash
         sudo nano /etc/nginx/sites-available/wordpress
         ```

      1. Edit the file as follows:

         ```nginx
         server {
             listen 80 default_server;

             root /var/www/wordpress;
             index index.php;

             server_name <DNS-server_name>;

             location / {
                 try_files $uri $uri/ =404;
             }

             error_page 404 /404.html;
             error_page 500 502 503 504 /50x.html;
             location = /50x.html {
                 root /usr/share/nginx/html;
             }

             location ~ \.php$ {
                 try_files $uri =404;
                 fastcgi_split_path_info ^(.+\.php)(/.+)$;
                 fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
                 fastcgi_index index.php;
                 fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
                 include fastcgi_params;
             }
         }
         ```

      1. Allow launching your site:

         ```bash
         sudo rm /etc/nginx/sites-enabled/default
         sudo ln -s /etc/nginx/sites-available/wordpress /etc/nginx/sites-enabled/
         ```

   - CentOS {#centos}

      You can edit the files `nginx.conf` and `wordpress.conf` in the `nano` editor:
      1. Open `nginx.conf`:

         ```bash
         sudo nano /etc/nginx/nginx.conf
         ```

      1. Edit the file as follows:

         ```nginx
         user nginx;
         worker_processes auto;
         error_log /var/log/nginx/error.log;
         pid /run/nginx.pid;
         include /usr/share/nginx/modules/*.conf;

         events {
           worker_connections 1024;
         }

         http {
           log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                             '$status $body_bytes_sent "$http_referer" '
                             '"$http_user_agent" "$http_x_forwarded_for"';

           access_log  /var/log/nginx/access.log main;

           sendfile            on;
           tcp_nopush          on;
           tcp_nodelay         on;
           keepalive_timeout   65;
           types_hash_max_size 2048;

           include             /etc/nginx/mime.types;
           default_type        application/octet-stream;

           include /etc/nginx/conf.d/*.conf;
         }
         ```

      1. Open `wordpress.conf`:

         ```bash
         sudo nano /etc/nginx/conf.d/wordpress.conf
         ```

      1. Edit the file as follows:

         ```nginx
         server {
             listen 80 default_server;

             root /usr/share/nginx/wordpress/;
             index index.php;

             server_name <DNS-server_name>;

             location / {
                 try_files $uri $uri/ =404;
             }

             error_page 404 /404.html;
             error_page 500 502 503 504 /50x.html;
             location = /50x.html {
                 root /usr/share/nginx/html;
             }

             location ~ \.php$ {
                 try_files $uri =404;
                 fastcgi_split_path_info ^(.+\.php)(/.+)$;
                 fastcgi_pass 127.0.0.1:9000;
                 fastcgi_index index.php;
                 fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
                 include fastcgi_params;
             }
         }
         ```

   {% endlist %}

## Install WordPress and additional components {#install-wordpress}

1. Download and unpack the latest WordPress version:

   {% list tabs group=operating_system %}

   - Debian/Ubuntu {#ubuntu}

     ```bash
     wget https://wordpress.org/latest.tar.gz
     tar -xzf latest.tar.gz
     mv wordpress/wp-config-sample.php wordpress/wp-config.php
     sudo mv wordpress /var/www/wordpress
     sudo chown -R www-data:www-data /var/www/wordpress
     ```

   - CentOS {#centos}

     ```bash
     curl https://wordpress.org/latest.tar.gz --output latest.tar.gz
     tar -xzf latest.tar.gz
     mv wordpress/wp-config-sample.php wordpress/wp-config.php
     sudo mv wordpress /usr/share/nginx/wordpress
     sudo chown -R nginx:nginx /usr/share/nginx/wordpress/
     ```

     Change the SELinux settings:

     ```bash
     sudo semanage fcontext -a -t httpd_sys_content_t "/usr/share/nginx/wordpress(/.*)?"
     sudo semanage fcontext -a -t httpd_sys_rw_content_t "/usr/share/nginx/wordpress(/.*)?"
     sudo restorecon -R /usr/share/nginx/wordpress
     sudo setsebool -P httpd_can_network_connect 1
     ```

   {% endlist %}

1. Get WordPress security keys:

   ```bash
   curl --silent https://api.wordpress.org/secret-key/1.1/salt/
   ```

   Save the command output. You will need the keys in the next step.
1. Add the security keys to the WordPress configuration file: `wp-config.php`. You can edit files in the `nano` editor:

   {% list tabs group=operating_system %}

   - Debian/Ubuntu {#ubuntu}

     ```bash
     sudo nano /var/www/wordpress/wp-config.php
     ```

   - CentOS {#centos}

     ```bash
     sudo nano /usr/share/nginx/wordpress/wp-config.php
     ```

   {% endlist %}

   Replace the configuration section for the values from the previous step:

   ```php
   define('AUTH_KEY',         't vz,|............R lZ5]');
   define('SECURE_AUTH_KEY',  '@r&pPD............dK-A%=');
   define('LOGGED_IN_KEY',    '%6TuLl............9>/dNE');
   define('NONCE_KEY',        'DO(u.H............$?ja-e');
   define('AUTH_SALT',        '|G Vo<............Xeb.~y');
   define('SECURE_AUTH_SALT', 'Y5tIYA............7Lxf8J');
   define('LOGGED_IN_SALT',   'gR]>WZ............<>|;YY');
   define('NONCE_SALT',       '=]nQIb............HLT2:9');
   ```

1. Go to the connection configuration section for the `wp-mysql-tutorial-db-cluster` cluster:

   ```php
   // ** MySQL® settings - You can get this info from your web host. ** //
   /** The name of the database for WordPress. */

   define( 'DB_NAME', '<DB_NAME>' );
   /** MySQL® database username. */
   define( 'DB_USER', '<DB_USER>' );

   /** MySQL® database password. */
   define( 'DB_PASSWORD', '<DB_PASSWORD>' );

   /** MySQL® hostname. */
   define( 'DB_HOST', '<DB_HOST>' );
   ```

   Replace the placeholders in the file:
   * `<DB_NAME>`: `wp-mysql-tutorial-db` DB name.
   * `<DB_USER>`: `wordpress` user name.
   * `<DB_PASSWORD>`: Password you set when creating the database cluster.
   * `<DB_HOST>`: MySQL® host name in `XXXX-XXXXXXXXXX.mdb.yandexcloud.net` format.

     To find out the FQDN of your MySQL® host:

	 {% list tabs group=instructions %}

	 - Management console {#console}

	   1. Go to the MySQL® cluster page in the [management console](https://console.yandex.cloud).
       1. On the **Databases** tab next to the DB, click ![image](../../../_assets/options.svg) → **Connect**.
       1. Find the `mysql --host=ХХХХ-ХХХХХХХХХХ.mdb.yandexcloud.net` line, where `ХХХХ-ХХХХХХХХХХ.mdb.yandexcloud.net` is the FQDN of the host with the `MASTER` role.

     - CLI {#cli}

       [Get a host list](../../../managed-mysql/operations/hosts.md#list) and copy the `MASTER` host's `NAME`:

       ```bash
       yc managed-mysql host list --cluster-name <MySQL®>_cluster_name
       ```

       
       ```text
       +------------------------+----------------------+---------+--------+-------------------+-----------+
       |           NAME         |      CLUSTER ID      |  ROLE   | HEALTH |      ZONE ID      | PUBLIC IP |
       +------------------------+----------------------+---------+--------+-------------------+-----------+
       | rc1a-...mdb.yandexcloud.net | c9quhb1l32unm1sdn0in | MASTER  | ALIVE  | ru-central1-a | false     |
       | rc1b-...mdb.yandexcloud.net | c9quhb1l32unm1sdn0in | REPLICA | ALIVE  | ru-central1-b | false     |
       +------------------------+----------------------+---------+--------+-------------------+-----------+
       ```


     {% endlist %}

1. Restart Nginx and PHP-FPM:

   {% list tabs group=operating_system %}

   - Debian/Ubuntu {#ubuntu}

     ```bash
     sudo systemctl restart nginx.service
     sudo systemctl restart php7.4-fpm.service
     ```

   - CentOS {#centos}

     ```bash
     sudo systemctl restart nginx.service
     sudo systemctl restart php-fpm.service
     ```

   {% endlist %}

## Complete WordPress configuration {#configure-wordpress}

1. Under **Network** on the VM page in the [management console](https://console.yandex.cloud), find the VM's public IP address.
1. Open the VM by entering its address in your browser.
1. Select the language and click **Continue**.
1. Fill out information to access the website:
   * Enter any website name, for example, `wp-your-project`.
   * Specify the username to be used to log in to the admin panel (for example, `admin`).
   * Enter the password to be used to log in to the admin panel.
   * Enter your email address.
1. Click **Install WordPress**.
1. If the installation is successful, click **Log in**.
1. Log in to the website with the username and password specified in the previous steps. This will open the admin panel where you can start working with your website.

## Configure DNS {#configure-dns}

If you have a registered domain name, use the Cloud DNS service to manage the domain.

The tutorial below describes configuring DNS for the `example.com` domain name.

### Add a DNS zone {#create-dns-zone}

{% list tabs group=instructions %}

- Management console {#console}

   To add a [public DNS zone](../../../dns/concepts/dns-zone.md#public-zones):
   1. Navigate to **Cloud DNS** in the [folder](../../../resource-manager/concepts/resources-hierarchy.md#folder) where you need to create a [DNS zone](../../../dns/concepts/dns-zone.md).
   1. Click **Create zone**.
   1. Specify the DNS zone settings:
      * **Zone**: `example.com.`. Or specify your registered domain.
      * **Type**: `Public`.
      * **Name**: `example-zone-1`.
   1. Click **Create**.

{% endlist %}

### Add resource records {#create-dns-records}

Create DNS records in the public zone:

{% list tabs group=instructions %}

- Management console {#console}

   1. Under **Network** on the [VM](../../../compute/concepts/vm.md) page in the [management console](https://console.yandex.cloud), find the VM's [public IP address](../../../vpc/concepts/address.md#public-addresses).
   1. Create an [A](../../../dns/concepts/resource-record.md#a) record:
      * Open the **Cloud DNS** section of the folder containing the `example.com` DNS zone.
      * Select the `example.com` DNS zone from the list.
      * Click **Create record**.
      * Specify the record settings:
         * **Name**: Leave empty.
         * **Type**: Leave set to `A`.
         * **Data**: Enter your VM's public address.
         * **TTL (in seconds)** (record time to live): Keep the default value.
      * Click **Create**.
   1. Create a [CNAME](../../../dns/concepts/resource-record.md#cname) record:
      * Select the `example.com` DNS zone from the list.
      * Click **Create record**.
      * Specify the record settings:
         * **Name**: `www`.
         * **Type**: Select `CNAME`.
         * **Data**: Enter `example.com`.
         * **TTL (in seconds)** (record time to live): Keep the default value.
      * Click **Create**.

{% endlist %}

### Delegate the domain name {#delegate-domain}

Delegation is the transfer of authority from the registrar's servers to yours. For a domain, [NS](../../../dns/concepts/resource-record.md#ns) resource records (`ns1.yandexcloud.net` and `ns2.yandexcloud.net`) are created.

To delegate a domain, specify its DNS servers in the registrar's account.

Delegation does not take effect immediately. Internet provider servers normally update records within 24 hours (86,400 seconds). This depends on the TTL value which specifies how long domain records are cached.

You can check domain delegation using [Whois](https://www.reg.com/whois/check_site) or the `dig` utility:

```bash
dig +short NS example.com
```

Result:

```text
ns2.yandexcloud.net.
ns1.yandexcloud.net.
```

## Test the website {#test-site}

To test the site, enter its IP address or domain name in your browser:
* `http://<public_IP_of_VM>`
* `http://www.example.com`

To access the WordPress control panel, use `http://www.example.com/wp-admin/`.

## How to delete the resources you created {#clear-out}

To stop paying for the resources you created:
1. [Delete](../../../dns/operations/zone-delete.md) the DNS zone.
1. [Delete](../../../managed-mysql/operations/cluster-delete.md) the MySQL® cluster.
1. [Delete](../../../compute/operations/vm-control/vm-delete.md) the VM.

If you reserved a static public IP address for the VM, [delete it](../../../vpc/operations/address-delete.md).

#### See also {#see-also}

* [Creating a WordPress website with a MySQL® database cluster using Terraform](terraform.md)