One place for hosting & domains

      WordPress

      Использование Ansible для установки и настройки WordPress с LAMP в Ubuntu 18.04


      Введение

      Автоматизация сервера сегодня играет важнейшую роль в системном администрировании, что вызвано расходной природой современных сред приложений. Инструменты управления конфигурацией, такие как Ansible, обычно используются для оптимизации процесса автоматизации настройки сервера путем создания стандартных процедур для новых серверов, а также снижения количества ошибок, вызванных человеческим фактором при ручной настройке.

      Ansible предлагает простую архитектуру, которая не требует установки специального программного обеспечения на узлах. Также он имеет широкий набор функций и встроенные модули, упрощающие написание скриптов автоматизации.

      В этом руководстве мы объясняем, как использовать Ansible для автоматизации шагов, описанных в руководстве по установке WordPress с LAMP в Ubuntu 18.04. WordPress — это самая популярная CMS (система управления контентом) в сети Интернет, которая позволяет пользователям создавать гибкие блоги и веб-сайты поверх бекэнда в виде базы данных MySQL и с обработкой PHP. После настройки практически все административные функции доступны через пользовательский веб-интерфейс.

      Предварительные требования

      Чтобы выполнить автоматическую настройку из сценария, который мы обсуждаем в этом руководстве, вам потребуется следующее:

      Прежде чем продолжить, вам нужно убедиться, что ваш узел управления Ansible может подключаться и выполнять команды для вашего хоста (или хостов) Ansible. Для проверки подключения ознакомьтесь с шагом 3 руководства по установке и настройке Ansible в Ubuntu 18.04.

      Что делает этот сценарий?

      Этот сценарий Ansible предоставляет альтернативу ручному запуску в соответствии с процедурой, описанной в нашем руководстве по установке WordPress с LAMP в Ubuntu 18.04.

      При запуске этого сценария будут выполняться следующие действия на ваших хостах Ansible:

      1. Установите aptitude, инструмент, который в Ansible используется в качестве альтернативы диспетчеру пакетов apt.
      2. Установите необходимые пакеты LAMP и расширения PHP.
      3. Создайте и активируйте новый VirtualHost для веб-сайта WordPress.
      4. Активируйте модуль rewrite (mod_rewrite) Apache.
      5. Отключите заданный по умолчанию веб-сайт Apache.
      6. Установите пароль для root-пользователя MySQL.
      7. Удалите анонимные учетные записи MySQL и тестовую базу данных.
      8. Создайте новую базу данных MySQL и пользователя для веб-сайта WordPress.
      9. Настройте UFW, чтобы разрешить прием трафика HTTP на настроенном порту (по умолчанию порт номер 80).
      10. Загрузите и распакуйте WordPress.
      11. Укажите корректные права владения и разрешения для директории.
      12. Настройте файл wp-config.php с помощью предоставленного шаблона.

      После завершения запуска сценария вы получите установку WordPress, запущенную поверх среды LAMP, в соответствии с опциями, которые вы определили внутри переменных конфигурации.

      Как использовать этот сценарий

      В первую очередь нам нужно получить сценарий WordPress с LAMP и его зависимости из репозитория do-community/ansible-playbooks. Нам нужно будет клонировать этот репозиторий в локальную папку внутри узла управления Ansible.

      Если вы клонировали этот репозиторий ранее, выполняя другое руководство, перейдите к вашей копии ansible-playbooks и запустите команду git pull, чтобы быть уверенным, что репозиторий содержит обновленный контент:

      • cd ~/ansible-playbooks
      • git pull

      Если вы впервые используете репозиторий do-community/ansible-playbooks, необходимо выполнить клонирование репозитория в вашу домашнюю папку с помощью следующей команды:

      • cd ~
      • git clone https://github.com/do-community/ansible-playbooks.git
      • cd ansible-playbooks

      Файлы, которые нас интересуют, находятся в папке wordpress-lamp_ubuntu1804, которая имеет следующую структуру:

      wordpress-lamp_ubuntu1804
      ├── files
      │   ├── apache.conf.j2
      │   └── wp-config.php.j2
      ├── vars
      │   └── default.yml
      ├── playbook.yml
      └── readme.md
      

      Ниже представлены все эти файлы:

      • files/apache.conf.j2: шаблон для настройки Apache VirtualHost.
      • files/wp-config.php.j2: шаблон для настройки файла конфигурации WordPress.
      • vars/default.yml: файл переменных для настройки параметров сценария.
      • playbook.yml: файл сценария, содержащий задачи, которые будут выполняться на удаленном сервере (или серверах).
      • readme.md: текстовый файл, содержащий информацию об этом сценарии.

      Мы изменим файл переменных сценария для настройки его параметров. Перейдите в директорию wordpress-lamp_ubuntu1804 и откройте файл vars/default.yml с помощью вашего редактора командной строки:

      • cd wordpress-lamp_ubuntu1804
      • nano vars/default.yml

      Этот файл содержит несколько переменных, которые требуют вашего внимания:

      vars/default.yml

      ---
      #System Settings
      php_modules: [ 'php-curl', 'php-gd', 'php-mbstring', 'php-xml', 'php-xmlrpc', 'php-soap', 'php-intl', 'php-zip' ]
      
      #MySQL Settings
      mysql_root_password: "mysql_root_password"
      mysql_db: "wordpress"
      mysql_user: "sammy"
      mysql_password: "password"
      
      #HTTP Settings
      http_host: "your_domain"
      http_conf: "your_domain.conf"
      http_port: "80"
      

      Ниже приводится список, содержащий краткое описание всех этих переменных и то, как их необходимо изменить:

      • php_modules: массив, содержащий расширения PHP, которые необходимо установить для обеспечения работоспособности вашей установки WordPress. Вам не нужно изменять эту переменную, но вам может потребоваться добавить новые расширения в список, если для вашей конкретной установки это требуется.
      • mysql_root_password: желаемый пароль для учетной записи root MySQL.
      • mysql_db: имя базы данных MySQL, которая должна быть создана для WordPress.
      • mysql_user: имя пользователя MySQL, который должен быть создан для WordPress.
      • mysql_password: пароль для нового пользователя MySQL.
      • http_host: ваше доменное имя.
      • http_conf: имя файла конфигурации, который будет создан в Apache.
      • http_port: HTTP-порт для этого виртуального хоста, где 80 — это значение по умолчанию.

      После завершения обновления переменных в vars/default.yml сохраните и закройте этот файл. Если вы используете nano, нажмите CTRL+X, Y, затем ENTER.

      Теперь мы готовы к запуску этого сценария на одном или нескольких серверах. Большинство сценариев настроены для выполнения на каждом сервере в вашем распоряжении по умолчанию. Мы можем использовать флаг -l, чтобы гарантировать, что только определенный набор серверов или отдельный сервер будут затронуты сценарием. Также мы можем использовать флаг -u, чтобы указать, какого пользователя на удаленном сервере мы будем использовать для подключения и выполнения команд сценария на удаленных хостах.

      Для выполнения сценария только на server1, подключенном как sammy, вы можете воспользоваться следующей командой:

      • ansible-playbook playbook.yml -l server1 -u sammy

      Результат должен выглядеть примерно так:

      Output

      PLAY [all] ***************************************************************************************************************************** TASK [Gathering Facts] ***************************************************************************************************************** ok: [server1] TASK [Install prerequisites] *********************************************************************************************************** ok: [server1] … TASK [Download and unpack latest WordPress] ******************************************************************************************** changed: [server1] TASK [Set ownership] ******************************************************************************************************************* changed: [server1] TASK [Set permissions for directories] ************************************************************************************************* changed: [server1] TASK [Set permissions for files] ******************************************************************************************************* changed: [server1] TASK [Set up wp-config] **************************************************************************************************************** changed: [server1] RUNNING HANDLER [Reload Apache] ******************************************************************************************************** changed: [server1] RUNNING HANDLER [Restart Apache] ******************************************************************************************************* changed: [server1] PLAY RECAP ***************************************************************************************************************************** server1 : ok=22 changed=18 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0

      Примечание. Дополнительную информацию о запуске сценариев Ansible см. в нашей шпаргалке по Ansible.

      После завершения работы сценария вы можете перейти в браузер для завершения установки WordPress оттуда.

      Перейдите на домен сервера или публичный IP-адрес:

      http://server_host_or_IP
      

      Вы увидите подобную страницу:

      Страница выбора языка WordPress

      После выбора языка, который вы хотите использовать для установки WordPress, вы перейдете к финальному этапу настройки пользователя и пароля WordPress для входа в панель управления:

      Установка WordPress

      При нажатии далее вы перейдете на страницу входа:

      Запрос данных для входа в WP

      После входа вы перейдете в панель управления WordPress:

      Панель администратора WP

      Список стандартных действий по настройке вашей установки WordPress включает выбор параметров постоянных ссылок для ваших постов (см. Settings > Permalinks) и выбор новой темы (Appearance > Themes).

      Содержание сценария

      Вы можете найти файлы для установки сервера WordPress on LAMP, который мы обсуждаем в данном руководстве, в папке wordpress-lamp_ubuntu1804 внутри репозитория DigitalOcean Community Playbooks. Чтобы скопировать или загрузить содержимое скриптов напрямую, нажмите кнопку Raw сверху каждого скрипта.

      Полное содержимое сценария, как и связанные файлы, также находятся здесь для удобства.

      vars/default.yml

      Файл переменных default.yml содержит значения, используемые в задачах сценария, в том числе параметры базы данных и доменное имя для настройки в Apache.

      vars/default.yml

      #System Settings
      php_modules: [ 'php-curl', 'php-gd', 'php-mbstring', 'php-xml', 'php-xmlrpc', 'php-soap', 'php-intl', 'php-zip' ]
      
      #MySQL Settings
      mysql_root_password: "mysql_root_password"
      mysql_db: "wordpress"
      mysql_user: "sammy"
      mysql_password: "password"
      
      #HTTP Settings
      http_host: "your_domain"
      http_conf: "your_domain.conf"
      http_port: "80"
      

      files/apache.conf.j2

      Файл apache.conf.j2 — это шаблон Jinja 2, который выполняет настройку нового VirtualHost в Apache. Переменные, используемые в этом шаблоне, определяются в файле переменных vars/default.yml.

      files/apache.conf.j2

      <VirtualHost *:{{ http_port }}>
         ServerAdmin webmaster@localhost
         ServerName {{ http_host }}
         ServerAlias www.{{ http_host }}
         DocumentRoot /var/www/{{ http_host }}
         ErrorLog ${APACHE_LOG_DIR}/error.log
         CustomLog ${APACHE_LOG_DIR}/access.log combined
      
         <Directory /var/www/{{ http_host }}>
               Options -Indexes
         </Directory>
      
         <IfModule mod_dir.c>
             DirectoryIndex index.php index.html index.cgi index.pl  index.xhtml index.htm
         </IfModule>
      
      </VirtualHost>
      

      files/wp-config.php.j2

      Файл wp-config.php.j2 — это другой шаблон Jinja, используемый для настройки основного файла конфигурации, который используется WordPress. Переменные, используемые в этом шаблоне, определяются в файле переменных vars/default.yml. Уникальные ключи аутентификации и секретные ключи генерируются с помощью hash-функции.

      files/info.php.j2

      <?php
      /**
       * The base configuration for WordPress
       *
       * The wp-config.php creation script uses this file during the
       * installation. You don't have to use the web site, you can
       * copy this file to "wp-config.php" and fill in the values.
       *
       * This file contains the following configurations:
       *
       * * MySQL settings
       * * Secret keys
       * * Database table prefix
       * * ABSPATH
       *
       * @link https://codex.wordpress.org/Editing_wp-config.php
       *
       * @package WordPress
       */
      
      // ** MySQL settings - You can get this info from your web host ** //
      /** The name of the database for WordPress */
      define( 'DB_NAME', '{{ mysql_db }}' );
      
      /** MySQL database username */
      define( 'DB_USER', '{{ mysql_user }}' );
      
      /** MySQL database password */
      define( 'DB_PASSWORD', '{{ mysql_password }}' );
      
      /** MySQL hostname */
      define( 'DB_HOST', 'localhost' );
      
      /** Database Charset to use in creating database tables. */
      define( 'DB_CHARSET', 'utf8' );
      
      /** The Database Collate type. Don't change this if in doubt. */
      define( 'DB_COLLATE', '' );
      
      /** Filesystem access **/
      define('FS_METHOD', 'direct');
      
      /**#@+
       * Authentication Unique Keys and Salts.
       *
       * Change these to different unique phrases!
       * You can generate these using the {@link https://api.wordpress.org/secret-key/1.1/salt/ WordPress.org secret-key service}
       * You can change these at any point in time to invalidate all existing cookies. This will force all users to have to log in again.
       *
       * @since 2.6.0
       */
      define( 'AUTH_KEY',         '{{ ansible_date_time.iso8601_micro | hash('sha256') }}' );
      define( 'SECURE_AUTH_KEY',  '{{ ansible_date_time.iso8601_micro | hash('sha256') }}' );
      define( 'LOGGED_IN_KEY',    '{{ ansible_date_time.iso8601_micro | hash('sha256') }}' );
      define( 'NONCE_KEY',        '{{ ansible_date_time.iso8601_micro | hash('sha256') }}' );
      define( 'AUTH_SALT',        '{{ ansible_date_time.iso8601_micro | hash('sha256') }}' );
      define( 'SECURE_AUTH_SALT', '{{ ansible_date_time.iso8601_micro | hash('sha256') }}' );
      define( 'LOGGED_IN_SALT',   '{{ ansible_date_time.iso8601_micro | hash('sha256') }}' );
      define( 'NONCE_SALT',       '{{ ansible_date_time.iso8601_micro | hash('sha256') }}' );
      
      /**#@-*/
      
      /**
       * WordPress Database Table prefix.
       *
       * You can have multiple installations in one database if you give each
       * a unique prefix. Only numbers, letters, and underscores please!
       */
      $table_prefix = 'wp_';
      
      /**
       * For developers: WordPress debugging mode.
       *
       * Change this to true to enable the display of notices during development.
       * It is strongly recommended that plugin and theme developers use WP_DEBUG
       * in their development environments.
       *
       * For information on other constants that can be used for debugging,
       * visit the Codex.
       *
       * @link https://codex.wordpress.org/Debugging_in_WordPress
       */
      define( 'WP_DEBUG', false );
      
      /* That's all, stop editing! Happy publishing. */
      
      /** Absolute path to the WordPress directory. */
      if ( ! defined( 'ABSPATH' ) ) {
          define( 'ABSPATH', dirname( __FILE__ ) . '/' );
      }
      
      /** Sets up WordPress vars and included files. */
      require_once( ABSPATH . 'wp-settings.php' );
      
      

      playbook.yml

      Файл playbook.yml — это место, где определяются все задачи из этой настройки. Он начинается с определения группы серверов, которая должна стать целью этой настройки (all), после чего использует значение become: true, чтобы определить, что задачи следует выполнять с эскалацией привилегии (sudo) по умолчанию. Затем он включает переменную vars/default.yml для загрузки вариантов конфигурации.

      playbook.yml

      ---
      - hosts: all
        become: true
        vars_files:
          - vars/default.yml
      
        tasks:
          - name: Install prerequisites
            apt: name=aptitude update_cache=yes state=latest force_apt_get=yes
            tags: [ system ]
      
          - name: Install LAMP Packages
            apt: name={{ item }} update_cache=yes state=latest
            loop: [ 'apache2', 'mysql-server', 'python3-pymysql', 'php', 'php-mysql', 'libapache2-mod-php' ]
            tags: [ system ]
      
          - name: Install PHP Extensions
            apt: name={{ item }} update_cache=yes state=latest
            loop: "{{ php_modules }}"
            tags: [ system ]
      
        # Apache Configuration
          - name: Create document root
            file:
              path: "/var/www/{{ http_host }}"
              state: directory
              owner: "www-data"
              group: "www-data"
              mode: '0755'
            tags: [ apache ]
      
          - name: Set up Apache VirtualHost
            template:
              src: "files/apache.conf.j2"
              dest: "/etc/apache2/sites-available/{{ http_conf }}"
            notify: Reload Apache
            tags: [ apache ]
      
          - name: Enable rewrite module
            shell: /usr/sbin/a2enmod rewrite
            notify: Reload Apache
            tags: [ apache ]
      
          - name: Enable new site
            shell: /usr/sbin/a2ensite {{ http_conf }}
            notify: Reload Apache
            tags: [ apache ]
      
          - name: Disable default Apache site
            shell: /usr/sbin/a2dissite 000-default.conf
            notify: Restart Apache
            tags: [ apache ]
      
        # MySQL Configuration
          - name: Set the root password
            mysql_user:
              name: root
              password: "{{ mysql_root_password }}"
              login_unix_socket: /var/run/mysqld/mysqld.sock
            tags: [ mysql, mysql-root ]
      
          - name: Remove all anonymous user accounts
            mysql_user:
              name: ''
              host_all: yes
              state: absent
              login_user: root
              login_password: "{{ mysql_root_password }}"
            tags: [ mysql ]
      
          - name: Remove the MySQL test database
            mysql_db:
              name: test
              state: absent
              login_user: root
              login_password: "{{ mysql_root_password }}"
            tags: [ mysql ]
      
          - name: Creates database for WordPress
            mysql_db:
              name: "{{ mysql_db }}"
              state: present
              login_user: root
              login_password: "{{ mysql_root_password }}"
            tags: [ mysql ]
      
          - name: Create MySQL user for WordPress
            mysql_user:
              name: "{{ mysql_user }}"
              password: "{{ mysql_password }}"
              priv: "{{ mysql_db }}.*:ALL"
              state: present
              login_user: root
              login_password: "{{ mysql_root_password }}"
            tags: [ mysql ]
      
        # UFW Configuration
          - name: "UFW - Allow HTTP on port {{ http_port }}"
            ufw:
              rule: allow
              port: "{{ http_port }}"
              proto: tcp
            tags: [ system ]
      
        # WordPress Configuration
          - name: Download and unpack latest WordPress
            unarchive:
              src: https://wordpress.org/latest.tar.gz
              dest: "/var/www/{{ http_host }}"
              remote_src: yes
              creates: "/var/www/{{ http_host }}/wordpress"
            tags: [ wordpress ]
      
          - name: Set ownership
            file:
              path: "/var/www/{{ http_host }}"
              state: directory
              recurse: yes
              owner: www-data
              group: www-data
            tags: [ wordpress ]
      
          - name: Set permissions for directories
            shell: "/usr/bin/find /var/www/{{ http_host }}/wordpress/ -type d -exec chmod 750 {} \;"
            tags: [ wordpress ]
      
          - name: Set permissions for files
            shell: "/usr/bin/find /var/www/{{ http_host }}/wordpress/ -type f -exec chmod 640 {} \;"
            tags: [ wordpress ]
      
          - name: Set up wp-config
            template:
              src: "files/wp-config.php.j2"
              dest: "/var/www/{{ http_host }}/wordpress/wp-config.php"
            tags: [ wordpress ]
      
        handlers:
          - name: Reload Apache
            service:
              name: apache2
              state: reloaded
      
          - name: Restart Apache
            service:
              name: apache2
              state: restarted
      

      Вы можете изменить эти файлы в соответствии с требованиями вашего рабочего процесса.

      Заключение

      В этом руководстве мы использовали Ansible для автоматизации процесса установки и настройки веб-сайта WordPress с LAMP на сервере Ubuntu 18.04.

      Если вы хотите включить другие задачи в этот сценарий для дальнейшей настройки сервера, ознакомьтесь с нашим вводным руководством для Ansible Введение в управление конфигурациями: создание сценариев Ansible.



      Source link

      Faster WordPress Sites With Gatsby


      Talk about the latest cutting-edge web technologies, and you find some impressive names like React.js, Vue.js, Next.js, and so on. They have opened new gateways and approaches to building websites that can serve content to users quickly.

      One framework that can increase overall site speed and load times is Gatsby.js.

      Goals of a Fast Website

      A website that loads fast entails the following perks and benefits for developers:

      • Traffic and Engagement: You get more site visitors on a fast site, which translates to better ROI and user engagement.
      • Page Ranks: Fast websites earn higher browser rankings.

      Improving Site Speed With Gatsby.js and WordPress

      Gatsby.js is a free and open-source React.js-based framework that helps developers build websites and applications. It is part of a general trend toward JAMstack (JavaScript APIs Markup) sites, which aim to increase overall site speed and load times.

      But where does Gatsby fit with WordPress, one of the most widely-used CMS options available today? Despite its usability and robust community, WordPress can pose challenges to building a modern frontend, for the following reasons:

      • Updates and Changes: WordPress is regularly updated, but it still lacks parity with other rapidly-changing front-end technologies. Staying up-to-date with these technologies adds an additional burden for the developer.
      • Continuous Integration and Deployment: Right now, few Continuous Integration/Deployment (CI/CD) options exist in the WordPress ecosystem.
      • Integration Costs: It can be challenging to integrate some of the latest front-end technologies with a WordPress application.

      Using Gatsby can address some of these limitations. In the following steps, we will show you how to integrate Gatsby with WordPress to take full advantage of both. First, we are going to configure a basic Gatsby project setup. Then, we’ll use it to fetch data from our WordPress site.

      Integrating Gatsby.js with WordPress

      First, we will set up a demo Gatsby project.

      Install the Gatsby CLI by typing the following command in your terminal:

      • npm install -g gatsby-cli

      Next, create a new Gatsby site with the following command:

      To access your site folder contents, type the following:

      Finally, start the development server to begin building your site:

      Installing the gatsby-source-wordpress Plugin

      Assuming that you have a WordPress site already set up, and you would like to have a frontend built with Gatsby.js, all you need to do is pull your existing site data into your static Gatsby site. You can do that with the gatsby-source-wordpress plugin.

      This tutorial uses the default WordPress REST API site, though you are free to use a pre-existing WordPress setup if you have one.

      Inside your terminal, type the following to install this plugin:

      • npm install gatsby-source-wordpress

      Configuring the Plugin

      Inside your gatsby-config.js file, the main Gatsby configuration file, you will add some WordPress-specific configuration options. These include your WordPress site’s baseUrl, the preferred HTTP protocol, and settings pertaining to the Advanced Custom Fields (ACF) plugin. The includedRoutes fields specifies the data we want to fetch.

      Using the demo WordPress site from the step above, the current frontend looks like this:

      For the purposes of this tutorial, add the following code to a file called gatsby-config.js:

      module.exports = {
        // ...
        plugins: [
          // ...
          {
              resolve: `gatsby-source-wordpress`,
              options: {
                  // Your WordPress source.
                  baseUrl: `demo.wp-api.org`,
                  protocol: `https`,
                  // Only fetches posts, tags and categories from the baseUrl.
                  includedRoutes: ['**/posts', '**/tags', '**/categories'],
                  // Not using ACF so putting it off.
                  useACF: false
              }
          },
        ],
      }
      

      Using Fetched WordPress Data

      Once your Gatsby site is fetching data from your WordPress source URL, it’s time to create your site pages. This is done by implementing the createPages API in the gatsby-node.jsfile, which makes the fetched data available to queries from GraphQL. At build time, the gatsby-source-wordpress plugin fetches your data, and uses it to ”automatically infer a GraphQL schema” which you can query against.

      Add the following code to a file called gatsby-node.js:

      /**
       * Implement Gatsby's Node APIs in this file.
       *
       * See: https://www.gatsbyjs.org/docs/node-apis/
       */
      
      // You can delete this file if you're not using it
      
      const path = require(`path`);
      const slash = require(`slash`);
      
      /** STEP #1: Implement the Gatsby API “createPages”. This is
       * called after the Gatsby bootstrap is finished so you have
       * access to any information necessary to programmatically
       * create pages.
       * Will create pages for WordPress pages (route : /{slug})
       * Will create pages for WordPress posts (route : /post/{slug})
       */
      exports.createPages = async ({ graphql, actions }) => {
          const { createPage } = actions;
      
          // STEP #2: Query all WordPress Posts Data.
          /** The “graphql” function allows us to run arbitrary
           * queries against the local Gatsby GraphQL schema. Think of
           * it like the site has a built-in database constructed
           *  from the fetched data that you can run queries against.
           */
          const result = await graphql(`
              {
                  allWordpressPost {
                      edges {
                          node {
                              id
                              slug
                              status
                              template
                              format
                          }
                      }
                  }
              }
          `);
      
          // Check for any errors
          if (result.errors) {
              throw new Error(result.errors);
          }
      
          // Access query results via object destructuring.
          const { allWordpressPost } = result.data;
      
          const postTemplate = path.resolve(`./src/templates/post.js`);
      
          // STEP #3: Create pages in Gatsby with WordPress Posts Data.
          /**
           * We want to create a detailed page for each
           * post node. We'll just use the WordPress Slug for the slug.
           * The Post ID is prefixed with 'POST_'
           */
          allWordpressPost.edges.forEach(edge => {
              createPage({
                  path: `/${edge.node.slug}/`,
                  component: slash(postTemplate),
                  context: {
                      id: edge.node.id
                  }
              });
          });
      };
      

      This will iterate through existing WordPress post data.

      Step #4: Creating a post.js Template

      Next, we will create a folder for templates, where you can add files for posts, pages, and layouts. For now, we will create a post.js file to fetch posts from our WordPress site.

      Add the following code to the file:

      import { graphql } from 'gatsby';
      import PropTypes from 'prop-types';
      import React, { Component } from 'react';
      import Layout from '../layouts';
      
      class PostTemplate extends Component {
          render() {
              const post = this.props.data.wordpressPost;
      
              // STEP #5: Use title and content in Gatsby.
              return (
                  <Layout>
                      <h1 dangerouslySetInnerHTML={{ __html: post.title }} />
                      <div dangerouslySetInnerHTML={{ __html: post.content }} />
                  </Layout>
              );
          }
      }
      
      PostTemplate.propTypes = {
          data: PropTypes.object.isRequired,
          edges: PropTypes.array
      };
      
      export default PostTemplate;
      
      // STEP #4: Get current WP Post data via ID.
      export const pageQuery = graphql`
          query($id: String!) {
              wordpressPost(id: { eq: $id }) {
                  title
                  content
              }
          }
      `;
      

      Examining the Final Result

      To start the development server and view the final result, type the following command in your terminal:

      You will get the link where you can access the site locally, along with other details like the number of posts, categories, and tags that are being fetched.

      Here’s a GIF that demonstrates what this will look like:


      Let’s take a look at this revamped front-end which is now powered with Gatsby.js and a WordPress back-end:

      You can see how our application is only fetching the required data from the WordPress site. This includes posts, tags and categories. To retrieve other types of data like widgets or comments, you will need to add the appropriate values to the includedRoutes option.

      Conclusion

      By following this tutorial, you now have a WordPress application backend integrated with a Gatsby.js frontend. Gatsby provides a fast web experience and brings with it added benefits that can enhance your existing WordPress site. You now have a platform for further experimentation with using Gatsby to power your site,



      Source link

      Настройка WordPress с MySQL в Kubernetes с помощью Helm


      Введение

      По мере того, как все больше разработчиков используют распределенную среду, такие инструменты, как Kubernetes, становятся центральным местом для хранения компонентов приложений, стандартизованным для динамической сборки и среды для продакшена. По мере усложнения экосистем приложений и роста популярности Kuberbetes, инструменты, помогающие управлять ресурсами внутри кластеров Kubernetes, становятся незаменимыми.

      Helm — это диспетчер пакетов с открытым исходным кодом для Kubernetes, упрощающий процесс развертывания и модернизации приложений на кластере Kubernetes, а также предоставляющий способ поиска готовых к установке приложений, упакованных в виде чартов Kubernetes, и обмена ими.

      В этом руководстве мы будем использовать Helm для настройки WordPress в кластере Kubernetes для создания веб-сайта с высокой степенью доступности. Помимо предоставляемых Kubernetes возможностей использования реальной масштабируемости и повышения доступности, подобная настройка будет помогать обеспечивать безопасность WordPress с помощью упрощенного процесса модернизации и отката обновления через Helm.

      Мы будем использовать внешний сервер MySQL, чтобы абстрагировать компонент базы данных, поскольку он может находиться в отдельном кластере или управляемой службе для расширенной доступности. После выполнения шагов, описанных в настоящем руководстве, у вас будет полностью функциональная установка WordPress в среде контейнеризированных кластеров, управляемой Kubernetes.

      Предварительные требования

      Для выполнения этого руководства вам потребуется следующее:

      Перед тем как продолжить, убедитесь, что вы сможете войти в ваш сервер MySQL, а также что у вас есть возможность подключиться к кластеру Kubernetes. При наличии нескольких кластеров, настроенных в файле конфигурации kubectl, вы должны убедиться, что вы подключаетесь к нужному кластеру, запустив следующую команду на локальном компьютере или сервере разработки:

      • kubectl config get-contexts

      Это пример вывода:

      Output

      CURRENT NAME CLUSTER AUTHINFO NAMESPACE * do-sfo2-wordpress-cluster do-sfo2-wordpress-cluster do-sfo2-wordpress-cluster-admin minikube minikube minikube

      Знак звездочки (*) указывает, какой кластер в настоящее время используется в качестве контекста по умолчанию. Если вам потребуется изменить текущий контекст, запустите:

      • kubectl config use-context context-name

      Теперь вы должны быть готовы к выполнению остальной части руководства.

      Шаг 1 — Настройка MySQL

      Во-первых, мы создадим выделенных пользователя и базу данных MySQL для WordPress, что позволит подключиться к внешним хостам. Это необходимо, поскольку наша установка WordPress будет находиться на отдельном сервере внутри кластера Kubernetes. Если у вас уже есть выделенные пользователь и база данных MySQL для WordPress, вы можете сразу перейти к следующему шагу.

      На сервере MySQL выполните вход в MySQL с помощью следующей команды:

      Вам будет предложено указать пароль, который вы задали для учетной записи root MySQL при первоначальной установке программного обеспечения. После входа MySQL отобразит командную строку, которую вы сможете использовать для создания базы данных и пользователя, которые нам потребуются для WordPress.

      Примечание. В данном руководстве мы будем создавать базу данных wordpress и пользователя wordpress_user с паролем password. Обратите внимание, что эти значения являются небезопасными и используются в качестве примера, поэтому вы должны изменить их соответствующим образом в данном руководстве.

      Для создания базы данных вы можете использовать следующее заявление:

      • CREATE DATABASE wordpress;

      Теперь мы создадим выделенного пользователя MySQL для этой базы данных:

      • CREATE USER wordpress_user IDENTIFIED BY 'password';

      Пользователь wordpress_user был создан, но у него пока нет каких-либо разрешений. Следующая команда предоставит данному пользователю доступ администратора (все права) для базы данных wordpress как в локальной, так и во внешней сети:

      • GRANT ALL PRIVILEGES ON wordpress.* TO wordpress_user@'%';

      Для обновления внутренних таблиц MySQL, которые будут управлять разрешениями, используйте следующее заявление:

      Теперь вы можете закрыть клиент MySQL с помощью следующей команды:

      Для проверки успешного внесения изменений вы снова можете войти в клиент командной строки, на этот раз используя новую учетную запись wordpress_user для аутентификации:

      • mysql -u wordpress_user -p

      Вы должны использовать тот же пароль, который вы указали при создании этого пользователя MySQL с заявлением CREATE_USER. Для подтверждения того, что ваш новый пользователь имеет доступ к базе данных wordpress, воспользуйтесь следующим заявлением:

      Вы должны увидеть следующий вывод:

      Output

      +--------------------+ | Database | +--------------------+ | information_schema | | wordpress | +--------------------+ 2 rows in set (0.03 sec)

      После подтверждения того, что база данных wordpress включена в результаты, вы можете закрыть клиент командной строки MySQL с помощью следующей команды:

      Теперь у вас есть выделенная база данных MySQL для WordPress и действительные учетные данные доступа для использования с базой данных. Поскольку наша установка WordPress будет находиться на отдельном сервере, нам нужно изменить конфигурацию MySQL, чтобы разрешить подключения с внешних хостов.

      Находясь на сервере MySQL, откройте файл /etc/mysql/mysql.conf.d/mysqld.cnf с помощью любого предпочитаемого вами редактора с командной строкой:

      • sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf

      Найдите настройку bind-address внутри файла. По умолчанию MySQL прослушивает только 127.0.0.1 (localhost). Для поддержки подключений с внешних хостов нам нужно изменить это значение на 0.0.0.0. Вот как должна выглядеть конфигурация bind-address:

      /etc/mysql/mysql.conf.d/mysqld.cnf

      
      # Instead of skip-networking the default is now to listen only on
      # localhost which is more compatible and is not less secure.
      bind-address            = 0.0.0.0
      

      Когда вы закончите внесение изменений, сохраните и закройте файл. Вам нужно будет перезапустить MySQL с помощью следующей команды:

      • sudo systemctl restart mysql

      Для проверки того, что вы сможете подключиться удаленно, запустите следующую команду на локальном компьютере или сервере разработки:

      • mysql -h mysql_server_ip -u wordpress_user -p

      Не забудьте заменить mysql_server_ip на ваш IP-адрес или имя хоста сервера MySQL. Если подключение будет выполнено без ошибок, вы можете перейти к следующему шагу.

      Шаг 2 — Установка WordPress

      Теперь, когда у нас есть вся информация для подключения к базе данных MySQL, мы можем перейти к установке WordPress с помощью Helm.

      По умолчанию чарт WordPress устанавливает MariaDB на отдельном поде внутри кластера и использует ее в качестве базы данных WordPress. Мы хотим отключить это поведение и настроить WordPress для использования внешней базы данных MySQL. Эти и другие параметры конфигурации (например, пользователь и пароль администратора WordPress по умолчанию) можно задать при установке либо с помощью параметров командной строки, либо с помощью отдельного файла конфигурации YAML.

      Чтобы обеспечить организацию и возможность расширения, мы будем использовать файл конфигурации.

      На локальном компьютере или сервере разработки создайте новую директорию для настроек проекта и перейдите в нее:

      • mkdir myblog-settings
      • cd myblog-settings

      Далее создайте файл с именем values.yaml с помощью текстового редактора на ваш выбор:

      Внутри файла нам нужно задать несколько параметров, которые будут определять, как WordPress подключается к базе данных, а также добавить базовую информацию для вашего сайта и первоначального пользователя с правами администратора для входа в WordPress, когда установка будет завершена.

      При создании нашей конфигурации мы будем опираться на файл values.yaml по умолчанию из чарта WordPress Helm. Раздел Blog/Site Info (Информация о блоге/сайте) содержит общие параметры блога WordPress, например, название блога и первоначальные учетные данные пользователя. Раздел Database Settings (Настройки базы данных) данного файла содержит параметры для подключения к удаленному серверу MySQL. MariaDB отключается в заключительном разделе.

      Скопируйте следующее содержимое в файл values.yaml, заменив выделенные значения на собственные:

      values.yaml

      
      ## Blog/Site Info
      wordpressUsername: sammy
      wordpressPassword: password
      wordpressEmail: [email protected]
      wordpressFirstName: Sammy
      wordpressLastName: the Shark
      wordpressBlogName: Sammy's Blog!
      
      ## Database Settings
      externalDatabase:
        host: mysql_server_ip
        user: wordpress_user
        password: password
        database: wordpress
      
      ## Disabling MariaDB
      mariadb:
        enabled: false
      

      Мы успешно настроили следующие параметры:

      • wordpressUsername: логин пользователя WordPress.
      • wordpressPassword: пароль пользователя WordPress.
      • wordpressEmail: электронная почта пользователя WordPress.
      • wordpressFirstName: имя пользователя WordPress.
      • wordpressLastName: фамилия пользователя WordPress.
      • wordpressBlogName: название сайта или блога.
      • host: IP-адрес или имя хоста сервера MySQL.
      • user: пользователь MySQL.
      • password: пароль MySQL.
      • database: имя базы данных MySQL.

      Когда вы закончите редактирование, сохраните файл и закройте редактор.

      Теперь, когда у нас есть все параметры, настало время запустить helm для установки WordPress. Следующая команда указывает helm установить самую последнюю стабильную версию чарта WordPress с именем myblog с помощью файла конфигурации values.yaml:

      • helm install --name myblog -f values.yaml stable/wordpress

      Вывод должен выглядеть примерно следующим образом:

      Output

      NAME: myblog LAST DEPLOYED: Fri Jan 25 20:24:10 2019 NAMESPACE: default STATUS: DEPLOYED RESOURCES: ==> v1/Deployment NAME READY UP-TO-DATE AVAILABLE AGE myblog-wordpress 0/1 1 0 1s ==> v1/PersistentVolumeClaim NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE myblog-wordpress Pending do-block-storage 1s ==> v1/Pod(related) NAME READY STATUS RESTARTS AGE myblog-wordpress-5965f49485-8zfl7 0/1 Pending 0 1s ==> v1/Secret NAME TYPE DATA AGE myblog-externaldb Opaque 1 1s myblog-wordpress Opaque 1 1s ==> v1/Service NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE myblog-wordpress LoadBalancer 10.245.144.79 <pending> 80:31403/TCP,443:30879/TCP 1s (...)

      После завершения установки служба с именем myblog-wordpress создается внутри кластера Kubernetes, но может потребоваться несколько минут, пока контейнер будет готов и информация об External-IP (Внешний IP) станет доступна. Чтобы проверить статус этой службы и получить внешний IP-адрес, запустите:

      Вывод должен выглядеть примерно следующим образом:

      Output

      NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.245.0.1 <none> 443/TCP 20h myblog-wordpress LoadBalancer 10.245.144.79 203.0.113.110 80:31403/TCP,443:30879/TCP 3m40s

      Эта команда предоставляет подробную информацию о службах, запущенных на кластере, включая имя и тип службы, а также IP-адреса, используемые этими службами. Как видно из вывода, установка WordPress обслуживается как myblog-wordpress на внешнем IP-адресе 203.0.113.110.

      Примечание. Если вы используете minikube для проверки этой настройки, вам нужно будет запустить команду minikube service myblog-wordpress для получения доступа к веб-серверу контейнера, что позволит получить доступ из браузера.

      Теперь ваша установка WordPress готова к работе. Для доступа к интерфейсу администратора используйте публичный IP-адрес, полученный из вывода команды kubectl get services, за которым следует /wp-admin, в браузере:

      http://203.0.113.110/wp-admin
      

      Экран входа

      Вы должны использовать учетные данные, определенные в файле values.yaml, для входа и начала настройки сайта WordPress.

      Шаг 3 — Обновление WordPress

      Из-за своей популярности WordPress часто становится целью злоумышленников, поэтому очень важно своевременно обновлять ее. Мы можем обновлять версии Helm с помощью команды helm upgrade.

      Чтобы вывести список всех ваших текущих версий, запустите следующую команду на локальном компьютере или сервере разработки:

      Результат должны выглядеть примерно следующим образом:

      Output

      NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE myblog 1 Fri Jan 25 20:24:10 2019 DEPLOYED wordpress-5.1.2 5.0.3 default

      Как видно из вывода, наша версия WordPress — 5.0.3 (версия приложения), в то время как версия в чарте — 5.1.2. Если вы хотите обновить версию на более новую в чарте, обновите репозитории Helm с помощью следующей команды:

      Вы должны получить следующий вывод:

      Output

      Hang tight while we grab the latest from your chart repositories... ...Skip local chart repository ...Successfully got an update from the "stable" chart repository Update Complete. ⎈ Happy Helming!⎈

      Теперь вы можете проверить, доступна ли в чарте WordPress более новая версия:

      • helm inspect chart stable/wordpress

      Результат должен выглядеть примерно следующим образом:

      Output

      apiVersion: v1 appVersion: 5.1.1 description: Web publishing platform for building blogs and websites. engine: gotpl home: http://www.wordpress.com/ icon: https://bitnami.com/assets/stacks/wordpress/img/wordpress-stack-220x234.png keywords: - wordpress - cms - blog - http - web - application - php maintainers: - email: [email protected] name: Bitnami name: wordpress sources: - https://github.com/bitnami/bitnami-docker-wordpress version: 5.9.0

      Как видно из вывода, есть новый чарт (версия 5.9.0) с WordPress 5.1.1 (версия приложения). Если вы хотите обновить вашу версию WordPress на самую последнюю версию, доступную в чарте WordPress, запустите следующую команду:

      • helm upgrade -f values.yaml myblog stable/wordpress

      Эта команда будет генерировать вывод, аналогичный выводу команды helm install. Важно предоставить тот же файл конфигурации, который мы использовали при первой установке чарта WordPress, потому что он содержит пользовательские настройки базы данных, которые мы определили при установке.

      Теперь, если вы снова запустите helm list, вы должны будете увидеть обновленную информацию о вашей версии:

      Output

      NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE myblog 2 Fri May 3 14:51:20 2019 DEPLOYED wordpress-5.9.0 5.1.1 default

      Вы успешно обновили WordPress до последней версии из чарта WordPress.

      Откат версии

      При каждом обновлении версии Helm создает новый выпуск данной версии. Выпуск задает фиксированную точку сохранения, в которую вы можете вернуться, если все будет работать, как ожидалось. Это похоже на commit в Git, потому что в этом случае создается история изменений, которые можно сравнить и откатывать. Если при обновлении что-то пойдет не так, вы всегда можете откатиться к предыдущему выпуску определенной версии Helm с помощью команды helm rollback:

      • helm rollback release-name revision-number

      Например, если мы хотим отменить обновление и откатиться к первой версии WordPress, мы должны воспользоваться следующей командой:

      В результате будет выполнен откат к первой версии нашей установки WordPress. Вы должны получить следующий вывод, показывающий, что откат изменений выполнен успешно:

      Output

      Rollback was a success! Happy Helming!

      Выполните команду helm list снова, и вывод должен показывать, что версия WordPress была понижена до 5.0.3, а версия чарта — 5.1.2:

      Output

      NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE myblog 3 Mon Jan 28 22:02:42 2019 DEPLOYED wordpress-5.1.2 5.0.3 default

      Обратите внимание, что при откате к предыдущей версии создается новый выпуск, опирающийся на заданную при откате версию. Наша версия WordPress с именем myblog в настоящий момент имеет номер выпуска три, которая опирается на версию номер один.

      Заключение

      В этом руководстве мы установили WordPress с внешним сервером MySQL на кластере Kubernetes с помощью инструмента командной строки Helm. Также мы узнали, как обновить версию WordPress до новой версии чарта, а также как откатить назад версию, если в процессе обновления что-то пойдет не так.

      В качестве дополнительных шагов вы можете рассмотреть настройку Nginx Ingress с Cert-Manager, чтобы активировать виртуальный хостинг на основе имен и настроить сертификат SSL для вашего сайта WordPress. Также вы должны проверить рекомендуемые настройки для продакшена в случае использования чарта WordPress, который мы задействовали в настоящем руководстве.

      Если вы хотите узнать больше о Kubernetes и Helm, ознакомьтесь с разделом Kubernetes на странице нашего сообщества.



      Source link