doc_memo/nginx/nginx_as_direct_proxy.md

86 lines
4.6 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Настройка nginx как прямого прокси
Собственно, прямой прокси — это прокси, который просто перенаправляет запросы на другой сервер. Очень полезно,
когда у вас внутри сети есть один компьютер, который виден из интернет (DMZ или через проброс портов), и мы хотим
перенаправить внешние запросы на другие сервера внутри сети. Заодно можно настроить SSL-терминацию.
На примере AudioBookShelf, который должен быть доступен снаружи по адресу `some.you.site` у нас будет вот такой конфиг:
```nginx configuration
# 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](../docker/docker-nginx-w-certbot.md), то он сможет увидеть
только свои контейнерные IP-адреса и хосты. Если таким nginx нужно проксировать на сам хост, то в конфиге nginx
нужно указать:
```nginx configuration
proxy_pass http://host.docker.internal:xxxx;
```
* `host.docker.internal` -- это специальный DNS-имя, которое указывает на хост, на котором запущен Docker.
Начиная с Docker 20.10.0+ сам контейнер надо запускать с дополнительным параметром `--add-host=host.docker.internal:host-gateway`.
```shell
docker run --add-host=host.docker.internal:host-gateway ...
```
Или добавить дополнительную инструкцию `extra_hosts: "host.docker.internal:host-gateway"` в `docker-compose.yml` при
использовании Docker Compose:
```yaml
services:
nginx:
image: nginx:latest
extra_hosts:
- "host.docker.internal:host-gateway"
ports:
- "80:80"
...
...
```