Вводные данные:
- Система Debian 11
- Веб сервер Nginx
- База данных MariaDB
1. Настройка системы и установка пакетов
Т.к. система у меня в контейнере то для начала нужно подготовить систему.
Обновляем систему
1 2 |
apt-get update apt-get upgrade |
Настроим часовой пояс
1 |
dpkg-reconfigure tzdata |
Далее выставим локаль
1 |
dpkg-reconfigure locales |
Нам нужно выбрать ru_RU.UTF-8 UTF-8. Так же убедитесь на всякий случай, что en_US.UTF-8 тоже выбрана. По умолчанию выбираем ее же — ru_RU.UTF-8 UTF-8
Теперь устанавливаем необходимые пакеты для нашего веб сервера.
1 |
apt install mariadb-server nginx php-fpm php-mysql php-curl php-mbstring php-zip php-gd php-imagick php-xml openssl python3-certbot-nginx |
2. Настройка MariaDB
1 |
mysql_secure_installation |
Нужно ответить на несколько вопросов:
- Вас попросят ввести пароль от root, но т.к мы его не задавали то просто жмем Enter
- Далее нажимаем Y и задаем пароль от root
- Нажим Y тем самым вырубая гостевые аккаунты
- Отключаем удаленный доступ root пользователя
- Удаляем тестовые базы
- Перезаписываем таблицы привилегий
2.1 Создание базы данных и пользователя
Подключаемся к нашему экземпляру MariaDB
1 |
mysql -uroot -p |
Вводим пароль
1 2 3 4 |
create database wordpress character set utf8 collate utf8_bin; create user wordpress@localhost identified by 'password'; grant all privileges on wordpress.* to wordpress@localhost; quit; |
3. Настройка веб сервера
Как будет все устроенно:
- /var/www/angald.ru/ — директория сайта
- /etc/nginx/sites-enabled/angald.ru.conf — конфигурация сайта
- /etc/nginx/nginxconf/ — директория доп конфигов сайта
Для начала удаляем все в директории где хранятся конфигурации сайтов
1 |
rm -rf /etc/nginx/sites-enabled/* |
Создаем директории
1 2 3 |
mkdir -p /etc/nginx/nginxconf/ mkdir -p /var/www/_letsencrypt chown www-data /var/www/_letsencrypt |
Создаем файл конфигурации для нашего сайта и заполняем его
1 |
nano /etc/nginx/sites-enabled/angald.ru.conf |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 |
server { listen 443 ssl http2; server_name angald.ru; set $base /var/www/angald.ru; root $base/; # SSL ssl_certificate /etc/letsencrypt/live/angald.ru/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/angald.ru/privkey.pem; ssl_trusted_certificate /etc/letsencrypt/live/angald.ru/chain.pem; # security include nginxconf/security.conf; # logging error_log /var/log/nginx/angald.ru.error.log warn; # index.php index index.php; # index.php fallback location / { try_files $uri $uri/ /index.php?$query_string; } # additional config include nginxconf/general.conf; include nginxconf/wordpress.conf; # handle .php location ~ \.php$ { fastcgi_pass unix:/var/run/php/php7.4-fpm.sock; include nginxconf/php_fastcgi.conf; } } # WWW redirect server { listen 443 ssl http2; server_name www.angald.ru; # SSL ssl_certificate /etc/letsencrypt/live/angald.ru/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/angald.ru/privkey.pem; ssl_trusted_certificate /etc/letsencrypt/live/angald.ru/chain.pem; return 301 https://angald.ru$request_uri; } # HTTP redirect server { listen 80; server_name .angald.ru; include nginxconf/letsencrypt.conf; location / { return 301 https://angald.ru$request_uri; } } |
С этим закончили и теперь создадим вспомогательные конфиги
1 |
nano /etc/nginx/nginxconf/general.conf |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
# favicon.ico location = /favicon.ico { log_not_found off; access_log off; } # robots.txt location = /robots.txt { log_not_found off; access_log off; } # assets, media location ~* \.(?:css(\.map)?|js(\.map)?|jpe?g|png|gif|ico|cur|heic|webp|tiff?|mp3|m4a|aac|ogg|midi?|wav|mp4|mov|webm|mpe?g|avi|ogv|flv|wmv)$ { expires 7d; access_log off; } # svg, fonts location ~* \.(?:svgz?|ttf|ttc|otf|eot|woff2?)$ { add_header Access-Control-Allow-Origin "*"; expires 7d; access_log off; } # gzip gzip on; gzip_vary on; gzip_proxied any; gzip_comp_level 6; gzip_types text/plain text/css text/xml application/json application/javascript application/rss+xml application/atom+xml image/svg+xml; |
1 |
nano /etc/nginx/nginxconf/letsencrypt.conf |
1 2 3 |
location ^~ /.well-known/acme-challenge/ { root /var/www/_letsencrypt; } |
1 |
nano /etc/nginx/nginxconf/php_fastcgi.conf |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
# 404 try_files $fastcgi_script_name =404; # default fastcgi_params include fastcgi_params; # fastcgi settings fastcgi_index index.php; fastcgi_buffers 8 16k; fastcgi_buffer_size 32k; # fastcgi params fastcgi_param DOCUMENT_ROOT $realpath_root; fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name; fastcgi_param PHP_ADMIN_VALUE "open_basedir=$base/:/usr/lib/php/:/tmp/"; |
1 |
nano /etc/nginx/nginxconf/security.conf |
1 2 3 4 5 6 7 8 9 10 11 |
# security headers add_header X-XSS-Protection "1; mode=block" always; add_header X-Content-Type-Options "nosniff" always; add_header Referrer-Policy "no-referrer-when-downgrade" always; add_header Permissions-Policy "interest-cohort=()" always; add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always; # . files location ~ /\.(?!well-known) { deny all; } |
1 |
nano /etc/nginx/nginxconf/wordpress.conf |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
# WordPress: allow TinyMCE location = /wp-includes/js/tinymce/wp-tinymce.php { include nginxconf/php_fastcgi.conf; } # WordPress: deny wp-content, wp-includes php files location ~* ^/(?:wp-content|wp-includes)/.*\.php$ { deny all; } # WordPress: deny wp-content/uploads nasty stuff location ~* ^/wp-content/uploads/.*\.(?:s?html?|php|js|swf)$ { deny all; } # WordPress: SEO plugin location ~* ^/wp-content/plugins/wordpress-seo(?:-premium)?/css/main-sitemap\.xsl$ {} # WordPress: deny wp-content/plugins (except earlier rules) location ~ ^/wp-content/plugins { deny all; } # WordPress: deny general stuff location ~* ^/(?:xmlrpc\.php|wp-links-opml\.php|wp-config\.php|wp-config-sample\.php|readme\.html|license\.txt)$ { deny all; } |
4. CERTBOOT
Вырубаем секцию с SSL
1 |
sed -i -r 's/(listen .*443)/\1; #/g; s/(ssl_(certificate|certificate_key|trusted_certificate) )/#;#\1/g; s/(server \{)/\1\n ssl off;/g' /etc/nginx/sites-enabled/angald.ru.conf |
Перезагружаем Nginx
1 |
nginx -t && systemctl reload nginx |
Получаем сертификат
1 |
certbot certonly --webroot -d angald.ru --email admin@example.com -w /var/www/_letsencrypt -n --agree-tos --force-renewal |
Возвращаем SSL
1 |
sed -i -r -z 's/#?; ?#//g; s/(server \{)\n ssl off;/\1/g' /etc/nginx/sites-enabled/angald.ru.conf |
Перезагружаем Nginx
1 |
nginx -t && systemctl reload nginx |
Настроим Certbot, чтобы перезагрузить NGINX, когда сертификаты успешно обновятся
1 2 |
echo -e '#!/bin/bash\nnginx -t && systemctl reload nginx' | tee /etc/letsencrypt/renewal-hooks/post/nginx-reload.sh chmod a+x /etc/letsencrypt/renewal-hooks/post/nginx-reload.sh |
Осталось только добавить в Cron задание по обновлению сертификата
1 2 |
crontab -e 55 23 15 * * certbot renew |
5. Установка WordPress
Далее идем на сайт и качаем последнюю версию CMS.
1 |
wget https://ru.wordpress.org/latest-ru_RU.tar.gz |
Распаковываем наш архив
1 |
tar xfv latest-ru_RU.tar.gz |
Создаем директорию для сайта копируем его и даем права
1 2 3 4 |
mkdir /var/www/angald.ru/ cp -r wordpress/* /var/www/angald.ru/ chown -R www-data:www-data /var/www/angald.ru/ chmod -R 755 /var/www/angald.ru/ |
Перезапускаем Nginx
1 |
systemctl reload nginx.service |
И можем открывать наш сайт и заканчивать установку, благо ничего сложного там нет