Запуск Nginx с HTTPS

Конфигурация

/etc/nginx/sites-available/default
server {
	listen 80 default_server;
	listen [::]:80 default_server;
    
	listen 443 ssl default_server;
	listen [::]:443 ssl default_server;
 
    ssl_certificate /etc/nginx/ssl/server.crt;
    ssl_certificate_key /etc/nginx/ssl/server.key;
    root /var/www/html;
 
    # Add index.php to the list if you are using PHP
    index index.html index.htm index.nginx-debian.html;
 
    server_name site.local;
 
    location / {
        index webpage.html
        try_files $uri $uri/ =404;
    }
}

К слову, /etc/nginx/sites-enabled/default /etc/nginx/sites-available/default

Всё, что находится внутри {} директивы server - конфиги сервера.

listen-ы устанавливают порты, которые будет сервер слушать (через которые будет доступен сервер). Сначала идет конфиг IPv4, а потом IPv6.

ssl_certificate и ssl_certificate_key в данном случае используются для обозначения пути к ssl сертификату и ключу.

root указывает путь к директории с html файлами.

index index.html index.htm index.nginx-debian.html
Директива index определяет список файлов-индексов в порядке приоритета, которые будут использоваться, если в URL не указано имя конкретного файла. Список идет от более приоритетного к менее приоритетному, то есть, если не будет найден первый индекс-файл, то будет искаться второй и т.д.

server_name указывает доменное имя, которое будет обслуживаться сервером. По дефолту стоит значение _ (underscore) , что означает “любой домен”.

В блоке location есть параметр index, который указывает индексную (начальную) страницу в директории, указанной после параметра root выше.
Там же есть try_files, который ищет index page; если не находит - возвращает ошибку “404 Not Found”.

Подтягивание конфигов

После применения настроек нужно выполнить:

systemctl reload nginx

reload нужен как раз для подтягивания конфигов, чтобы не restart-ить nginx лишний раз. Ибо restart сервера - сбой.
Проверить конфиги на ошибки можно командой:

nginx -t

Создание приватного ключа и SSL сертификата для HTTPS

Генерация приватного ключа:

openssl genrsa -out server.key 4096

Генерация CSR:

openssl req -new -key server.key -out server.csr

Создание сертификата:

openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt

Вывод информации о сертификате:

openssl x509 -noout -text -in server.crt

Проверка hash

Вывод модуля сертификата:

openssl x509 -noout -modulus -in ssl_certificate.crt | openssl md5

Вывод модуля приватного ключа:

openssl rsa -noout -modulus -in private.key | openssl md5

Вообще у меня есть скрипт на этот случай

sslCertCreator
#!/bin/bash
#Генерация приватного ключа
openssl genrsa -out server.key 4096
#Генерация CSR
echo -e "RU\nMoscow\n\nAboba Foundation\nIT\nsite.local\n\n\n\n" \
  | openssl req -new -key server.key -out server.csr
#Создание сертификата
openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt
#Вывод информации о сертификате
openssl x509 -noout -text -in server.crt
#Вывод модуля сертификата
openssl x509 -noout -modulus -in server.crt | openssl md5
#Вывод модуля приватного ключа
openssl rsa -noout -modulus -in server.key | openssl md5
#Удаление server.csr, т.к. не нужен
rm server.csr

Перемещение сертификата и ключа в папку /etc/nginx/ssl/

server.csr не нужен - удаляй, это ж просто request.
server.crt, server.key кидай в /etc/nginx/ssl/ (sudo mkdir -p /etc/nginx/ssl/)

Результат

Результат можно увидеть на localhost

Cопоставление localhost-а с доменным именем

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

127.0.0.1 site.local

Nginx basic HTTP auth

Понадобится программа htpasswd из пакета apache2-utils:

sudo apt install apache2-utils

Дальше создай пустой файл, где будут храниться username и хешированные пароли:

sudo touch /etc/nginx/htpasswd

Добавление пользователя в /etc/nginx/htpasswd:

sudo htpasswd /etc/nginx/htpasswd <username>
# nginx-basic-http-auth
# Добавить можно много пользователей

Проверь файл:

cat /etc/nginx/htpasswd

Удалить юзера можно так:

sudo htpasswd -D /etc/nginx/htpasswd <username>

Теперь nginx.

/etc/nginx/sites-available/default
server {
  location /files {
    auth_basic "Restricted";
    auth_basic_user_file /etc/nginx/htpasswd;
  }
}

Подтягивай конфиги:

sudo systemctl reload nginx

Нормальный HTTPS: Lets Encrypt