Создавайте виртуальные хосты, защищайте паролем каталоги и сертификаты SSL с помощью «Веб-сервера Nginx» в Arch Linux.
Предыдущая статья Arch Linux «LEMP» охватывала только базовые вещи: от установки сетевых служб (Nginx, базы данных MySQL и PhpMyAdmin) до настройки минимальной безопасности, необходимой для сервера MySQL и PhpMyadmin.
Эта тема строго связана с предыдущей установкой LEMP в Arch Linux и поможет вам настроить более сложные конфигурации для стека LEMP, особенно конфигурации веб-сервера Nginx, такие как создание виртуальных хостов. , используйте Каталоги, защищенные паролем, создайте и настройте HTTP Secure Sockets Layer, небезопасные перенаправления HTTP на HTTPS, а также представим вам несколько полезных сценариев Bash, которые облегчит работу по активации виртуальных хостов и созданию SSL-сертификата и ключей.
Требования
Установите LEMP с базой данных MariaDB в Arch Linux
Шаг 1. Включите виртуальные хосты на Nginx
Один из самых простых способов включения Виртуальных хостов — использование операторов include в основном файле конфигурации Nginx, что делает работу по дальнейшей настройке более простой и эффективной, поскольку вы можете создавать простые файлы. для каждого нового хоста и следите за чистотой основного файла конфигурации.
Этот подход работает так же, как и на Веб-сервере Apache: первое, что вам нужно сделать, это указать новый путь URI, по которому Nginx должен читать файловые директивы.
1. Итак, откройте основной файл nginx.conf, расположенный по системному пути /etc/nginx/ и внизу, перед последней фигурной скобкой « » добавьте путь, по которому будут находиться будущие файлы конфигурации виртуального хоста.
sudo nano /etc/nginx/nginx.conf
Внизу добавьте следующее утверждение.
include /etc/nginx/sites-enabled/*.conf;
Эта директива сообщает Nginx, что он должен читать все файлы, находящиеся в каталоге /etc/nginx/sites-enabled/, который заканчивается расширением .conf.
2. Следующим шагом будет создание каталога sites-enabled и еще одного под названием sites-available, в котором вы будете хранить всю конфигурацию своих виртуальных хостов. файлы.
sudo mkdir /etc/nginx/sites-available /etc/nginx/sites-enabled
3. Теперь пришло время создать новый виртуальный хост. В этом примере в качестве имени виртуального хоста будет использоваться IP-адрес системы, поэтому создайте новый файл с именем name-ip.conf.
sudo nano /etc/nginx/sites-available/name-ip.conf
Добавьте следующий контент.
## File content ##
server {
listen 80;
server_name 192.168.1.33;
access_log /var/log/nginx/192.168.1.33.access.log;
error_log /var/log/nginx/192.168.1.33.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;
}
}
Директива, активирующая виртуальный хост, — это оператор server_name под портом прослушивания. Кроме того, еще одной важной директивой здесь является оператор root, который указывает виртуальному хосту Nginx обслуживать содержимое файла по системному пути /srv/http/.
4. Последний шаг — создать каталог /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
5. Чтобы проверить это, укажите в браузере IP-адрес системы Arch, и вы увидите, что веб-контент отличается от http://localhost. Здесь я добавил небольшой PHP-скрипт, который также проверяет конфигурации FastCGI PHP, как показано на снимке экрана ниже.
sudo nano /srv/http/info.php
## File content ##
<?php
phpinfo();
?>
6. Другой метод, который я разработал для включения или отключения виртуальных хостов в Nginx, является более элегантным и основан на сценарии Apache a2eniste.
Чтобы использовать этот метод, откройте редактор файлов и создайте новый файл с именем n2ensite по пути $HOME с указанным ниже содержимым, сделайте его исполняемым и запустите его с правами root. и передайте его в качестве опции новому имени виртуального хоста без окончания .conf (заполните его, чтобы изменить его в соответствии с вашими потребностями).
sudo nano n2ensite
## File content ##
#!/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 "Use script: n2ensite virtual_site"
echo -e "\nAvailable virtual hosts:\n$site"
exit 0
else
if test -e $avail; then
sudo ln -s $avail $enabled
else
echo -e "$avail virtual host does not exist! Please create one!\n$site"
exit 0
fi
if test -e $enabled/$1.conf; then
echo "Success!! Now restart nginx server: sudo systemctl restart nginx"
else
echo -e "Virtual host $avail does not exist!\nPlease see available virtual hosts:\n$site"
exit 0
fi
fi
Сделайте его исполняемым и запустите как показано.
sudo chmod +x n2ensite
sudo ./n2ensite your_virtual_host
7. Чтобы отключить виртуальные хосты, создайте новый файл n2dissite со следующим содержимым и примените те же настройки, что и выше.
sudo nano n2dissite
## File content ##
#!/bin/bash
avail=/etc/nginx/sites-enabled/$1.conf
enabled=/etc/nginx/sites-enabled
site=`ls /etc/nginx/sites-enabled/`
if [ "$#" != "1" ]; then
echo "Use script: n2dissite virtual_site"
echo -e "\nAvailable virtual hosts: \n$site"
exit 0
else
if test -e $avail; then
sudo rm $avail
else
echo -e "$avail virtual host does not exist! Exiting!"
exit 0
fi
if test -e $enabled/$1.conf; then
echo "Error!! Could not remove $avail virtual host!"
else
echo -e "Success! $avail has been removed!\nPlease restart Nginx: sudo systemctl restart nginx"
exit 0
fi
fi
8. Теперь вы можете использовать эти два сценария для включения или отключения любого виртуального хоста, но если вы хотите применить их как общесистемные команды, просто скопируйте оба сценария в /usr/local/bin/ и тогда вы сможете использовать его без указания пути.
sudo cp n2ensite n2dissite /usr/local/bin/
Шаг 2. Включите SSL с виртуальными хостами на Nginx
SSL (Secure Sockets Layer) — это протокол, предназначенный для шифрования HTTP-соединений по сетям или Интернету, который обеспечивает передачу потока данных по защищенному каналу с использованием симметричных/асимметричных ключей шифрования. и предоставляется в Arch Linux пакетом OpenSSL.
sudo pacman -S openssl
9. Чтобы включить HTTPS-соединения с Nginx, первое, что вам нужно сделать, — это сгенерировать ключи виртуальных хостов. Кроме того, чтобы упростить задачу, я разработал небольшой скрипт, который автоматически генерирует криптографические ключи по пути к каталогу /etc/nginx/ssl, используя в качестве имен ключей имя виртуального хоста.
Создайте файл с именем nginx_gen_ssl и добавьте следующий контент.
sudo nano nginx_gen_ssl
## File content ##
#!/bin/bash
mkdir /etc/nginx/ssl
cd /etc/nginx/ssl
echo -e "Enter your virtual host FQDN: \nThis will generate the default name for Nginx SSL certificate!"
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 " The certificate $cert has been generated!\nPlease link it to nginx ssl available website!"
ls -all /etc/nginx/ssl
exit 0
10. После создания сценария добавьте разрешения на выполнение, запустите его и укажите параметры сертификата, наиболее важным из которых является поле Общее имя (добавьте сюда официальное имя домена) и оставьте поля «Пароль» и «Необязательная компания» пустыми.
sudo chmod +x nginx_gen_ssl
sudo ./nginx_gen_ssl
В конце задачи генерации ключей будет отображен список всех доступных ключей в каталоге Nginx ssl.
Также, если вы хотите, чтобы этот сценарий использовался в качестве системной команды, скопируйте или переместите его в /usr/local/bin/.
sudo mv nginx_gen_ssl /usr/local/bin
11. После того, как мы сгенерировали ключи, необходимые для виртуального хоста SSL Nginx, пришло время создать файл конфигурации виртуального хоста SSL. Используйте тот же системный IP-адрес для виртуального хоста, что и выше в директиве server_name, но немного измените имя файла виртуального хоста, добавив ssl перед .conf, чтобы напомнить вам, что этот файл означает name-ip виртуальный хост SSL.
sudo nano /etc/nginx/sites-availabe/name-ip-ssl.conf
В этом файле измените оператор порта listen на 443 ssl и укажите пути к файлам ключей SSL и сертификатов, созданные ранее, как показано в приведенном ниже отрывке.
## File content ##
server {
listen 443 ssl;
server_name 192.168.1.33;
ssl_certificate /etc/nginx/ssl/192.168.1.33.crt;
ssl_certificate_key /etc/nginx/ssl/192.168.1.33.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.1.33-ssl.access.log;
error_log /var/log/nginx/192.168.1.33-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;
}
}
12. После создания файла используйте сценарий n2ensite или командную строку ln, чтобы активировать его (создается символическая ссылка на файл на сайтах). -enabled), затем перезапустите демон Nginx, чтобы применить настройки.
sudo ./n2ensite name-ip-ssl
OR
sudo ln -s /etc/nginx/sites-available/name-ip-ssl.conf /etc/nginx/sites-enabled/
sudo systemctl restart nginx
13. Снова укажите в браузере URL-адрес Arch IP, но на этот раз с использованием протокола HTTPS – https://192.168.1.33 в моей системе – и Должно появиться сообщение об ошибке безопасности Ненадежное соединение ( Добавить и подтвердить исключение безопасности, чтобы продолжить страницу).
Как вы теперь можете видеть, ваш виртуальный хост Nginx обслуживает тот же контент, что и предыдущий хост name-ip, но на этот раз использует безопасное соединение HTTP.
Шаг 3. Доступ к PhpMyAdmin через виртуальный хост
Если виртуальный хост включен в Nginx, у нас больше нет доступа к содержимому пути http://localhost (localhost обычно обслуживает контент с использованием IP-адреса обратной связи или IP-адреса системы, если не настроено иное), поскольку у нас есть использовал IP-адрес системы Arch в качестве server_name, поэтому наш путь к контенту изменился.
14. Самый простой способ получить доступ к PhpMyAdmin через Интернет — создать символическую ссылку между путем /usr/share/webapps/phpMyAdmin/. и наш новый определенный путь к виртуальному хосту (/srv/http).
sudo ln -s /usr/share/webapps/phpMyAdmin/ /srv/http/
15. После выполнения указанной выше команды обновите страницу, и вы увидите новую папку phpMyAdmin, если на виртуальном хосте Nginx включен оператор autoindex, или укажите свой URL-адрес непосредственно на Папка PhpMyAdmin https://arch_IP/phpMyAdmin.
16. Если вы хотите очистить строку phpMyAdmin в браузере, отредактируйте файлы виртуальных хостов и добавьте следующий контент в блок сервера.
location /phpmyadmin {
rewrite ^/* /phpMyAdmin last;
}
Шаг 4. Включите каталог, защищенный паролем, на Nginx
В отличие от Apache, Nginx использует модуль HttpAuthBasic для включения каталогов, защищенных паролем, но не предоставляет никаких инструментов для создания зашифрованного файла .htpasswd.
17. Чтобы обеспечить защиту каталогов паролем с помощью Nginx в Arch Linux, установите веб-сервер Apache и используйте его инструменты для создания зашифрованного файла .htaccess.
sudo pacman -S apache
18. После установки Apache создайте новый каталог в /etc/nginx/ с интуитивно понятным именем passwd, в котором будет храниться и использоваться файл .htpasswd. Команда htpasswd с -c включает первого добавленного пользователя для создания файла, затем, если вы хотите добавить больше пользователей, используйте htpasswd без - в переключатель.
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
19. Чтобы защитить name-ip-ssl корневой каталог виртуального хоста /srv/http/, обслуживаемый путь со всеми его подпапками и файлами ниже. он добавляет следующие инструкции в блок сервера виртуального хоста в корневой директиве и указывает на абсолютный путь к файлу .htpasswd.
auth_basic "Restricted Website";
auth_basic_user_file /etc/nginx/passwd/.htpasswd;
20. После перезапуска службы Nginx обновите страницу и появится всплывающее окно Требуется аутентификация с запросом ваших учетных данных.
Теперь вы успешно включили Каталоги, защищенные паролем Nginx, но имейте в виду, что в то же время в вашей системе установлен веб-сервер Apache, поэтому убедитесь, что он остается отключенным, и ни в коем случае не запускайте его, поскольку это может привести к порты, конфликтующие с Nginx.
Шаг 5. Перенаправление HTTP на HTTPS в Nginx
21. Если вы хотите, чтобы браузеры автоматически перенаправляли все небезопасные HTTP-запросы на протокол HTTPS, откройте и отредактируйте свой виртуальный хост без SSL и добавьте следующую инструкцию в раздел имя_сервера.
rewrite ^ https://$server_name$request_uri? permanent;
Все настройки, представленные в этой статье, выполнены в системе Arch Linux, которая действует как сервер, но большинство из них, особенно те, которые касаются файлов конфигурации Nginx, доступны в большинстве систем Linux с небольшими отличиями.