Человек я ленивый и часто приходится делать одно и тоже. Ошибки синтаксиса, как человеческий фактор:) Собрал здесь несколько шаблонов конфигурационных файлов 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 сертификат можно двумя способами:
sudo apt -y install ssl-cert sudo make-ssl-cert generate-default-snakeoil
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 сертификаты в одном месте или вы превысили количество попыток получить 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 и проксирование
Nginx ссылки на настройку для разных CMS.