Назад | Перейти на главную страницу

Обратный прокси-сервер Nginx для передачи с помощью Docker Compose

Я пытаюсь заставить Nginx работать как обратный прокси для веб-клиента Transmission. Оба находятся в отдельных контейнерах Docker с Docker Compose.

Я читал предыдущие похожие вопросы, но они не помогли мне: https://unix.stackexchange.com/questions/64812/get-transmission-web-interface-working-with-web-server

https://stackoverflow.com/questions/15391073/nginx-transmission-daemon-url-rewrite

Nginx выдает ошибку:

[ошибка] 6 # 6: * 3 "/etc/nginx/html/transmission/web/index.html" не найден (2: нет такого файла или каталога), клиент: 172.18.0.1, сервер: torrent.localhost, запрос: «GET / передача / web / HTTP / 1.1», хост: «torrent.localhost»

Это заставляет меня подозревать, что proxy_pass работает некорректно, поскольку он все еще пытается захватить html-файл из файловой системы.

Любая помощь будет очень высоко ценится!

docker-compose.yml:

version: "2"
services:
  nginx:
    image: nginx
    container_name: nginx-proxy
    volumes:
      - ./nginx/nginx.conf:/etc/nginx/nginx.conf
      - ./www:/data/www
    ports:
    - "80:80"
    - "443:443"

  transmission:
    image: linuxserver/transmission
    container_name: transmission
    environment:
      - PUID=1000
      - PGID=1000
      - TZ=Europe/London
      - USER=username
      - PASS=password
    volumes:
      - ./transmission/config:/config
      - ./transmission/downloads:/downloads
      - ./transmission/watch:/watch
    ports:
      - "9091:9091"
      - "51413:51413"
      - "51413:51413/udp"
    restart: unless-stopped

nginx.conf:

events {
}

http {
    server {
        listen 80;
        server_name localhost 127.0.0.1;
        root /data/www;
        location = / {
            index index.html;
        }
    }

    server {
        server_name torrent.localhost;
        location = / {
            proxy_read_timeout 300;
            proxy_pass_header  X-Transmission-Session-Id;
            proxy_set_header   X-Forwarded-Host $host;
            proxy_set_header   X-Forwarded-Server $host;
            proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_pass http://transmission:9091;
        }
    }
}

index.html:

hello world!

Вы можете добиться этого, добавив свои контейнеры в единую сеть. вы можете определить сеть в файле docker-compose. Пример приведен ниже,

version: "2"
services:
  nginx:
    image: nginx
    container_name: nginx-proxy
    volumes:
      - ./nginx/nginx.conf:/etc/nginx/nginx.conf
      - ./www:/data/www
    ports:
    - "80:80"
    - "443:443"
    networks:
      NETWORKNAME:
        ipv4_address: 10.5.2.1

  transmission:
    image: linuxserver/transmission
    container_name: transmission
    environment:
      - PUID=1000
      - PGID=1000
      - TZ=Europe/London
      - USER=username
      - PASS=password
    volumes:
      - ./transmission/config:/config
      - ./transmission/downloads:/downloads
      - ./transmission/watch:/watch
    ports:
      - "9091:9091"
      - "51413:51413"
      - "51413:51413/udp"
    restart: unless-stopped
    networks:
      NETWORKNAME:
        ipv4_address: 10.5.2.2

networks:
  NETWORKNAME:
    driver: bridge
    ipam:
      config:
        - subnet: 10.5.0.0/16
          gateway: 10.5.0.1

Замените NETWORKNAME, как хотите. Также выберите маску подсети в соответствии с вашими требованиями (IP-адреса также вы можете выбрать по своему усмотрению). Затем измените свою конфигурацию nginx, как показано ниже,

server {
    listen 80;
    server_name "abc.example.com";   #your domain name
 
    location / {

        limit_except GET POST PUT HEAD DELETE OPTIONS PATCH {
             deny   all;
        }

        proxy_pass https://10.5.2.2;     #IP of your web container
        proxy_set_header Host $host:$server_port;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_intercept_errors on;
    }
}

В приведенном ниже проекте в качестве обратного прокси используется контейнер Nginx. Вы можете обратиться к этому проекту и найти более полезную информацию. Dockerized среда разработки OrangeHRM

Ваша проблема заключается в знаке равенства после слова "местоположение". Знак равенства может использоваться, если местоположение должно соответствовать ТОЧНОМУ URI запроса.

Вы можете удалить знак равенства ("=") следующим образом:

server {
    server_name torrent.localhost;
    location / { # <-- remove "=" sign
        proxy_read_timeout 300;
        proxy_pass_header  X-Transmission-Session-Id;
        proxy_set_header   X-Forwarded-Host $host;
        proxy_set_header   X-Forwarded-Server $host;
        proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_pass http://transmission:9091;
    }
}