Подготавливаю почву для перевода своих ресурсов с Ubuntu 16.04 (LEMP) на Ubuntu 20.04 (LEMP), обычно в роли Web-сервиса используется стек: LAMP & LEMP

  • LAMP – Linux, Apache, MySQL, PHP
  • LEMP – Linux, Nginx, MySQL, PHP

Я по большей части использую LEMP – мне этого достаточно и есть шаблоны под каждый сервис. Сейчас я хочу составить полное руководство, как установить CMS систему WordPress на Ubuntu 20.04 Server. У меня CMS WordPress – это система заметок, плюс заметки с платным доступом (приватные) где я делюсь своими секретами, рабочими моментам. Обучение бесплатным бывает только в меру.

Я все задачи разбиваю на шаги и сегодняшняя не исключение, так проще потом. Сперва обкатываю на виртуальной машине виртуального полигона, базирующегося на Debian 10 + Proxmox 6.4-13:

  • RAM = 4Gb
  • HDD: 50Gb
  • CPU = 1 sockets, 4 cores

Шаг №1: Подготавливаю сперва установленную систему из iso образа систему Ubuntu 20.04 Server к дальнейшему использованию:

ekzorchik@srv-us2004a:~$ sudo apt-get install mercurial

ekzorchik@srv-us2004a:~$ hg clone http://172.35.35.8/hg/dproject

http authorization required for http://172.35.35.8/hg/dproject

realm: Private Zone Project

user: ekzorchik

password:

destination directory: dproject

requesting all changes

adding changesets

adding manifests

adding file changes

added 32 changesets with 33 changes to 7 files (+1 heads)

new changesets 5fe9ad8f69df:1621d1772b62

updating to branch default

6 files updated, 0 files merged, 0 files removed, 0 files unresolved

ekzorchik@srv-us2004a:~$

ekzorchik@srv-us2004a:~$ sudo ./dproject/S2004

где

172.35.35.8 – это в моей домашней сети систему на которой развернут Mercurial Web где я храню наработки скриптов.

Шаг №2: Устанавливаю в систему необходимые пакеты стека LEMP (Linux, Nginx, MySQL, PHP) для разворачивания CMS сервиса WordPress который будет обслуживать мой блог(и):

ekzorchik@srv-us2004a:~$ sudo apt-get install php-cli nginx mysql-server mysql-client php-fpm php-common php-mbstring php-xmlrpc php-soap php-gd php-xml php-intl php-mysql php-cli php-zip php-curl -y

kzorchik@srv-us2004a:~$ php -v

PHP 7.4.3 (cli) (built: Aug 13 2021 05:39:12) ( NTS )

Copyright (c) The PHP Group

Zend Engine v3.4.0, Copyright (c) Zend Technologies

with Zend OPcache v7.4.3, Copyright (c), by Zend Technologies

ekzorchik@srv-us2004a:~$

ekzorchik@srv-us2004a:~$ nginx -v

nginx version: nginx/1.18.0 (Ubuntu)

Шаг №3: Произвожу настройки nginx и php:

ekzorchik@srv-us2004a:~$ sudo rm /etc/nginx/sites-available/default

ekzorchik@srv-us2004a:~$ sudo rm /etc/nginx/sites-enabled/default

ekzorchik@srv-us2004a:~$

Изменяю php.ini для себя и сервиса wordpress:

ekzorchik@srv-us2004a:~$ sudo nano /etc/php/7.4/fpm/php.ini

upload_max_filesize = 32M

post_max_size = 48M

memory_limit = 128M

max_execution_time = 300

max_input_vars = 3000

max_input_time = 60

ekzorchik@srv-us2004a:~$ sudo nano /etc/php/7.4/fpm/pool.d/www.conf

user = www-data

group = www-data

listen.owner = www-data

listen.group = www-data

ekzorchik@srv-us2004a:~$ sudo php-fpm7.4 -t

[11-Oct-2021 09:48:47] NOTICE: configuration file /etc/php/7.4/fpm/php-fpm.conf test is successful

ekzorchik@srv-us2004a:~$ sudo systemctl restart nginx php7.4-fpm

Шаг №4: Теперь нужно проверить, что Webсервис nginx успешно обрабатывает php скрипты:

ekzorchik@srv-us2004a:~$ sudo nano /etc/nginx/sites-enabled/phptest.conf
server {
        listen 80;
#        listen [::]:80;
        root /var/www/html;
        index phpinfo.php;
        server_name 172.33.33.115;
        location / {
                try_files $uri $uri/ =404;
        }
        location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
        }
}
ekzorchik@srv-us2004a:~$ sudo nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
ekzorchik@srv-us2004a:~$ sudo systemctl restart nginx php7.4-fpm.service
ekzorchik@srv-us2004a:~$ sudo nano /var/www/html/phpinfo.php
<?php phpinfo();?>
ekzorchik@srv-us2004a:~$ sudo chmod +x /var/www/html/phpinfo.php
ekzorchik@srv-us2004a:~$ sudo systemctl restart nginx php7.4-fpm.service

Если обратиться через браузер на URL адрес (http://IP&DNS/phpinfo.php) системы где проделываю действия по установке wordpress, то я должен увидеть результат выполнения скрипта phpinfo.php — представленный скриншот должен быть таким:

Проверяю работу php скриптов

ekzorchik@srv-us2004a:~$ sudo rm /etc/nginx/sites-enabled/phptest.conf

Либо через консоль:

ekzorchik@srv-us2004a:~$ php -f /var/www/html/phpinfo.php

Шаг №5: Создаю под CMS сервис WordPress базу, пользователя и пароль:

На заметку: Пароль на учетные записи в mysql должен быть длиннее 8 символов и содержать в себе: цифры, специальные символы, буквы разного регистра. К примеру: 712mbddr@!"Aa1234567

sudo mysqladmin -u root password 712mbddr@

sudo mysql -u root -p712mbddr@ -e "delete from mysql.user where user=''"

sudo mysql -u root -p712mbddr@ -e "delete from mysql.user where user='root' and host not in ('localhost','127.0.0.1','::1')"

sudo mysql -u root -p712mbddr@ -e "drop database if exists test"

sudo mysql -u root -p712mbddr@ -e "delete from mysql.db where db='test' or db='test\\_%'"

sudo mysql -u root -p712mbddr@ -e "drop database if exists db_wp"

sudo mysql -u root -p712mbddr@ -e "create database db_wp character set utf8 collate utf8_general_ci";

sudo mysql -u root -p712mbddr@ -e "drop user if exists 'us_wp'@'localhost'"

sudo mysql -u root -p712mbddr@ -e "create user 'us_wp'@'localhost' identified by '612mbddr@'"

sudo mysql -u root -p712mbddr@ -e "grant all on db_wp.* to 'us_wp'@'localhost'";

Шаг №6: Скачиваю WordPress и помещаю в директорию /var/www/html:

ekzorchik@srv-us2004a:~$ sudo wget -c https://wordpress.org/latest.tar.gz

ekzorchik@srv-us2004a:~$ tar zxf latest.tar.gz

ekzorchik@srv-us2004a:~$ rm -f latest.tar.gz

ekzorchik@srv-us2004a:~$ sudo mv wordpress /var/www/html/wordpress

ekzorchik@srv-us2004a:~$ sudo chown -R www-data:www-data /var/www/html/wordpress/

ekzorchik@srv-us2004a:~$ sudo chmod -R 755 /var/www/html/wordpress/

Шаг №7: Создаю конфигурацию описывающую поведение nginx для работы с CMS сервисом WordPress:

ekzorchik@srv-us2004a:~$ sudo nano /etc/nginx/sites-available/wordpress.conf
server {
        listen 80;
        server_name 172.33.33.115;

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

        access_log /var/log/access-wp.log;
        error_log /var/log/error-wp.log;


        location / {
                try_files $uri $uri/ /index.php?$args;
        }

        location ~ \.php$ {
                include snippets/fastcgi-php.conf;
                fastcgi_pass unix:/run/php/php7.4-fpm.sock;
                gzip on; #
                gzip_disable "msie6";
                gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript application/javascript;

        location ~ /\. {
                deny all;
                }

        location ~ /.well-known {
                allow all;
                }

        location ~* /(?:uploads|files)/.*\.php$ {
                deny all;
                }

        location ~* ^.+\.(ogg|ogv|svg|svgz|eot|otf|woff|mp4|ttf|rss|atom|jpg|jpeg|gif|png|ico|zip|tgz|gz|rar|bz2|doc|xls|exe|ppt|tar|mid|midi|wav|bmp|rtf)$ {
                access_log off;
                log_not_found off;
                expires max;
                }
}
}
ekzorchik@srv-us2004a:~$ sudo ln -s /etc/nginx/sites-available/wordpress.conf /etc/nginx/sites-enabled/wordpress.conf
ekzorchik@srv-us2004a:~$ sudo nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
ekzorchik@srv-us2004a:~$

Шаг №8: Произвожу настройку CMS WordPress на работу с базой, пользователем и паролем MySQL:

ekzorchik@srv-us2004a:~$ sudo mv /var/www/html/wordpress/wp-config-sample.php /var/www/html/wordpress/wp-config.php

ekzorchik@srv-us2004a:~$ sudo nano /var/www/html/wordpress/wp-config.php

define( 'DB_NAME', 'db_wp' );

define( 'DB_USER', 'us_wp' );

define( 'DB_PASSWORD', '612mbddr@' );

define( 'DB_HOST', 'localhost' );

define( 'DB_CHARSET', 'utf8' );

define( 'DB_COLLATE', '' );

define( 'AUTH_KEY',         '!put your unique phrase here' );

define( 'SECURE_AUTH_KEY',  '@put your unique phrase here' );

define( 'LOGGED_IN_KEY',    '#put your unique phrase here' );

define( 'NONCE_KEY',        '$put your unique phrase here' );

define( 'AUTH_SALT',        '%put your unique phrase here' );

define( 'SECURE_AUTH_SALT', '^put your unique phrase here' );

define( 'LOGGED_IN_SALT',   '&put your unique phrase here' );

define( 'NONCE_SALT',       '*put your unique phrase here' );

table_prefix = 'wp_cms_db';

ekzorchik@srv-us2004a:~$ sudo chown -R www-data:www-data /var/www/html/wordpress/

ekzorchik@srv-us2004a:~$ sudo systemctl restart nginx php7.4-fpm

Шаг №9: Затем обращаюсь через браузер с основной системы к системе где развернут WordPress и произвожу окончательную настройку:

http://172.33.33.115/wp-admin/install.php

Язык: выбираю Русский

И нажимаю "Продолжить"

Указываю именование сайта, административный логин и пароль

  • Название сайта: tips_db_home
  • Имя пользователя: ekzorchik
  • Пароль: 712mbddr@
  • Ваш e-mail: support@ekzorchik.ru

Указываю информацию именования блога

и нажимаю "Установить WordPress"

После чего, вижу

Поздравляем!

WordPress установлен. Желаем успешно работы!

Имя пользователя: ekzorchik

Пароль: Выбранный вами пароль

Нажимаю "Войти" и URL-ссылка в браузере трансформируется в http://172.33.33.115/wp-login.php

Итого WordPress успешно установлен

Шаг №10: Теперь настраиваю базовую защиту от посягательств к блогу:

ekzorchik@srv-us2004a:~$ sudo rm -rf /var/www/html/wordpress/{license.txt,readme.html}
  • Убираю болтливость nginxом путем добавления опции server_tokens off; в /etc/nginx/nginx.conf
  • Доступ к серверу с сервисом wordpress только через ssh и только через публичные ключи если не ключи, а по логину и паролю, то защищаем fail2ban + ssh (<any>/tcp)
  • Установить Брандмауэер firewall-cmd (80,22,443) и ограничить порты которые доступны на подключение к системе.
  • Настроить fail2ban для блокировки тех, кто пытается подобрать пароль к странице авторизации.
  • Доступ к сайту только через https, а для этого используем Let’s Encrypt.

Защита WordPress и сервера на Ubuntu 20.04

Итак, базовая установка WordPress on Ubuntu 20.04 Server успешно завершена в шагах. На этом заметка завершена, с уважением автор блога Олло Александр aka ekzorchik.