Поиск по сайту:

Создавайте виртуальные хосты, защищайте паролем каталоги и сертификаты 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 с небольшими отличиями.