139 0

Настройка LEMP сервера

Содержание:
Настройка общих параметров
Настройка учётных записей
Авторизации по ключу
Настройка стека LEMP (Linux, Nginx, MySQL, PHP)
Установка Nginx
Установка базы данных MariaDB
Создание базы данных и пользователя
Установка PHP
Виртуальные хосты в Nginx
Настройка файрвола
Управление процессами Nginx
Логи
Каталоги
Установка CMS на LEMP (На примере WordPress)
Установка WordPress
Настройка WordPress

Настройка общих параметров

Настройка учётных записей

Создадим нового пользователя.

 adduser sammy

Переключимся на нового пользователя и запретим root доступ к серверу, для повышения безопасности последнего

 su - sammy
nano /etc/ssh/sshd_config

Параметр запрещения удаленного root-доступа
PermitRootLogin no
Также есть интересный параметр разрешения соединения только определенным пользвателям
AllowUsers user1 [user2] [user3] …

Авторизации по ключу

Как бы ни был хорош ваш пароль, он никогда не будет лучше ключа. Генерируем пару ключей на своей локальной машине, если их ещё нет:

ssh-keygen

Копируем со своей машины ключи на удалённый сервер

ssh-copy-id sammy@your_server_ip

Отключение входа по паролю

nano /etc/ssh/sshd_config

Параметры должны быть следующими
PasswordAuthentication no
PubkeyAuthentication yes
ChallengeResponseAuthentication no

Перезапускаем демон SSH, чтобы настройки вступили в силу

sudo systemctl reload sshd

Теперь никто не подберёт к нашему серверу пароль, а мы будем подключатся стандартным способом, не думая о каких либо паролях:

ssh sammy@IP_адрес_сервера

Настройка стека LEMP (Linux, Nginx, MySQL, PHP)

Установка Nginx

apt-get update
apt-get install nginx

Проверим результат настроек файрвола и nginx перейдя по адресу публичного ip или домена, нам должна показаться “Welcome to nginx!”

Установка базы данных MariaDB

apt-get install mysql-server

В процессе установки сервер попросит задать и подтвердить пароль для пользователя root в MySQL.
Для настройки безопасного окружения MySQL, включим плагин валидации паролей (пароли, которые не удовлетворяют определённым критериям безопасности, будут отвергаться MySQL):

sudo mysql_secure_installation

Если всёже решились включить плагин, он предложит задать уровень надёжности паролей при валидации.
0 = LOW, 1 = MEDIUM and 2 = STRONG:
Как понимаете 2 – самый строгий уровень валидации, вы будете получать ошибки при попытке задать пароль без цифр, букв в верхнем и нижнем регистре, а также без специальных символов, а также при попытке использовать пароль, основанный на распространённых словах.
На все последующие вопросы просто вводите Y для выбора настроек по умолчанию. При этом удалятся некоторые тестовые пользователи и базы данных, будет отключена возможность удаленного доступа с учетной записью root-пользователя, и все изменения будут немедленно применены в MySQL.

Создание базы данных и пользователя

Зайдём в MySQL с использованием root-аккаунта

mysql -u root -p

Создадим базу данных wpbase

CREATE DATABASE wpbase DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;

Создадим аккаунт пользователя wpuser, его пароль и дадим ему доступ к созданной нами базе данных wpbase:

GRANT ALL ON wpbase.* TO 'wpuser'@'localhost' IDENTIFIED BY 'password';

Применить изменения

FLUSH PRIVILEGES;

Создание отдельных баз данных и аккаунтов будет весьма полезно с точки зрения безопасности и управления базами данных.

Выйти из MySQL

EXIT;

Установка PHP

Nginx не поставляется с поддержкой PHP. Потому нужно установить php-fpm (fastCGI process manager). Так Nginx сможет передавать PHP-запросы на обработку. Установим модуль и вспомогательный пакет, необходимый для взаимодействия PHP с БД:

apt-get install php-fpm php-mysql

Настройка процессора PHP. Откроем главный конфигурационный файл php-fpm.

nano /etc/php/7.0/fpm/php.ini

Найдите в файле параметр cgi.fix_pathinfo; по умолчанию он закомментирован при помощи точки с запятой и имеет значение 1.
Это значение крайне опасно, поскольку в случае если запрашиваемый файл не найден, PHP будет пытаться выполнить ближайший к нему файл. Таким образом, злоумышленник может создать вредоносный запрос, который выполнит запрещённый сценарий.
Раскомментируйте параметр и измените его значение на 0.

cgi.fix_pathinfo=0

Сохраните и закройте файл. Перезапустите PHP:

systemctl restart php7.0-fpm

Настройка Nginx для поддержки PHP

Теперь нужно настроить взаимодействие Nginx и PHP.

nano /etc/nginx/sites-available/default

Добавьте index.php как первое значение директивы index, чтобы файлы index.php обслуживались первыми.
Затем отредактируйте значение директивы server_name вместо _ укажите доменное имя или IP. Посмотреть текущее доменное имя можно командой hostname, содержится в файле /etc/hostname.
Чтобы настроить обработку PHP, нужно просто раскомментировать блок location ~.php$. Также нужно раскомментировать блок location ~ /.ht для файлов .htaccess. Строка #fastcgi_pass 127.0.0.1:9000 должна оставаться закоментированной.
Сохраните и закройте файл. Проверьте конфигурационный файл на наличие ошибок.

nginx -t

Перезагрузите Nginx

systemctl reload nginx

Тестирование установки. Убедимся, что веб-сервер успешно обслуживает файлы PHP. Для этого нужно создать тестовый файл info.php

nano /var/www/html/info.php

Вставьте в него следующий код:

<?php
phpinfo();
?>

Для проверки нужно открыть данную страницу в веб-браузере
http://доменили_IPадрес_сервера/info.php
Данная страница содержит информацию о вашем сервере, полезна для отладки и чтобы удостовериться в корректности применения настроек. Если такая страница появилась, Nginx обслуживает файлы PHP.
После проверки обязательно удалите этот файл, иначе любой пользователь сможет получить доступ к данным о сервере.

rm /var/www/html/info.php

Виртуальные хосты в Nginx

Эта настройка позволяет использовать один сервер, чтобы раздавать несколько сайтов используя один интерфейс или IP. Очень удобно для тех, кто хочет использовать один VPS для нескольких сайтов.
Создадим структуру директорий для 2 сайтов:

mkdir -p /var/www/example.com/public_html
mkdir -p /var/www/example2.com/public_html

Назначение владельцем текущего пользователя:

chown -R $USER:$USER /var/www/example.com/public_html
chown -R $USER:$USER /var/www/example2.com/public_html

Назначение прав доступа:

chmod -R 755 /var/www

Создание демо-страниц для виртуальных хостов:

nano /var/www/example.com/public_html/index.html

Со следующим содержимым:

<html>
<head>
<title>Welcome to Example.com!</title>
</head>
<bosy>
<h1>Success! The example.com virtual host is working!</h1>
</body>
</html>

Аналогичным образом можно создать и для второго сайта.

Создадим файлы виртуальных хостов. Копируем файл виртуального хоста по умолчанию /etc/nginx/sites-available/default либо создадим свой:

 nano /etc/nginx/sites-available/example.com

Со следующим конфигом:

 server {
listen 80;
listen [::]:80;
root /var/www/example.com/public_html;
index index.html index.htm index.nginx-debian.html;
server_name example.com www.example.com;
location / {
try_files $uri $uri/ =404;
}
}

Файл для второго хоста также копируется и редактируется по аналогии.
Включите файл, создав симлинк в каталоге sites-enabled:

 ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/

Таким образом example.com будет обслуживать запросы для www.example.com и example.com.
А default будет отвечать на запросы по порту 80, если они не соответствуют остальным виртуальным хостам.

Чтобы избежать проблем с памятью, которые могут возникнуть в результате добавления дополнительных имен серверов, Отредактируем файл /etc/nginx/nginx.conf. Раскоментируем строку

server_names_hash_bucket_size 64;

Перезапустим Nginx, чтобы активировать новые параметры

 systemctl restart nginx

Настройка файрвола

UFW разбирали в примере LAMP, в данном примере будем использовать iptables.

iptables -L # Посмотреть текущую конфигурацию

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

iptables -A INPUT -i lo -j ACCEPT

Заблокируем все недействительные пакеты.

iptables -A INPUT -m conntrack --ctstate INVALID -j DROP

Принимать уже установленные и связанные с ними соединения

iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

Разрешение подключения к SSH(порт 22), HTTP(порт 80) и HTTPS(порт 443) портам:

iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPT

Разрешаем ICMP, для возможности пингования

iptables -A INPUT -p icmp -j ACCEPT

Отбрасывание всего остального трафика, это предотвращает несанкционированный доступ к серверу по другим открытым портам:

iptables -A INPUT -j DROP
iptables -P FORWARD DROP

Управление процессами Nginx

nginx -t # Проверка ошибок в конфигурации Nginx
systemctl stop nginx # Остановить Nginx
systemctl start nginx # Запустить Nginx
systemctl restart nginx # Перезапуск Nginx
systemctl reload nginx # Обновить настройки Nginx, не сбрасывая соединения
systemctl enable nginx # Включить автозапуск сервиса Nginx, по умолчанию
systemctl disable nginx # Отключить автозапуск сервиса Nginx

Логи

/var/log/nginx/access.log – регистрирует все запросы, полученные веб-сервером Nginx.
/var/log/nginx/error.log – хранит все сообщения об ошибках Nginx.

Каталоги

/etc/nginx – каталог настроек nginx, в котором хранятся все конфигурационные файлы.
/etc/nginx/nginx.conf – главный конфигурационный файл Nginx, содержащий глобальные настройки веб-сервера.
/etc/nginx/sites-available/ – каталог, хранящий настроенные виртуальные хосты каждого отдельного сайта. Nginx не будет использовать эти блоки, пока ссылка на них не появится в каталоге sites-enabled. Как правило, этот каталог используется для настройки виртуальных хостов.
/etc/nginx/sites-enabled/ – каталог, хранящий включенные блоки server. Чтобы включить блок, нужно создать символьную ссылку на файл, хранящийся в каталоге sites-available.
/etc/nginx/snippets – этот каталог хранит фрагменты настроек, которые можно включить в конфигурацию Nginx. Как правило, в качестве фрагментов добавляют потенциально повторяемые сегменты конфигурации.
/var/www/html – каталог содержит текущий контент сайта. По умолчанию в нём находится только стандартная стартовая страница Nginx.

Установка CMS на LEMP (На примере WordPress)

WordPress и многие плагины требуют дополнительные расширения PHP:

apt update
apt install php-curl php-gd php-intl php-mbstring php-soap php-xml php-xmlrpc php-zip
systemctl restart php7.0-fpm # Перезапустим процесс PHP-FPM

В файле /etc/nginx/sites-available/example.com
Используя регулярное выражение для обработки запросов к статическим файлам. Отключим логирование этих запросов и настройте их кэширование (они, как правило, требуют большого количества ресурсов). Добавьте в предложенный список другие необходимые статические файлы.

server {
…
location = /favicon.ico { log_not_found off; access_log off; }
location = /robots.txt { log_not_found off; access_log off; allow all; }
location ~* .(css|gif|ico|jpeg|jpg|js|png)$ {
expires max;
log_not_found off;
}
…
}

Чтобы вместо ошибки 404 сервер передавал обработку файлу index.php, изменим:

location / {
 try_files $uri $uri/ =404;
 try_files $uri $uri/ /index.php$is_args$args;
 }
nginx -t    # Проверка ошибок в конфигурации Nginx
systemctl reload nginx # Обновить настройки Nginx

Установка WordPress

Сама установка WordPress аналогична установке на LAMP сервер.

Tagged with: ,

RELATED ARTICLES

LEAVE YOUR COMMENT

Your email address will not be published. Required fields are marked *




Скоро останутся лишь две группы работников: те, кто контролирует компьютеры, и те, кого контролируют компьютеры. Постарайтесь попасть в первую.

technicscoffee.com

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

Категории