doc_memo/nginx/nginx_as_direct_proxy.md

4.6 KiB
Raw Permalink Blame History

Настройка 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"
...
...