Добро пожаловать в nginx! после чистой установки

Здравствуйте,

Я новичок в Discourse и застрял на этапе установки. Я создал виртуальную машину на базе Ubuntu Server 18.04 и примерно следовал инструкциям по установке.

Когда я говорю «примерно», имею в виду, что вместо облачного сервера я использую Ubuntu Server. Я не устанавливал Docker вручную, а позволил discourse-setup сделать это за меня. Кроме того, у меня пока не настроен почтовый сервер, хотя я указал разумные ответы в процессе настройки. Не уверен, является ли это критической проблемой. DNS полностью настроен, и сервер имеет статический IP-адрес.

После этапа начальной настройки, когда я перехожу по FQDN сервера, вижу страницу «Welcome to nginx!» вместо «Congratulations, you installed Discourse!».

Эта установка предназначена для лабораторной среды и не будет доступна публично.

Марк.

Установлен ли nginx на сервере? Его быть не должно. Но discourse-setup должен был это определить. Вы уверены, что ваши DNS-настройки верны?

Nginx не установлен на сервере. Что касается DNS, у меня есть A-запись и PTR-запись для сервера. Какие еще требования существуют?

Марк.

Единственный способ увидеть эту страницу — если вы указали DNS на неправильный сервер или NGINX находится вне контейнера, занимая порт 80 и не давая контейнеру отвечать.

Если я открою веб-браузер и введу IP-адрес сервера напрямую, я также увижу приветственную страницу Nginx.

При подключении по SSH к серверу Ubuntu:
marc@community:~$ locate nginx
/var/discourse/image/base/install-nginx
marc@community:~$

Кроме того, находясь на сервере Ubuntu:
sudo find / -iname "*nginx*"
…множество файлов в директории /var/lib/docker/overlay2
/var/discourse/image/base/install-nginx
/var/discourse/shared/standalone/letsencrypt/deploy/nginx.sh
/var/discourse/shared/standalone/log/var-log/nginx

Покажите результат выполнения:

lsof -i:80

Команда lsof -i:80 не выдаёт никакого вывода.

Значит, на порту 80 ничего не слушает?

Если Docker слушал бы порт :80, что происходит при любой успешной установке (и необходимо для того, чтобы nginx внутри контейнера мог видеть что-либо), вы бы увидели:

COMMAND   PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
docker-pr 890 root    4u  IPv6 961922      0t0  TCP *:http (LISTEN)

Если nginx не установлен вне контейнера, а Docker не слушает этот порт, то единственная причина, по которой вы видите приветственную страницу nginx, — это ошибка в конфигурации сети.

Похоже, вы правы. Вывод выполнения nmap с моего ноутбука на IP-адрес сервера:

Запуск Nmap 7.01 ( https://nmap.org ) в 2020-04-10 23:34 AEST
Отчёт сканирования Nmap для community.aureus-group-sb.com (192.168.12.35)
Хост активен (время отклика 0.0010 с).
Не показано: 999 закрытых портов
ПОРТ СОСТОЯНИЕ УСЛУГА
22/tcp открыт ssh
MAC-адрес: 0C:8B:FD:CD:AF:EB (Intel Corporate)

Nmap завершено: 1 IP-адрес (1 хост активен) просканирован за 1.74 секунды

Помните, что проблема с сетью может включать (но не ограничивается) следующее:

  • Политика на виртуальной машине, блокирующая доступ (ufw или аналогичное)
  • Политика на виртуальном сервере, блокирующая доступ (неправильно настроен режим сети)
  • Политика в сети настроена неправильно (ACL между подсетями)
  • Неправильная конфигурация DNS

Это проблема Discourse только в том случае, если ни одно из вышеперечисленного не имеет места. Вы следуете стандартной инструкции по установке, но, как вы сами признали, устанавливаете в среде, которая ничем не похожа на стандартную.

Если ваша организация может потратить 5 долларов в месяц, возможно, будет дешевле с точки зрения затраченного времени разместить это в облаке и ограничить брандмауэр облачного VPS, чтобы он отдавал страницы только в вашу среду.

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

Что касается перечисленных вами аспектов сети:

  • ufw неактивен, а iptables работает: я не вносил никаких изменений в установку Ubuntu Server по умолчанию.
    ** При просмотре конфигурации iptables видно, что политика цепочки input разрешает все пакеты, то же самое касается и цепочки output. В цепочке forward есть некоторые ссылки, связанные с Docker (см. ниже).
  • Единственный vNIC виртуальной машины настроен в режиме мостового подключения (Bridged mode), что обеспечивает прямое соединение с физической сетью.
  • Ноутбук, с которого я работаю, и виртуальная машина находятся в одной подсети.
  • Я не уверен в точных требованиях к DNS. Я пытался найти эти спецификации, но не смог найти окончательный документ. Что касается DNS, то я могу выполнить ping-запрос к серверу по имени, FQDN и IP-адресу. Не уверен, нужно ли что-то еще настроить в отношении DNS.

Какая сетевая политика существует между виртуальной машиной и внешним миром?

Если git pull завершился успешно и вы смогли запустить discourse-setup, что могло помешать подключению к GitHub для загрузки содержимого контейнера?

Если сервер не имеет доступного IP-адреса, Let’s Encrypt не сможет работать. Меняли ли вы файл YML, чтобы отключить HTTPS?

Виртуальная машина может подключаться к интернету, и у неё нет ограничений на доступ к GitHub. При запуске discourse-setup я оставил пустым опцию Email учётной записи Let’s Encrypt? (нажмите ENTER, чтобы пропустить) [me@example.com]:.

Я не изменял никакие YML-файлы.

Оставление этого поля пустым означает, что вы не будете получать уведомления о проблемах с сертификатами; это не препятствует контейнеру пытаться включить Let’s Encrypt.

Хорошо, мы выделили некоторые более серьёзные проблемы, но они не относятся к автору оригинального поста. Где-то в вашей сети работает nginx, который выводит эту страницу, но, судя по вашим тестам на виртуальной машине, nginx не установлен, и docker не прослушивает порты.

Как только вы выясните, как это происходит, вторым шагом будет правильная настройка YAML-файла. Пока что вам нужно найти источник этой страницы.

Я так же подумал. Позвольте мне немного покопаться, чтобы попытаться выяснить, откуда берется эта страница.

Вот что я выяснил. Если я выключу сервер, я не смогу выполнить пинг его (IP-адрес, имя и FQDN). При попытке перейти по IP-адресу в браузере Firefox отображается стандартная страница «Не удалось установить соединение».

Таким образом, я делаю вывод, что конфликта IP-адресов нет.

После включения ВМ теперь также невозможно подключиться через браузер — снова появляется стандартная страница «Не удалось установить соединение». Теперь поведение соответствует тому, что мы ожидали на основе вывода команды lsof -i:80.

Я зашел внутрь контейнера с помощью команды docker exec -it <cont.id> /bin/bash и проверил вывод ps aux. Там была следующая строка:

root 2030 0.2 0.0 2160 1328 ? Ss 14:10 0:01 runsv nginx

Таким образом, похоже, что nginx запущен внутри контейнера, однако вывод nsenter -t 1446 -n netstat -plnt показывает:

Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 127.0.0.1:3000          0.0.0.0:*               LISTEN      3606/unicorn master 
tcp        0      0 0.0.0.0:5432            0.0.0.0:*               LISTEN      3590/postmaster     
tcp        0      0 0.0.0.0:6379            0.0.0.0:*               LISTEN      3591/redis-server * 
tcp6       0      0 :::5432                 :::*                    LISTEN      3590/postmaster     
tcp6       0      0 :::6379                 :::*                    LISTEN      3591/redis-server *

Означает ли это, что контейнер не слушает порты 80 и 443?