Оглавление
1. Подходит ли Arch Linux в качестве сервера
3. Установка MariaDB или MySQL
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. В них может потребоваться небольшая корректировка с учётом путей до директорий в вашей системе.
Источники:
- Installing LEMP (Nginx, PHP, MySQL with MariaDB engine and PhpMyAdmin) in Arch Linux
- Create Virtual Hosts, Password Protect Directories and SSL Certificates using “Nginx Web Server” in Arch Linux
Близкие статьи
- Установка LAMP (Linux, Apache, MySQL/MariaDB, PHP8 и phpMyAdmin) в Arch Linux / BlackArch (84%)
- Установка ownCloud в Arch Linux / BlackArch (59.1%)
- Настройка скрытого сервиса Tor в Arch Linux / BlackArch (57.3%)
- Как установить Varnish в Arch Linux — кэширование для Apache (57.3%)
- Как настроить Python в качестве CGI модуля в Apache на Arch Linux (Manjaro, BlackArch) (55.4%)
- Установка BlackArch, часть вторая: Установка Arch (RANDOM - 50%)
Я пытался…
Начните с обновления информации о пакетах в репозитории:
А ещё лучше начать с полного обновления системы: