Настройка 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 сервер.
LEAVE YOUR COMMENT