DT Wiki

Сегодня, на базе Debian 11, установим LEMP Stack - это связка Linux, Nginx, MariaDB и PHP
Nginx - бесплатный, open-source web сервер который позволяет использовать HTTP, proxy, caching и load-balancing функционал. Отличная альтернатива Apache2, легок в установке и настройке.

Установка Nginx и вспомогательных пакетов.

sudo apt update && sudo apt -y upgrade
sudo apt install -y nginx curl wget gnupg2 ca-certificates lsb-release

Запустим сервис Nginx и добавим его в автозагрузку.

sudo systemctl enable --now nginx

Перейдём в веб браузер и наберём в адресной строке:

http://ip-адрес-сервера

Должны получить следующее приглашение.

image

В Debian 11, корневая директория хостов Nginx по умолчанию /usr/share/nginx/html/, а файлы конфигураций - /etc/nginx/.

Установка MariaDB

Установим СУБД MariaDB.

sudo apt install -y mariadb-server mariadb-client

Добавим сервис в автозагрузку и проверим статус.

sudo systemctl enable --now mariadb

Зададим пароль для root СУБД:

sudo mysqladmin -u root password

Дважды вводим пароль
Подготовим базу для WordPress

mysql -u root -p

Воодим пароль

CREATE DATABASE wpdb;
CREATE USER 'wpuser'@'localhost' IDENTIFIED BY 'СложныйПароль';
GRANT ALL PRIVILEGES ON wpdb.* TO 'wpuser'@'localhost';
FLUSH PRIVILEGES;
QUIT;

Установка PHP

Установим php с необходимыми расширениями.

sudo apt install -y php php-{fpm,pear,cgi,common,zip,mbstring,net-socket,gd,xml,xml-util,mysql,bcmath,cli,curl}

Создание виртуального хоста

Теперь создадим виртуальный хост, для проверки нашего вебсервера.
Имя сервера будет wp.home.local, создадим одноименную директорию, будем использовать стандартную директорию для создания сайтов /var/www/html:

sudo mkdir /var/www/html/home

Переназначим права для nginx

sudo chown -R www-data:www-data /var/www/html

Далее создадим конфигурационный файл хоста:

sudo nano /etc/nginx/conf.d/home.conf

Добавим следующее содержимое

server {
        listen 80;
        root /var/www/html/home;
        server_name wp.home.local;
        access_log /var/log/nginx/wp_access.log;
        error_log /var/log/nginx/wp_error.log;

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

# Specify a charset
        charset                         utf-8;
# GZIP
        gzip                            off;

# Add trailing slash to */wp-admin requests.
        rewrite /wp-admin$ $scheme://$host$uri/ permanent;

# Prevents hidden files (beginning with a period) from being served
        location ~ /\. {
                access_log                      off;
                log_not_found                   off;
                deny                            all;
}

# SEND EXPIRES HEADERS AND TURN OFF 404 LOGGING

        location ~* ^.+.(xml|ogg|ogv|svg|svgz|eot|otf|woff|mp4|ttf|css|rss|atom|js|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;
}

# Pass all .php files onto a php-fpm or php-cgi server
location ~ \.php$ {
        try_files                       $uri =404;
        include                         /etc/nginx/fastcgi_params;
        fastcgi_read_timeout            3600s;
        fastcgi_buffer_size             128k;
        fastcgi_buffers                 4 128k;
        fastcgi_param                   SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_pass                    unix:/run/php/php-fpm.sock;
        fastcgi_index                   index.php;
}

# ROBOTS

         location = /robots.txt {
               allow all;
               log_not_found off;
               access_log off;
        }

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

Проверим настройки

sudo nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

Перзагрим Nginx

sudo systemctl restart nginx

Создадим файл в корне сайта:

echo "<?php phpinfo(); ?>" | sudo tee /var/www/html/home/phpinfo.php

Пришло время проверить работоспособность сайта. Открываем браузер и переходим по ссылке http://wp.home.local/phpinfo.php

Должна отобразиться следующая страница:

image

Если вы увидели данную страницу, значит сайт работает/

Установка WordPress

Устанавим Wordpress на наш сайт.

wget https://wordpress.org/latest.tar.gz
tar xvf latest.tar.gz
sudo mv wordpress/* /var/www/html/home
cd /var/www/html/home
sudo cp wp-config-sample.php wp-config.php

Внесём актуальные данные в конфиг

sudo nano wp-config.php
define('DB_NAME', 'wpdb');
define('DB_USER', 'wpuser');
define('DB_PASSWORD', 'СложныйПароль');

переназначим права для Nginx

sudo chown -R www-data:www-data /var/www/html/home

Перейдём в браузер и набираем адрес нашего сайта

http://wp.home.local

Следуем инструкции

Перенос сайта на хост за Nginx proxy_pass

Настройка Nginx proxy

Далее нас интересуют пока только первые 11 строк, все остальное появится при установке SSL сертификата с помощью CertBot

server {
    server_name home.local;
    location /
  {
    proxy_pass http://10.20.30.40:80; # Здесь должнен быть IP адрес на который будут пробрасываться запросы
    proxy_set_header Host $host;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-Proto https;

  }

    listen 443 ssl; # managed by Certbot
    ssl_certificate /etc/letsencrypt/live/pavlovesky.com/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/pavlovesky.com/privkey.pem; # managed by Certbot
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot

}

server {
    if ($host = pavlovesky.com) {
        return 301 https://$host$request_uri;
    } # managed by Certbot


    listen 80;
    server_name pavlovesky.com;
    return 404; # managed by Certbot

Настройка Wordpress

Так же необходимо довить несколько строк в файл wp-config.php

sudo mcedit /var/www/html/home/wp-config.php

Добавляем это:

/** For HTTPS behind the proxy_pass. */

if($_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https'){
    $_SERVER['HTTPS'] = 'on';
    $_SERVER['SERVER_PORT'] = 443;
    }

Важно, добавляем эти строки сразу после этих:

/** The Database Collate type. Don't change this if in doubt. */
define('DB_COLLATE', '');

Должно получиться, что то вроде:
wp-config.png