NGINX не запускается

Всем привет!

Я пытаюсь установить Discourse на поддомен.

Мой основной домен работает на WordPress, который был создан с использованием docker-compose.

Поддомен и основной домен используют один и тот же VPS-сервер.

Для установки я следовал этому руководству: https://meta.discourse.org/t/run-other-websites-on-the-same-machine-as-discourse/17247

К сожалению, NGINX не может быть запущен. Когда я выполняю команду systemctl status nginx, появляется следующее сообщение:

× nginx.service - Высокопроизводительный веб-сервер и обратный прокси-сервер
     Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled)
     Active: failed (Result: exit-code) since Fri 2024-03-08 07:06:36 CST; 1h 14min ago
       Docs: man:nginx(8)
    Process: 27329 ExecStartPre=/usr/sbin/nginx -t -q -g daemon on; master_process on; (code=exited, status=0/SUCCESS)
    Process: 27330 ExecStart=/usr/sbin/nginx -g daemon on; master_process on; (code=exited, status=1/FAILURE)
        CPU: 42ms

Mar 08 07:06:33 vmi1695712.contaboserver.net systemd[1]: Starting A high performance web server and a reverse proxy server...
Mar 08 07:06:33 vmi1695712.contaboserver.net nginx[27330]: nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Unknown error)
Mar 08 07:06:34 vmi1695712.contaboserver.net nginx[27330]: nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Unknown error)
Mar 08 07:06:34 vmi1695712.contaboserver.net nginx[27330]: nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Unknown error)
Mar 08 07:06:35 vmi1695712.contaboserver.net nginx[27330]: nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Unknown error)
Mar 08 07:06:35 vmi1695712.contaboserver.net nginx[27330]: nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Unknown error)
Mar 08 07:06:36 vmi1695712.contaboserver.net nginx[27330]: nginx: [emerg] still could not bind()
Mar 08 07:06:36 vmi1695712.contaboserver.net systemd[1]: nginx.service: Control process exited, code=exited, status=1/FAILURE
Mar 08 07:06:36 vmi1695712.contaboserver.net systemd[1]: nginx.service: Failed with result 'exit-code'.
Mar 08 07:06:36 vmi1695712.contaboserver.net systemd[1]: Failed to start A high performance web server and a reverse proxy server.

Мой файл конфигурации сайта для Discourse:

# Default server configuration
#
server {
        # listen 80 default_server;
        # listen [::]:80 default_server;

        # SSL configuration
        #
        # listen 443 ssl default_server;
        # listen [::]:443 ssl default_server;
        #
        # Note: You should disable gzip for SSL traffic.
        # See: https://bugs.debian.org/773332
        #
        # Read up on ssl_ciphers to ensure a secure configuration.
        # See: https://bugs.debian.org/765782
        #
        # Self signed certs generated by the ssl-cert package
        # Don't use them in a production server!
        #
        # include snippets/snakeoil.conf;

        root /var/www/html;

        # Add index.php to the list if you are using PHP
        index index.html index.htm index.nginx-debian.html;

        server_name forum.ictsharks.com;

        location / {
                proxy_pass http://unix:/var/discourse/shared/standalone/nginx.http.sock:;
                proxy_set_header Host $http_host;
                proxy_http_version 1.1;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header X-Forwarded-Proto $scheme;
                proxy_set_header X-Real-IP $remote_addr;
                # First attempt to serve request as file, then
                # as directory, then fall back to displaying a 404.
                # try_files $uri $uri/ =404;
        }

        # pass PHP scripts to FastCGI server
        #
        #location ~ \.php$ {
        #       include snippets/fastcgi-php.conf;
        #
        #       # With php-fpm (or other unix sockets):
        #       fastcgi_pass unix:/run/php/php7.4-fpm.sock;
        #       # With php-cgi (or other tcp sockets):
        #       fastcgi_pass 127.0.0.1:9000;
        #}

        # deny access to .htaccess files, if Apache's document root
        # concurs with nginx's one
        #
        #location ~ /\.ht {
        #       deny all;
        #}
}

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

Извините, я новичок в Linux / NGINX / Docker. Любые советы будут очень полезны. Спасибо.

Не запущен ли на этой машине другой веб-сервер, занимающий порт 80?

Вы изменили порты в app.yml, чтобы Discourse не пытался использовать порты, которые нужны NGINX?

Это продвинутая настройка, требующая понимания DNS, HTTPS и сертификатов, NGINX, обратных прокси, Docker и маршрутизации.

Как я уже упоминал, WordPress работает на основном домене.

Если я правильно понял, другой Nginx работает в контейнере вместе с WordPress.

Я следовал этому руководству: How To Install WordPress With Docker Compose | DigitalOcean

Если я запущу команду netstat -tulnp, вот что я получу:

Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 127.0.0.53:53           0.0.0.0:*               LISTEN      419/systemd-resolve
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      1192/docker-proxy
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      463/sshd: /usr/sbin
tcp        0      0 0.0.0.0:443             0.0.0.0:*               LISTEN      1179/docker-proxy
tcp6       0      0 :::22                   :::*                    LISTEN      463/sshd: /usr/sbin
udp        0      0 127.0.0.53:53           0.0.0.0:*                           419/systemd-resolve

В инструкциях предлагается закомментировать их, поэтому я сделал так:

## Какие порты TCP/IP должен открывать этот контейнер?
## Если вы хотите, чтобы Discourse использовал порт совместно с другим веб-сервером, например Apache или nginx,
## см. https://meta.discourse.org/t/17247 для подробностей
expose:
  # - "80:80"   # http
  # - "443:443" # https

Я понимаю, что такое DNS-записи, HTTPS и сертификаты. Всё остальное для меня ново.

Не волнуйтесь, я умею пользоваться Google и быстро учусь :wink:

До того как вы начали это делать, стоял ли перед ним рабочий обратный прокси NGINX, к которому вы добавляете Discourse?

Или, если до этого работал Apache/WordPress, то именно он занимал порт 80?

О, похоже, что docker-proxy использует порт 80, возможно, ваш WordPress был за docker-proxy?

Попробуйте выполнить docker ps, чтобы посмотреть, видите ли вы какой-либо docker

Как я уже говорил, я считаю, что другой Nginx (тот, что для WordPress) работает в контейнере вместе с MySQL и WordPress.

Вот что я получаю при запуске команды docker ps:

CONTAINER ID   IMAGE                        COMMAND                  CREATED          STATUS          PORTS                                      NAMES
6ca4cbec2c88   local_discourse/app          "/sbin/boot"             51 minutes ago   Up 15 minutes                                              app
4a3ebdd9f5b5   nginx:1.15.12-alpine         "nginx -g 'daemon of…"   20 hours ago     Up 15 minutes   0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp   webserver
42c4211a2fb6   wordpress:5.1.1-fpm-alpine   "docker-entrypoint.s…"   2 days ago       Up 15 minutes   9000/tcp                                   wordpress
5b588a7435ad   mysql:8.0                    "docker-entrypoint.s…"   2 days ago       Up 15 minutes   3306/tcp, 33060/tcp                        db

Вот почему внешний nginx не может запуститься — порты заняты внутренним. Скорее всего, вам нужно остановить этот контейнер и перенести его конфигурацию для WordPress на внешний слой nginx.

Кроме того, это отдельные контейнеры: nginx отделён от MySQL и WordPress.

Я остановил веб-сервер (контейнер NGIX) и попытался запустить внешний NGIX. Всё ещё не работает.

Ты прав. Это моя ошибка. Я думал, что все упомянутые приложения находятся в одном контейнере.

Один контейнер = одно приложение/программа :wink:

Как сейчас выглядят docker ps и netstat -tulnp?

CONTAINER ID   IMAGE                        COMMAND                  CREATED       STATUS       PORTS                 NAMES
6ca4cbec2c88   local_discourse/app          "/sbin/boot"             3 hours ago   Up 2 hours                         app
42c4211a2fb6   wordpress:5.1.1-fpm-alpine   "docker-entrypoint.s…"   2 days ago    Up 2 hours   9000/tcp              wordpress
5b588a7435ad   mysql:8.0                    "docker-entrypoint.s…"   2 days ago    Up 2 hours   3306/tcp, 33060/tcp   db

Активные интернет-соединения (только серверы)
Proto Recv-Q Send-Q Локальный адрес           Внешний адрес           Состояние       PID/Имя программы
tcp        0      0 127.0.0.53:53           0.0.0.0:*               LISTEN      418/systemd-resolve
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      462/sshd: /usr/sbin
tcp6       0      0 :::22                   :::*                    LISTEN      462/sshd: /usr/sbin
udp        0      0 127.0.0.53:53           0.0.0.0:*                           418/systemd-resolve

Больше я здесь ничего сделать не могу. Похоже, что nginx всё ещё делает то же самое, или ошибка хоть как-то изменилась?

Это следует делать в сочетании с добавлением шаблона web.socketed.template.yml. Вы это сделали?

Да, я пробовал.

Я пытался удалить и переустановить NGINX, а также удалил файл конфигурации. Однако проблема сохраняется.

Я попробую найти указанные ошибки NGINX и посмотрю, что смогу найти.

Я решил проблему с NGIX! :grinning:

В папке /etc/nginx/sites-enabled/ был какой-то мусор — файл “ysystemctl status nginx”. Я его удалил.

Теперь NGIX работает :muscle:

Я последую инструкциям riking и сообщу, как всё получится.

Хорошо, мой форум Discourse запущен и работает!

К сожалению, в инструкциях не указано, как изменить настройки для NGINX, на котором работает сайт/WordPress.

В них сказано лишь следующее: Создайте другие «сайты» NGINX, затем свяжите их и активируйте, как в последнем шаге выше.

Я был бы очень признателен за любые советы о том, как это сделать.

Я установил WordPress в соответствии с этим руководством: Как установить WordPress с помощью Docker Compose

Кроме того, не могли бы вы подтвердить или опровергнуть мои выводы?

  1. NGINX (тот, что не в контейнере) используется как обратный прокси.
  2. NGINX (тот, что не в контейнере) называется «внешним NGINX».
  3. NGINX (тот, что не в контейнере) использует unix-сокеты вместо TCP-портов для связи в текущей конфигурации.
  4. Discourse — это автономное приложение, поэтому ему не нужно устанавливать собственный веб-сервер NGINX.

Приношу извинения, если я пытаюсь проверить очевидные вещи. Я просто хочу быть на 100% уверенным.

Вот и всё.

Контейнер Discourse включает в себя nginx, rails, postgres и redis.