You are here: Home » Инструкции » LEMP (Nginx, PHP, MariaDB/MySQL и phpMyAdmin) в Arch Linux: установка, создание виртуальных хостов, защита паролем папок, включение SSL

LEMP (Nginx, PHP, MariaDB/MySQL и phpMyAdmin) в Arch Linux: установка, создание виртуальных хостов, защита паролем папок, включение SSL

Оглавление

1. Подходит ли Arch Linux в качестве сервера

2. Установка Nginx

3. Установка MariaDB или MySQL

4. Установка PHP

5. Установка phpMyAdmin

6. Включение PHP-FPM FastCGI

7. Включение виртуальных хостов на Nginx

8. Включение SSL с виртуальными хостами на Nginx

9. Доступ к phpMyAdmin через виртуальный хост

10. Защита директорий паролем на Nginx

11. Перенаправление с HTTP на HTTPS в Nginx

Заключение

Источники


Эта статья расскажет, как установить Nginx, PHP, MariaDB/MySQL и phpMyAdmin в Arch Linux на сервере или на домашнем компьютере. Если вместо Nginx вы хотите использовать Apache, то обратитесь к статье «Установка LAMP (Linux, Apache, MySQL/MariaDB, PHP7 и phpMyAdmin) в Arch Linux / BlackArch».

Другую информацию о настройке Arch Linux в качестве сервера (как подключить статичный IP, включить SSH, привязать доменное имя, настроить почтовый сервер и другое смотрите в разделе «Arch / BlackArch как сервер (VDS / VPS)» на главной странице этого сайта.

Подходит ли Arch Linux в качестве сервера

Можно встретить мнение, что из-за того, что Arch Linux это Rolling Release, в котором часто обновляются программы и используется самое последнее программное обеспечение, он не совсем подходит выступать в качестве сервера для обеспечения надёжных сетевых подключений, ведь это требует дополнительного времени для поддержки, непрерывных обновлений и конфигурации чувствительных файлов. Я несколько раз уже рассуждал на эту тему и я по-прежнему придерживаюсь мнения, что Arch Linux ничем не хуже в качестве сервера, чем другие дистрибутивы. В конце концов, если всё настроено и работает, необязательно каждую неделю делать обновления ядра. В качестве эксперимента, у меня работает сервер на Arch Linux (к моменту написания этой инструкции) уже третий год, сайт SuIP.biz. В качестве веб-сервера там используется Apache.

Установка Nginx

Установка Nginx выполняется следующей командой:

sudo pacman -S nginx

Запустите службу:

sudo systemctl start nginx

И проверьте её статус:

sudo systemctl status nginx

Мы видим предупреждение, выделенное красным мы исправим его чуть позже.

Установка MariaDB или MySQL

MariaDB — это улучшенная версия MySQL. В последнее время предпочитают именно её, в том числе многие хостинг провайдеры перешли с MySQL на MariaDB.

В стандартных репозиториях Arch Linux MySQL отсутствует и её нужно устанавливать из AUR.

Для установки MariaDB выполните команду:

sudo pacman -S mysql

На выбор доступны mariadb и percona-server, выберите СУБД MariaDB.

Перед запуском службы нужно выполнить установку баз данных и заполнение таблиц, необходимых для функционирования MariaDB:

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

Следующая команда усилит безопасность окружения СУБД MariaDB/MySQL, вам будет предложено установить пароль root аккаунта баз данных, а также удалить анонимный пользовательский аккаунт, удалить тестовую базу данных и доступ root аккаунтов за пределами localhost.

sudo mysql_secure_installation

В самом начале, когда у вас спросят пароль рута, просто нажмите [Enter]. Далее на все вопросы рекомендуется отвечать Yes, а также установить пароль для аккаунта root.

Примечание: не путайте root аккаунта MariaDB/MySQL и пользователя root операционной системы Linux — это две совершенно разные вещи. У них одинаковое имя пользователя, но они работают на разных уровнях.

Запускаем и проверяем статус службы:

sudo systemctl start mysqld
sudo systemctl status mysqld

Чтобы проверить безопасность входа MariaDB, используйте команду:

mysql -u root -p

после которой вам нужно ввести пароль.

Для выхода, наберите команду

exit;

Установка PHP

Теперь мы добрались до установки PHP — скриптового языка на стороне сервера. Он нужен для запуска сложных динамических веб-приложений, а не только обслуживания HTML/CSS кода.

Поскольку в качестве веб-сервера мы используем Nginx, нам нужно установить модуль PHP-FPM для коммуникации через Fast Common Gateway и изменения динамического контента, генерируемого PHP скриптами.

Выполните следующие команды для установки PHP-FPM службы, запуски фонового процесса и проверки статуса:

sudo pacman -S php php-fpm
sudo systemctl start php-fpm
sudo systemctl status php-fpm

Для просмотра всех доступных PHP модулей выполните следующие команды:

sudo pacman -S php[TAB]
pacman -Ss php-

Установка phpMyAdmin

Установим последний элемент веб-сервера — phpMyAdmin. Это веб-интерфейс для управления базами данных MariaDB/MySQL. Выполните следующую команду, для установки phpMyAdmin и необходимого для него PHP модуля, а также для создания символической ссылки, указывающей из расположения phpMyAdmin на дефолтный корневой путь Nginx:

sudo pacman -S phpmyadmin openssl
sudo ln -s /usr/share/webapps/phpMyAdmin /usr/share/nginx/html

Теперь нам нужно настроить файл php.ini чтобы включить необходимые для phpMyAdmin расширения:

sudo vim /etc/php/php.ini

Найдите и раскомментируйте (удалите ; в начале) следующие строки:

extension=bz2
extension=iconv
extension=imap
extension=mysqli
extension=pdo_mysql
extension=zip
mysqli.allow_local_infile = On

В этом же файле найдите строку

;session.save_path = "/tmp"

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

session.save_path = "/tmp"

Также в этом же файле найдите и укажите расположение для выражения open_basedir и добавьте системный путь phpMyAdmin (/etc/webapps/ и /usr/share/webapps/) чтобы убедиться, что PHP имеет доступ для чтения файлов в этих директориях (Если вы ещё меняете путь виртуальных хостов DocumentRoot с /srv/http на другое расположение вам также нужно добавить сюда новые пути). При использовании путей по умолчанию, эта директива должна выглядеть так:

open_basedir= /srv/http/:/home/:/tmp/:/usr/share/pear/:/usr/share/webapps/:/etc/webapps/:/usr/share/nginx/html

Включение PHP-FPM FastCGI

Следующим шагом мы включим PHP-FPM FastCGI на директиве localhost Nginx. Сделаем резервную копию файла конфигурации веб-сервера nginx.conf:

sudo mv /etc/nginx/nginx.conf /etc/nginx/nginx.conf.bak

Создайте новый файл:

sudo vim /etc/nginx/nginx.conf

И скопируйте в него следующее:

#user html;

worker_processes  2;

#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;
#pid        logs/nginx.pid;

events {
	worker_connections  1024;
}

http {
	include       mime.types;
	default_type  application/octet-stream;
	sendfile        on;

	#tcp_nopush     on;
	#keepalive_timeout  0;

	keepalive_timeout  65;

	gzip  on;

	types_hash_max_size	4096;

	server {
		listen       80;
		server_name  localhost;
		root   /usr/share/nginx/html;
		charset utf-8;
		location / {
			index  index.php index.html index.htm;
			autoindex on;
			autoindex_exact_size off;
			autoindex_localtime on;
		}

		location /phpmyadmin {
			rewrite ^/* /phpMyAdmin last;
		}

		error_page  404              /404.html;
		# redirect server error pages to the static page /50x.html
		error_page   500 502 503 504  /50x.html;

		location = /50x.html {
			root   /usr/share/nginx/html;
		}

		location ~ \.php$ {
			#fastcgi_pass 127.0.0.1:9000; (зависит от конфигурации сокета вашего php-fpm)
			fastcgi_pass unix:/run/php-fpm/php-fpm.sock;
			fastcgi_index index.php;
			include fastcgi.conf;
		}

		location ~ /\.ht {
			deny  all;
		}
	}         
}

После того, как все настройки в конфигурационных файлах сделаны, нужно только перезапустить службы Nginx и PHP-FPM

sudo systemctl restart php-fpm
sudo systemctl restart nginx

Откроем в браузере http://localhost:

Проверим работу phpMyAdmin http://localhost/phpmyadmin:

Если всё работает как задумано, то добавим службы LEMP в автозагрузку следующими командами:

sudo systemctl enable php-fpm
sudo systemctl enable nginx
sudo systemctl enable mysqld

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

Одним из самых простых методов включения виртуальных хостов является использование выражений include в главном конфигурационном файле Nginx, который делает работу последующих настроек более простой и эффективной, поскольку вы можете создавать простые файлы для каждого хоста и поддерживать главный конфигурационный файл не захламлённым.

Этот подход работает тем же образом, как и на веб-сервере Apache. Первое, что вам нужно сделать, это указать новый путь, откуда Nginx должен считывать конфигурационные файлы с директивами.

Для этого откройте главный файл nginx.conf, расположенный в /etc/nginx/ и внизу, перед последней круглой скобкой «}» добавьте путь, где будут находиться будущие конфигурационные файлы:

sudo vim /etc/nginx/nginx.conf

Добавляем:

include /etc/nginx/sites-enabled/*.conf;

Эта директива говорит Nginx, что он должен прочитать все файлы, которые найдёт в /etc/nginx/sites-enabled/ и которые имеют расширение .conf.

Следующий шаг — это создание директории sites-enabled и ещё одной sites-available, где будут храниться все конфигурационный файлы виртуальных хостов.

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

Настало время создать новый виртуальный хост. Этот пример будет использовать IP адрес системы в качестве имени виртуального хоста. Итак, создадим новый файл с именем name-ip.conf:

sudo vim /etc/nginx/sites-available/name-ip.conf

Добавим следующее содержимое (если вы используете Arch Linux, надеюсь для вас не нужно объяснять, что IP адрес у вас свой и как именно посмотреть IP):

server {
	listen 80;
	server_name 192.168.0.139;
	access_log /var/log/nginx/192.168.0.1393.access.log;
	error_log /var/log/nginx/192.168.0.139.error.log;
	root /srv/http;

	location / {
		index index.html index.htm index.php;
		autoindex on;
		autoindex_exact_size off;
		autoindex_localtime on;
	}

	location /phpmyadmin {
		rewrite ^/* /phpMyAdmin last;
	}

	location ~ \.php$ {
		#fastcgi_pass 127.0.0.1:9000; (зависит от конфигурации сокета вашего php-fpm)
		fastcgi_pass unix:/run/php-fpm/php-fpm.sock;
		fastcgi_index index.php;
		include fastcgi.conf;
	}
}

Директива, которая активирует виртуальный хост, это выражение server_name под прослушивающим портом. Также другой важной директивой здесь является выражение root, которое указывает виртуальному хосту Nginx быть сервером для содержимого файлов из директории /srv/http/.

Последний шаг — это создание директории /srv/http/ (если её нет), также мы делаем конфигурационный файл name-ip.conf доступным для чтения Nginx (для этого используем символическую ссылку), затем перезапускаем демон, чтобы изменения вступили в силу:

sudo mkdir /srv/http/
sudo ln -s /etc/nginx/sites-available/name-ip.conf /etc/nginx/sites-enabled/
sudo systemctl restart nginx

Чтобы проверить это, откроем веб-браузер указав IP адрес сервера. То, что мы там увидим, должно отличаться от того, что показывает http://localhost. В моём случае, на виртуальном хосте нет файлов, именно это я и наблюдаю в браузере:

Создадим на виртуальном хосте небольшой файл, который заодно проверит конфигурацию FastCGI PHP:

sudo vim /srv/http/info.php

Скопируем в этот файл:

<?php
phpinfo();

Другой метод, который разработал Matei Cezar (автор с tecmint.com) включения или отключения виртуальных хостов на Nginx является более элегантным и он вдохновлён скриптом Apache a2eniste.

Для использования этого метода создайте в текстовом редакторе новый файл с именем n2ensite в вашей папке $HOME:

vim ~/n2ensite

скопируйте в него:

#!/bin/bash

if test -d /etc/nginx/sites-available && test -d /etc/nginx/sites-enabled  ; then
	echo "-----------------------------------------------"
	else
	mkdir /etc/nginx/sites-available
	mkdir /etc/nginx/sites-enabled
fi

avail=/etc/nginx/sites-available/$1.conf
enabled=/etc/nginx/sites-enabled/
site=`ls /etc/nginx/sites-available/`

if [ "$#" != "1" ]; then
	echo "Использование скрипта: n2ensite virtual_site"
	echo -e "\nДоступные виртуальные хосты:\n$site"
	exit 0
else
	if test -e $avail; then
	sudo ln -s $avail $enabled
else
	echo -e "$avail виртуальный хост не существует! Сначала создайте!\n$site"
	exit 0
fi

if test -e $enabled/$1.conf; then
	echo "Успех!!! Теперь перезапустите сервер nginx: sudo systemctl restart nginx"
else
	echo  -e "Виртуальный хост $avail не существует!\nПросмотрите список доступных хостов:\n$site"
	exit 0
fi

fi

Сделайте его исполнимым:

sudo chmod +x ~/n2ensite

Использовать следующим образом:

sudo n2ensite ваш_виртуальный_хост

Для отключения виртуальных хостов создайте файл n2dissite:

vim ~/n2dissite

Скопируйте в него:

#!/bin/bash

avail=/etc/nginx/sites-enabled/$1.conf
enabled=/etc/nginx/sites-enabled
site=`ls /etc/nginx/sites-enabled/`

if [ "$#" != "1" ]; then
	echo "Использование: n2dissite виртуальный_хост"
	echo -e "\nДоступные виртуальные хосты: \n$site"
	exit 0
else

	if test -e $avail; then
		sudo rm  $avail
		else
		echo -e "$avail виртуальный хост не существует! Выходим!"
		exit 0
	fi

	if test -e $enabled/$1.conf; then
		echo "Ошибка!!! Не получается удалить виртуальный хост $avail!"
	else
		echo  -e "Успех! $avail был удалён!\nПожалуйста перезапустите Nginx: sudo systemctl restart nginx"
		exit 0
	fi
fi

Сделайте его исполнимым:

sudo chmod +x ~/n2dissite

Теперь оба эти скрипты для включения и отключения виртуальных хостов вы можете использовать из домашней папки, для этого при их вызове необходимо указывать путь до созданных файлов. Вы также можете скопировать (перенести) их в /usr/local/bin/ и вызывать эти файлы как системные команды:

sudo mv n2ensite n2dissite /usr/local/bin/

Включение SSL с виртуальными хостами на Nginx

SSL (Secure Sockets Layer) — это протокол, предназначенный для шифрования HTTP соединений через сеть или Интернет, в результате поток данных пересылается через безопасный канал, использующий симметричные/ассиметричные ключи шифрования. Чтобы использовать эту возможность, установите в Arch Linux пакет OpenSSL:

sudo pacman -S openssl

Для включения HTTPS подключений на Nginx нужно создать ключи виртуального хоста. Опять же, для упрощения, упомянутый автор создал небольшие скрипты, для автоматизации генерирования криптографических ключей в директорию /etc/nginx/ssl, при этом имена виртуальных хостов используются в качестве имён ключей.

Создайте файл с именем nginx_gen_ssl:

vim nginx_gen_ssl

И скопируйте в него:

#!/bin/bash

mkdir /etc/nginx/ssl
cd /etc/nginx/ssl
echo -e "Введите FQDN виртуального хоста: \nОно будет именем для Nginx  SSL сертификата!"
read cert
openssl genpkey -algorithm RSA -pkeyopt rsa_keygen_bits:2048 -out $cert.key
chmod 600 $cert.key
openssl req -new -key $cert.key -out $cert.csr
openssl x509 -req -days 365 -in $cert.csr -signkey $cert.key -out $cert.crt
echo -e "Сертификат $cert сгенерирован!\nПожалуйста, привяжите его к  вебсайту nginx с ssl!"
ls -all /etc/nginx/ssl
exit 0

FQDN (от англ. Fully Qualified Domain Name — «полностью определённое имя домена», иногда сокращается до «полное имя домена») — имя домена, не имеющее неоднозначностей в определении. Включает в себя имена всех родительских доменов иерархии DNS.

После того, как скрипт создан, добавьте права на выполнения, запустите его, введите данные для сертификата. На самом деле, в этой ситуации важным является поле Common Name и именно его необходимо заполнить, а остальные можно оставить пустыми:

sudo chmod +x nginx_gen_ssl
sudo ./nginx_gen_ssl

Когда ключи будут сгенерированы, будет выведен их список в директории /etc/nginx/ssl/:

-rw-r--r-- 1 root root 1176 авг 22 07:45 192.168.0.139.crt
-rw-r--r-- 1 root root  989 авг 22 07:45 192.168.0.139.csr
-rw------- 1 root root 1704 авг 22 07:45 192.168.0.139.key

Как и предыдущие скрипты, этот можно переместить в /usr/local/bin/ и обращаться к нему как к системной команде:

sudo mv nginx_gen_ssl /usr/local/bin

После того, как мы сгенерировали необходимые ключи для виртуального хоста Nginx с SSL, наступило время создать конфигурационный файл виртуального хоста с SSL. Я в примере буду использовать тот же самый IP адрес системы в качестве имени виртуального хоста для директивы server_name, но имя файла немного изменю, добавив ssl перед .conf, чтобы было наглядно, что это виртуальный хост name-ip с включённым SSL.

sudo vim /etc/nginx/sites-available/name-ip-ssl.conf

Содержимое конфигурационного файла:

server {
	listen 443 ssl;
	server_name 192.168.0.139;
	ssl_certificate     /etc/nginx/ssl/192.168.0.139.crt;
	ssl_certificate_key  /etc/nginx/ssl/192.168.0.139.key;
	ssl_session_cache    shared:SSL:1m;
	ssl_session_timeout  5m;
	ssl_ciphers  HIGH:!aNULL:!MD5;
	ssl_prefer_server_ciphers  on;
	access_log /var/log/nginx/192.168.0.139-ssl.access.log;
	error_log /var/log/nginx/192.168.0.139-ssl.error.log;
	root /srv/http;

	location / {
		index index.html index.htm index.php;
		autoindex on;
		autoindex_exact_size off;
		autoindex_localtime on;
	}

	location /phpmyadmin {
		rewrite ^/* /phpMyAdmin last;
	}

	location ~ \.php$ {
		#fastcgi_pass 127.0.0.1:9000; (depending on your php-fpm socket configuration)
		fastcgi_pass unix:/run/php-fpm/php-fpm.sock;
		fastcgi_index index.php;
		include fastcgi.conf;
	}
}

В этом файле порт в выражении listen изменён на 443, а также указаны файлы сертификата и ключей SSL, которые мы создали чуть раньше.

После того, как файл был создан, используйте скрипт n2ensite или команду ln для его активации (создайте символическую ссылку в директорию sites-enabled), затем перезапустите демон Nginx чтобы настройки применились:

sudo n2ensite name-ip-ssl
# ИЛИ
sudo ln -s /etc/nginx/sites-available/name-ip-ssl.conf /etc/nginx/sites-enabled/
sudo systemctl restart nginx

Вновь для проверки я открываю в браузере https://192.168.0.139, то есть с использованием протокола HTTPS. Поскольку сертификат самоподписанный, то к нему нет доверия:

С валидным сертификатом всё будет работать как надо (чтобы открыть страницу, я добавил свой локальный адрес в исключения).

Как вы можете увидеть, мы вновь видим содержимое виртуального хоста Nginx, с тем же контентом хоста name-ip, но в этот раз мы используем безопасное HTTP соединение.

Доступ к phpMyAdmin через виртуальный хост

Вы можете переключить доступ к phpMyAdmin через виртуальных хост. Это делается символической ссылкой пути /usr/share/webapps/phpMyAdmin/ указывающей на директорию виртуального хоста (/srv/http):

sudo ln -s /usr/share/webapps/phpMyAdmin/ /srv/http/

После этого на виртуальном хосте появится новая папка и вы сможете напрямую обращаться к phpMyAdmin.

Защита директорий паролем на Nginx

В отличие от Apache, Nginx использует модуль HttpAuthBasic для включения защиты папок паролем, но не предоставляет каких-либо инструментов для создания файла .htpasswd с хешем.

Чтобы сделать доступ в папку по паролю в Nginx на Arch Linux, установите веб-сервер Apache и используйте его инструменты для генерации зашифрованного файла .htaccess.

sudo pacman -S apache

Если у вас уже установлен Apache, создайте новую директорию в /etc/nginx/ с именем passwd, где будет размещён файл .htpasswd и используйте команду htpasswd с опцией -c для добавления первого пользователя, который будет иметь доступ по паролю. Затем, используя утилиту htpasswd с опцией -c, вы можете добавить больше пользователей.

sudo mkdir /etc/nginx/passwd
sudo htpasswd -c /etc/nginx/passwd/.htpasswd first_user
sudo htpasswd /etc/nginx/passwd/.htpasswd second_user
sudo htpasswd /etc/nginx/passwd/.htpasswd third_user

Чтобы защитить паролем корневую папку /srv/http/ виртуального хоста name-ip-ssl, а также все подпапки и файлы в нём, добавьте следующие инструкции внутрь блока server под директивой root конфигурационного файла виртуального хоста и укажите в нём на файл .htpasswd:

auth_basic "Restricted Website";
auth_basic_user_file /etc/nginx/passwd/.htpasswd;

После того, как вы перезапустите службу Nginx и перезагрузите страницу, вас будет встречать всплывающее окно Authentication Required с предложением ввести ваши учётные данные.

Теперь мы научились включать защиту директорий с помощью пароля на Nginx. Помните, что в то же самое время Apache установлен на вашей системе, поэтому убедитесь, что он отключён, поскольку если он каким-либо образом запустится, что это приведёт к конфликту с Nginx из-за того, что они используют одни и те же порты.

Перенаправление с HTTP на HTTPS в Nginx

Если вы хотите, чтобы браузер автоматически перенаправлял все небезопасные HTTP запросы на HTTPS протокол, откройте и отредактируйте конфигурационный файл вашего виртуального хоста, добавив следующие инструкции под директиву server_name:

rewrite        ^ https://$server_name$request_uri? Permanent;

Заключение

Все настройки, сделанные в этой статье, тестировались в Arch Linux, выполняющим роль сервера, но большинство из них, особенно касающихся конфигурационных файлов Nginx, применимы для большинства других дистрибутивов Linux. В них может потребоваться небольшая корректировка с учётом путей до директорий в вашей системе.

Источники:

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *