4.6 KiB
Настройка nginx как прямого прокси
Собственно, прямой прокси — это прокси, который просто перенаправляет запросы на другой сервер. Очень полезно, когда у вас внутри сети есть один компьютер, который виден из интернет (DMZ или через проброс портов), и мы хотим перенаправить внешние запросы на другие сервера внутри сети. Заодно можно настроить SSL-терминацию.
На примере AudioBookShelf, который должен быть доступен снаружи по адресу some.you.site
у нас будет вот такой конфиг:
# config for AudioBookShelf [some.you.site]
server {
server_name [some.you.site]; # доменное имя сайта
charset utf-8; # кодировка по умолчанию
access_log /home/orangepi/web-data/audiobookshelf/logs/audiobookshelf-access.log; # логи с доступом
error_log /home/orangepi/web-data/audiobookshelf/logs/audiobookshelf-error.log; # логи с ошибками
client_max_body_size 512M; # максимальный объем файла для загрузки на сайт (max upload size)
# listen 80; # managed by Certbot
listen 443 ssl http2; # managed by Certbot
ssl_certificate /etc/letsencrypt/live/[some.you.site]/fullchain.pem; # managed by Certbot
ssl_certificate_key /etc/letsencrypt/live/[some.you.site]/privkey.pem; # managed by Certbot
include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
location /favicon.ico { root /home/orangepi/web-data/audiobookshelf/html; } # Расположение favicon.ico
location /favicon.png { root /home/orangepi/web-data/audiobookshelf/html; } # Расположение favicon.png
location /robots.txt { root /home/orangepi/web-data/audiobookshelf/html; } # robots.txt (dissalow all)
location / {
proxy_pass http://[какой-то-ip]:8000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header X-Forwarded-Proto https;
proxy_set_header X-Nginx-Proxy true;
# proxy_redirect off;
proxy_set_header X-Scheme $scheme;
add_header Strict-Transport-Security "max-age=15552000; includeSubDomains" always;
}
# location / {
# index index.html;
# }
}
server {
if ($host = [some.you.site]) { return 301 https://$host$request_uri; } # managed by Certbot
server_name [some.you.site];
listen 80;
return 404; # managed by Certbot
}
Проксирование на host если nginx находится внутри Docker
Если nginx находится внутри Docker или Docker Compose, то он сможет увидеть только свои контейнерные IP-адреса и хосты. Если таким nginx нужно проксировать на сам хост, то в конфиге nginx нужно указать:
proxy_pass http://host.docker.internal:xxxx;
host.docker.internal
-- это специальный DNS-имя, которое указывает на хост, на котором запущен Docker.
Начиная с Docker 20.10.0+ сам контейнер надо запускать с дополнительным параметром --add-host=host.docker.internal:host-gateway
.
docker run --add-host=host.docker.internal:host-gateway ...
Или добавить дополнительную инструкцию extra_hosts: "host.docker.internal:host-gateway"
в docker-compose.yml
при
использовании Docker Compose:
services:
nginx:
image: nginx:latest
extra_hosts:
- "host.docker.internal:host-gateway"
ports:
- "80:80"
...
...