Установка (LEMP) NGINX, MariaDB, PHP в ArchLinux

Установка и настройка популярной связки LEMP для работы веб-сервера.

LEMP это акроним от Linux, NGINX (с англ. Engine X), MySQL и PHP. Набор открытого программного обеспечения, который в связке помогает развернуть веб-сервер.

Установка MariaDB (MySQL)

Убедимся что система обновлена и установим пакет MariaDB.

# pacman -S mysql
:: Найдено 2 поставщика для mysql:
:: Репозиторий extra
1) mariadb
:: Репозиторий community
2) percona-server

Подтверждаем выбор репозитория extra вводом 1 или по умолчанию Enter. Будут установлены необходимые пакеты и их зависимости.

По завершении будет предложено инициализировать каталог данных MariaDB:

:: You need to initialize the MariaDB data directory prior to starting
the service. This can be done with mysql_install_db command, e.g.:
mysql_install_db --user=mysql --basedir=/usr --datadir=/var/lib/mysql

По умолчанию MySQL работает от пользователя, который запустил сервис. Для того, чтобы изменить это используем ключ --user=mysql.

mysql_install_db --user=mysql --basedir=/usr --datadir=/var/lib/mysql

Запускаем сервис.

systemctl start mysqld

Добавляем в автозапуск.

systemctl enable mysqld

Базовая конфигурация MySQL

Запускаем скрипт базовой настройки.

mysql_secure_installation

Или так:

/usr/bin/mysql_secure_installation

Выполняем все шаги настройки.

Enter current password for root (enter for none):
Set root password? [Y/n] y
Remove anonymous users? [Y/n] y
Disallow root login remotely? [Y/n] y
Remove test database and access to it? [Y/n] y
Reload privilege tables now? [Y/n] y

Подключаемся к базе для проверки работоспособности.

# mysql -uroot -p
Enter password:
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 11
Server version: 10.1.17-MariaDB MariaDB Server
Copyright (c) 2000, 2016, Oracle, MariaDB Corporation Ab and others.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
MariaDB [(none)]>

Теперь внесем некоторые изменения в конфигурационный файл /etc/mysql/my.cnf

В секции [mysqld] раскомментируем опцию skip-external-locking и bind-address:

skip-external-locking - опция указывает MySQL-серверу не использовать внешние блокировки при работе с базой. Внешние блокировки необходимы в ситуациях, когда несколько серверов работают с одними и теми же файлами данных, т.е. имеют одинаковую datadir, что на практике не используется.

bind-address - интерфейс, который будет слушать сервер. В целях безопасности рекомендуется установить здесь 127.0.0.1, если не планируется использовать внешние соединения с сервером. Если требуется доступ из внешней сети, то указываем соответствующие значения и не забываем настроить фильтры.

Установка NGINX

Выполняем установку NGINX.

pacman -S nginx

Создаем директорию где будет храниться контент сайта.

mkdir -p /srv/http/example.com/public
mkdir /srv/http/example.com/logs
chown -R http:http /srv/http/example.com

Я использую пользователя и группу http, потому что php-fpm по-умолчанию их использует. Можно изменить это в настройках.

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

mkdir /etc/nginx/sites-available
mkdir /etc/nginx/sites-enabled

sites-available - в каталоге хранятся конфигурационные файлы сайтов.
sites-enabled - в каталоге создаются симлинки на файлы в директории sites-available для удобного включения/отключения сайтов.

В конфигурационном файле /etc/nginx/nginx.conf подключаем чтение настроек сайта из созданной директории. Будьте внимательны, данную строку необходимо поместить в секцию http.

## Load virtual host conf files. ##
include /etc/nginx/sites-enabled/*;

Создаем файл в директории /etc/nginx/sites-available/ с названием хоста, в нашем случае example.com и добавим туда следующие настройки:

server {
server_name example.com;
access_log /srv/http/example.com/logs/access.log;
error_log /srv/http/example.com/logs/error.log;
root /srv/http/example.com/public;
location / {
#try_files $uri $uri/ /index.html;
index index.htm index.html index.php;
}
location ~ /\. {
deny all;
access_log off;
log_not_found off;
}
location ~ \.(js|css|png|jpg|gif|swf|ico|pdf|mov|fla|zip|rar)$ {
try_files $uri =404;
}
# Отключаем логирование для robots.txt
location = /robots.txt {
access_log off;
log_subrequest off;
log_not_found off;
}
# Отключаем логирование для favicon.ico
location = /favicon.ico {
access_log off;
log_subrequest off;
log_not_found off;
}
# Отключаем логирование для sitemap.xml
location = /sitemap.xml {
access_log off;
log_subrequest off;
log_not_found off;
}
# Отключаем логирование для *.css И *.js файлов
location ~* ^.+\.(css|js)$ {
access_log off;
log_subrequest off;
log_not_found off;
}
# Также отключаем логи для картинок, файлов
location ~* ^.+\.(bmp|gif|jpg|jpeg|ico|png|swf)$ {
access_log off;
log_subrequest off;
log_not_found off;
}
# Подключаем обработчик php-fpm
location ~ \.php$ {
include /etc/nginx/fastcgi_params;
fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock;
# fastcgi_pass 127.0.0.1:9000; ## Если работаем не по сокетам
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /srv/http/example.com/public$fastcgi_script_name;
}
}

Подключаем наш виртуальный хост.

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

Установка PHP-FPM

Выполняем установку PHP-FPM

pacman -S php-fpm

Запускаем.

systemctl start php-fpm

Добавляем в автозагрузку.

systemctl enable php-fpm

PHP модули можно установить по своему усмотрению, например:

pacman -S php-gd php-mcrypt php-apc

Базовая настройка PHP

Производим базовую настройку PHP в конфигурационнм файле /etc/php/php.ini

cgi.fix_pathinfo - расскоментируем и выставим значение 0. Необходимо для исправления уязвимости NGINX + PHP-FPM.
date.timezone - установим часовой пояс. В PHP>=5.3 обязательная, дирректива иначе в скриптах появится Warning.
open_basedir - разрешенные пути для подключения php-скриптов. В ArchLinux по умолчанию включен, так что редактируем на свой вкус или комментируем.
expose_php - устанавливаем в Off и тем самым скрываем версию PHP от посторонних глаз.
error_reporting - устанавливаем в значение E_ALL. Показываем все ошибки.
display_errors - устанавливаем в On. Тоже самое.

Проверим выполненные действия. Создадим PHP скрипт в корневой директории сайта /srv/http/example.com/public/info.php.

<?php
phpinfo();

На этом установка завершена.

Поделиться Комментарии