Nginx простые примеры конфигурации

Человек я ленивый и часто приходится делать одно и тоже. Ошибки синтаксиса, как человеческий фактор:) Собрал здесь несколько шаблонов конфигурационных файлов Nginx. Шаблон копируем, заменяем имя домена, пути и все.

Статическим сайтом называется сайт в котором используются только HTML страницы, файлы CSS и Javascript. В статических сайтах PHP НЕ используется.

server {
  listen 80;
  listen [::]:80 ipv6only=on;
  server_name httpstatus.dieg.info;
  root /var/www/httpstatus;
  index index.html index.htm;
  access_log  /var/log/nginx/httpstatus.access.log;
  error_log  /var/log/nginx/httpstatus.error.log;
 
  location / {
    # Сначала попытка обслужить запрос как файл, затем как каталог, в случае неудачи вернет 404 ошибку.
    try_files $uri $uri/ =404;
   }
}

Настройка в Nginx самоподписанного SSL сертификата по умолчанию. Создать Snakeoil SSL сертификат можно двумя способами:

  1. способ:
    sudo apt -y install ssl-cert
    sudo make-ssl-cert generate-default-snakeoil
  2. способ:
    openssl req -x509 -newkey rsa:4096 -nodes -sha256 -keyout /etc/ssl/private/ssl-cert-snakeoil.key -out /etc/ssl/certs/ssl-cert-snakeoil.pem -days 3650 -subj "/CN=<$PUBLIC_IP_ADDRESS>"

Создаем файл настройки виртуальных хостингов Nginx по умолчанию /etc/nginx/sites-enabled/000-default.conf и дописываем пути к полученному SSL сертификату:

server {
  listen 80 default_server;
  listen 443 ssl default_server;
  server_name _;
 
  ssl_certificate /etc/ssl/certs/ssl-cert-snakeoil.pem;
  ssl_certificate_key /etc/ssl/private/ssl-cert-snakeoil.key;
 
  return 444;
}
server {
    listen       80;
    server_name  localhost;
    return 301 https://$server_name$request_uri;
}

server {
    listen       443 ssl;
    server_name  localhost;

  ssl_certificate /etc/ssl/certs/ssl-cert-snakeoil.pem;
  ssl_certificate_key /etc/ssl/private/ssl-cert-snakeoil.key;

    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
    }

    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
}

В общем случае для получения SSL сертификата Lets Encrypt необходимо во всех блоках server добавить следующий блок до других блоков location:

location ~ /.well-known {
       root /usr/share/nginx/;
       allow all;
}
mkdir -p /usr/share/nginx/.well-known/acme-challenge
echo Success > /usr/share/nginx/.well-known/acme-challenge/example.html

Обратный прокси для SSL well-known

Бывает нужно хранить SSL сертификаты в одном месте или вы превысили количество попыток получить SSL сертификат, а ждать времени нет. Очень удобно настроить на одном сервере автоматическое получение всех необходимых сертификатов. В этом случае сделаем для выручит модуль ngx_http_proxy_module и функция proxy_pass. Создаем локешйн, обязательно на 80 порту, так как оп нему выдаются SSL сертификаты:

server {
  listen 80;
...
location ~ /.well-known {
proxy_pass  http://xxx.xxx.xxx.xxx:80;
}
...

На nginx куда проксируем, создавать домен для которого нужно получить SSL не нужно. Будем использовать домен по умолчанию, то есть server_name ip _; и опишем в нем локейшен

server_name ip _;
location ~ /.well-known {
       root /usr/share/nginx/;
       allow all;
}
...

Всё, прокси настроено. Мы можем запустить выдачу SSL сертификата на сервере который указан в proxy_pass. Не забываем использовать post-hook для перевыдачи SSL сертификата в Nginx при использовании cron.

15 1 * * * /usr/bin/certbot renew --post-hook "systemctl reload nginx"

Подключим к примеру выше обработчик файлов PHP (php-fpm 8.1).

server {
  listen 80;
#  listen [::]:80 ipv6only=on;
  server_name httpstatus.dieg.info;
  root /var/www/httpstatus;
  index index.html index.htm index.php;
  access_log  /var/log/nginx/httpstatus.access.log;
  error_log  /var/log/nginx/httpstatus.error.log;
 
  location / {
    try_files $uri $uri/ =404;
}
 
location ~ \.php$ {
        fastcgi_pass  127.0.0.1:9081;
#        fastcgi_pass unix:/run/php/php8.1-fpm.sock;        
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }
 
##### Стандартные настройки для любого хоста
  location = /robots.txt  { access_log off; log_not_found off; }
  location = /favicon.ico { access_log off; log_not_found off; }
# Запрет доступа к скрытым файлам, файлы названия которых начинаются с точки)
  location ~ /\.          { access_log off; log_not_found off; deny all; }
#  location ~ ~$           { access_log off; log_not_found off; deny all; }
#####
}

Обратный прокси-сервер — это служба, которая принимает запрос клиента, отправляет запрос одному или нескольким прокси-серверам, получает ответ и доставляет ответ сервера клиенту.

Чтобы настроить Nginx в качестве обратного прокси для HTTP-сервера, откройте файл конфигурации блока сервера домена и укажите в нем расположение и прокси-сервер:

server {
    listen 80;
    server_name www.example.com example.com;
 
    location /app {
       proxy_pass http://127.0.0.1:8080;
    }
}

URL-адрес проксируемого сервера устанавливается с proxy_pass директивы proxy_pass и может использовать HTTP или HTTPS качестве протокола, доменного имени или IP-адреса, а также необязательного порта и URI в качестве адреса.

Приведенная выше конфигурация указывает Nginx передавать все запросы в /app прокси-серверу по адресу http://127.0.0.1:8080 .

Читайте также: Балансировка нагрузки с помощью NGINX и проксирование

PQ VPS сервера в 38+ странах.

📌 Для тестирования скриптов, установщиков VPN, Python ботов рекомендуем использовать надежные VPS на короткий срок. Если вам нужна помощь с более сложными задачами, вы можете найти фрилансера, который поможет с настройкой. Узнайте больше о быстрой аренде VPS для экспериментов и о фриланс-бирже для настройки VPS, WordPress. 📌

💥 Подпишись в Телеграм 💥 и задай вопрос по сайтам и хостингам бесплатно!