LINUX.ORG.RU

nginx как реверс прокси в контейнере

 , ,


0

3

Котаны, помогите, я близок к отчаянию. Хочу nginx поставить как реверс, за которым пока что некстклауд, потом будет что-то еще. Это всё в контейнерах. docker-compose:

  1 version: '1'
  2
  3 services:
  4   reverse_proxy:
  5     image: nginx:latest
  6     restart: always
  7     ports:
  8       - "51623:80"
  9     container_name: nginx_reverse
 10     volumes:
 11       - /home/observer/BKP/nextcloud/nginx:/etc/nginx/conf.d
 12     networks:
 13       - nextcloud-net                                                                                                                                                                                      
 14
 15   database:
 16    image: mariadb
 17    command: --transaction-isolation=READ-COMMITTED --binlog-format=ROW --skip-innodb-read-only-compressed
 18    restart: always
 19    volumes:
 20      -  /home/observer/BKP/nextcloud/mariadb:/var/lib/mysql
 21    container_name: mariadb_docker
 22    environment:
 23      - MYSQL_ROOT_PASSWORD=user
 24      - MYSQL_PASSWORD=Password
 25      - MYSQL_DATABASE=nextcloud
 26      - MYSQL_USER=nextcloud
 27    networks:
 28    - nextcloud-net
 29
 30   nextcloud:
 31     image: nextcloud
 32     restart: always
 33     depends_on:
 34       - database
 35       - reverse_proxy
 36     container_name: nextcloud_docker
 37     volumes:
 38       - /home/observer/BKP/nextcloud/apps:/var/www/html/apps
 39       - /home/observer/BKP/nextcloud/config:/var/www/html/config
 40       - /home/observer/BKP/nextcloud/data:/var/www/html/data
 41     networks:
 42      - nextcloud-net
 43
 44 networks:
 45   nextcloud-net:

А вот default.conf для nginx


╰─ cat default.conf
server {
      listen       80;

      location / {

         proxy_pass http://nextcloud_docker:80;
                 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_set_header   X-Forwarded-Host $server_name;
       }                                                                                                                                                                                                       
}

C таким конфигом он даёт зайти на localhost:51623. Но когда ссылка меняется на, к примеру, http://localhost/apps/dashboard/ - то 403 и форбидден. Причем, если вот так http://localhost:51623/apps/dashboard/ - то работает

У меня 2 вопроса к уважаемым знатокам:

  1. Почему nginx в строке браузера localhost:51623 не меняет на nextcloud_docker
  2. Почему теряется номер порта в ссылках? В идеале то вообще чтобы его не было, а был просто nextcloud_docker в адресной строке.

Заранее шлю лучи благодати в разные стороны.

Конкретного ответа дать не могу, т.к. не настраивал nextcloud за проксёй, но вот этот признак

http://localhost/apps/dashboard/ - то 403 и форбидден. Причем, если вот так http://localhost:51623/apps/dashboard/ - то работает

говорит о том, что nextcloud не знает, что он находится за прокси и поэтому генерирует некорректные редиректы.

Вот здесь написано про проксирование и размещение его за реверс-прокси.

https://docs.nextcloud.com/server/latest/admin_manual/configuration_server/reverse_proxy_configuration.html

Hanuken
()

Почему nginx в строке браузера localhost:51623 не меняет на nextcloud_docker

Он и не должен. nextcloud_docker - это внутреннее имя контейнера внутри твоей связки, оно резолвится только внутри network nextcloud-net.

Вообще, старайся не использовать подчёркивания в именах сервисов, т.к. это некорректно с точки зрения DNS’а и если где-то сработает, то где-то может и нет.

Hanuken
()
Последнее исправление: Hanuken (всего исправлений: 1)

Вообще, для облегчения дебага этой связки я бы сначала вывесил сам nextcloud из контейнера на 127.0.0.1, поставил nginx рядом просто в систему и постарался через него спроксировать трафик внутрь контейнера. Как только заработает, можно будет поменять адрес в proxy_pass с локалхоста на имя контейнера с nextcloud’ом и уже с этим конфигом заталкивать nginx в контейнер.

Hanuken
()
Ответ на: комментарий от Hanuken

Вобщем хз насколько это правильно. Гугол везде стандартные конфиги nginx показывает, так что я подумал, что дело наверное не в нём.

В конфиге некстклауда я добавил в config.php

'overwritehost' => 'localhost:51623'

и дело сдвинулось с мёртвой точки

SpaceRanger ★★★
() автор топика
Ответ на: комментарий от Hanuken

Вообще, для облегчения дебага этой связки я бы сначала вывесил сам nextcloud из контейнера на 127.0.0.1

Не надо ничо вывешивать. –network=host у докера есть. Надо в compose прост прописать, чтобы все контейнеры запускались так.

paddlewan
()
Ответ на: комментарий от paddlewan

–network=host у докера есть. Надо в compose прост прописать, чтобы все контейнеры запускались так.

Зачем? Моё предложение было насчёт отладки этой конструкции. Во время неё проще найти проблему, когда нет лишних абстракций в виде внутренних сетей докера. Да банально релоуднуть nginx в системе несколько проще, чем в контейнере.

Hanuken
()

Браузер вообще понятия не имеет (и не должен), что такое nextcloud_docker.

Заведи запись nextcloud.docker в hosts на локалхост и ходи по нему через браузер. И в server_name nginx конфиг возможно стоит добавить.

easybreezy
()

Вобщем едиснтвенное не потное решение, которое мне пришло в голову и которое работает, это реверс на хост поставить, который прокидывает запросы в контейнер.

    server {
 37         listen      80;
 38         server_name mycloud.ru;
 39
 40         return 301 https://$server_name$request_uri; # редирект обычных запросов на https
 41         access_log            /var/log/nginx/test.test_access.log combined;
 42         error_log             /var/log/nginx/test.test_error.log;
 43 }
 44
 45 server {
 46         listen       443 ssl http2;
 47         server_name  mycloud.ru;
 48         client_max_body_size 200M;
 49
 50         ssl_certificate /etc/ssl/certs/nginx-selfsigned.crt;
 51         ssl_certificate_key /etc/ssl/private/nginx-selfsigned.key;
 52
 53         access_log            /var/log/nginx/test1.test_access.log combined;
 54         error_log             /var/log/nginx/test1.test_error.log;
 55
 56         location / {
 57                 #       root /var/www/localhost/htdocs;
 58                 proxy_pass          http://localhost:51623/;
 59                 proxy_set_header    Host $host;
 60                 proxy_set_header    X-Real-IP $remote_addr;
 61                 proxy_set_header    X-Forwarded-For $proxy_add_x_forwarded_for;
 62                 proxy_set_header    X-Forwarded-Proto $scheme;
 63                 proxy_redirect          default;
 64         }
 65
 66
 67 }
SpaceRanger ★★★
() автор топика