Обратный прокси-сервер Nginx (AWS) -> nginx-сервер для статической страницы (homeip)

У меня есть сервер nginx, который обслуживает статические файлы в моем домашнем ip за pfsense. Если я нажму на домашний IP, я увижу веб-сайт, который я размещаю Я пытаюсь поместить это позади другого обратного прокси-сервера nginx, чтобы мой домашний IP не был публичным. Итак, у меня есть экземпляр ec2, который просто запускает докер nginx с обратным прокси-сервером.

вот мой nginx.conf:

  worker_processes 1;

  events { worker_connections 1024; }

   http {

         sendfile on;

         upstream docker-nginx {
         server <homeip>;
        }


         server {
               listen 80;

          location / {
           proxy_pass         http://docker-nginx;
           proxy_redirect     off;
           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;
        }
     }
  }

и мой файл докера:

   FROM nginx:alpine

   COPY nginx.conf /etc/nginx/nginx.conf

Команда Docker Run после сборки: Docker docker run -p 80:80 reverseproxy

Это очень прямо вперед. У меня есть http для https перенаправления на моем домашнем сервере nginx.

Теперь, если я нажму свое доменное имя, я получу сервер не может быть достигнут. Если я нажму IP-адрес экземпляра ec2, который, конечно, имеет открытые 80 и 443, я получу сервер не найден.

и сверните мой домашний IP-адрес из контейнера дает мне

<html> <head><title>301 Moved Permanently</title></head> <body bgcolor="white"> <center><h1>301 Moved Permanently</h1></center> <hr><center>nginx/1.10.0 (Ubuntu)</center> </body> </html>

Что я делаю неправильно? Это правильно? Буду очень признателен за вашу помощь. Я пробовал ту же настройку без докера, но работала как реверсивный прокси-сервер, но все еще не работала :-(

1 ответ1

0

При устранении неполадок такого рода вы, как правило, хотите идти по одному шагу за раз. Я постараюсь подвести итог здесь, так как весь процесс уже прошел через чат (расшифровка).

  1. Убедитесь, что вы можете подключиться от прокси к вышестоящему хосту. В этом случае вы уже попробовали curl , который показывает, что он может подключиться, но нажал перенаправление (мы вернемся к этому позже). curl -L для отслеживания перенаправлений может быть здесь полезен, но если вы уже указали DNS-имя обратному прокси-серверу, то это может застрять в цикле.

  2. Убедитесь, что обратный прокси-сервер прослушивает правильные порты. Здесь полезен netstat -apnt4 (удалите 4 чтобы показать IPv6). В этом случае, поскольку вы тоже хотели HTTPS, вам нужно убедиться, что оба 80 и 443 слушают.

  3. Убедитесь, что вы можете подключиться к обратному прокси. Если прокси-сервер прослушивает правильный порт, но вы все равно получаете connection refused об отказе в соединении , самое время проверить настройки брандмауэра (не забывайте о брандмауэре провайдера сервера, например, через панель управления AWS). Также может быть полезно использовать вкладку сети консоли разработчика браузера, чтобы узнать, успешно ли вы выполняете первоначальный запрос, но перенаправлены ли на неработающую ссылку.

  4. На данный момент, надеюсь, вы сможете хотя бы подключиться к обратному прокси-серверу, и вы знаете, что сервер подключен к вашему восходящему каналу. Если он все еще не работает, возможно, вы получаете ответ 502 Bad Gateway - это, как правило, означает, что nginx по какой-то причине не может успешно общаться с апстримом. Проверьте свои журналы: /var/log/nginx/error.log является местоположением по умолчанию.

  5. Используйте Google, и найдите соответствующую ошибку. Есть два общих:

    • В доступе отказано при подключении к восходящему каналу. Это может быть потому, что SELinux блокирует nginx от выполнения исходящих сетевых запросов. Вам нужно будет это разрешить.

    • SSL_do_handshake() с SSL23_GET_SERVER_HELLO:unknown protocol обычно, потому что вы пытаетесь подключиться с HTTPS к порту HTTP (80). Для исходящих потоков Nginx по умолчанию используется порт 80 - вам нужно явно указать 443 если вы хотите использовать HTTPS для подключения к восходящему каналу.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .