Хочу установить с использованием обратного прокси для Apache

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

Проверка вашего доменного имени . . .
ПРЕДУПРЕЖДЕНИЕ: Порт 443 компьютера, по-видимому, недоступен с использованием имени хоста:
ДОМЕН-ИМЯ
ПРЕДУПРЕЖДЕНИЕ: Подключение к ДОМЕН-ИМЯ (порт 80) также не удается.

Это означает, что ДОМЕН-ИМЯ разрешается в некоторый IP-адрес, который не достигает этой
машины, где вы устанавливаете Discourse.

Первое, что нужно сделать, — убедиться, что ДОМЕН-ИМЯ разрешается в IP-адрес этого сервера.
Обычно это делается в том же месте, где вы покупали домен.

Если вы уверены, что IP-адрес разрешается корректно, проблема может быть в брандмауэре.
Поиск в интернете по запросу "открыть порты ВАШЕ ОБЛАЧНОЕ СЕРВИС" может помочь.

Этот инструмент предназначен только для самых стандартных установок. Если вы не сможете решить
проблему выше, вам нужно будет самостоятельно отредактировать containers/app.yml, а затем ввести

ОШИБКА
--------------------
Pups::ExecError: /usr/local/bin/ruby -e 'if ENV["DISCOURSE_HOSTNAME"] == "discourse.example.com"; puts "Прерывание! Домен не настроен!"; exit 1; end' завершился с ошибкой с кодом возврата #<Process::Status: pid 176 exit 1>
Место ошибки: /pups/lib/pups/exec_command.rb:112:in `spawn'
Ошибка выполнения с параметрами "/usr/local/bin/ruby -e 'if ENV[\"DISCOURSE_HOSTNAME\"] == \"discourse.example.com\"; puts \"Прерывание! Домен не настроен!\"; exit 1; end'"
de0d133ffdd4c51d9a870d09bd16ce8fcc0680130ced1446f0038b4175a46840
** НЕ УДАЛОСЬ ЗАПУСТИТЬ ** пожалуйста, прокрутите вверх и поищите более ранние сообщения об ошибках, их может быть несколько.
./discourse-doctor может помочь диагностировать проблему.

app.yml

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

params:

Вы не можете использовать discourse-setup, но можете поискать: Как установить Discourse на сервере с существующими сайтами Apache

Спасибо.
Я следовал руководству по сборке Discourse.
Однако обратный прокси в Apache работает некорректно.

    ProxyPass /  ws://var/discourse/shared/standalone/nginx.http.sock
    ProxyPassReverse / ws://var/discourse/shared/standalone/nginx.http.sock

Ошибка

 No protocol handler was valid for the URL /favicon.ico (scheme 'ws'). If you are using a DSO version of mod_proxy, make sure the proxy submodules are included in the configuration using LoadModule., 

Уважаемый @Teraterayuki,

Вот пример набора работающих виртуальных хостов Apache2 для обратного прокси к сокету Unix в контейнере Discourse:

Порт 80

<VirtualHost *:80>
        ServerName mysite.mydomain.com
        ServerAdmin webmaster@localhost
        ProxyPreserveHost On

        #ProxyPass / http://127.0.0.1:8888/
        #ProxyPassReverse / http://127.0.0.1:8888/

        # Доступные уровни логирования: trace8, ..., trace1, debug, info, notice, warn,
        # error, crit, alert, emerg.
        # Также можно настроить уровень логирования для отдельных
        # модулей, например:
        #LogLevel info ssl:warn

        ErrorLog ${APACHE_LOG_DIR}/community_errors.log
        CustomLog ${APACHE_LOG_DIR}/community.log combined

        # Для большинства файлов конфигурации из conf-available/, которые
        # включаются или отключаются на глобальном уровне, можно
        # добавить строку только для конкретного виртуального хоста. Например,
        # следующая строка включает конфигурацию CGI только для этого хоста
        # после того, как она была глобально отключена с помощью "a2disconf".
        #Include conf-available/serve-cgi-bin.conf
        ModPagespeed Off
        RewriteEngine on
        RewriteCond %{SERVER_NAME} =mysite.mydomain.com
        RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]
</VirtualHost>

Порт 443

<IfModule mod_ssl.c>
<VirtualHost *:443>
        ServerName mysite.mydomain.com
        ServerAdmin webmaster@localhost
        #SSLProxyEngine on   #включите это после настройки Let's Encrypt на обратном прокси
  	    RewriteEngine On
        
        RewriteCond %{HTTP_USER_AGENT}  (Bytespider|Yandex|Wget|seocompany|CCBot|Cincraw) [NC]
        RewriteRule . - [R=403,L]

  	    ProxyPreserveHost On
  	    ProxyRequests Off
  	    RequestHeader set X-Forwarded-Proto expr=%{REQUEST_SCHEME}
 	    RequestHeader set X-Real-IP expr=%{REMOTE_ADDR}

        #ProxyPass / http://127.0.0.1:8888/
        #ProxyPassReverse / http://127.0.0.1:8888/
        ProxyPass / unix:/var/discourse/shared/socket-only/nginx.http.sock|http://localhost/
        ProxyPassReverse  / unix:/var/discourse/shared/socket-only/nginx.http.sock|http://localhost/

        # Доступные уровни логирования: trace8, ..., trace1, debug, info, notice, warn,
        # error, crit, alert, emerg.
        # Также можно настроить уровень логирования для отдельных
        # модулей, например:
        #LogLevel info ssl:warn

        ErrorLog ${APACHE_LOG_DIR}/community_errors_ssl.log
        #CustomLog ${APACHE_LOG_DIR}/community_ssl.log combined

        # Для большинства файлов конфигурации из conf-available/, которые
        # включаются или отключаются на глобальном уровне, можно
        # добавить строку только для конкретного виртуального хоста. Например,
        # следующая строка включает конфигурацию CGI только для этого хоста
        # после того, как она была глобально отключена с помощью "a2disconf".
        #Include conf-available/serve-cgi-bin.conf
        ModPagespeed Off
        SSLCertificateFile /etc/letsencrypt/live/mysite.mydomain.com/fullchain.pem
        SSLCertificateKeyFile /etc/letsencrypt/live/mysite.mydomain.com/privkey.pem
        Include /etc/letsencrypt/options-ssl-apache.conf
</VirtualHost>
</IfModule>

@Teraterayuki

Обратите внимание, что в этой конфигурации прокси использует unix socket, а не web socket (ws).

Также обратите внимание, что в этой конфигурации вам не нужно вручную добавлять информацию о Let’s Encrypt. Вы можете начать с этого:

Порт 80 перед запуском Certbot

<VirtualHost *:80>
        ServerName mysite.mydomain.com
        ServerAdmin webmaster@localhost
        ProxyPreserveHost On

        #ProxyPass / http://127.0.0.1:8888/
        #ProxyPassReverse / http://127.0.0.1:8888/

        # Доступные уровни логирования: trace8, ..., trace1, debug, info, notice, warn,
        # error, crit, alert, emerg.
        # Также можно настроить уровень логирования для отдельных
        # модулей, например:
        #LogLevel info ssl:warn

        ErrorLog ${APACHE_LOG_DIR}/community_errors.log
        CustomLog ${APACHE_LOG_DIR}/community.log combined

        # Для большинства файлов конфигурации из conf-available/, которые
        # включаются или отключаются на глобальном уровне, можно
        # добавить строку только для конкретного виртуального хоста. Например,
        # следующая строка включает конфигурацию CGI только для этого хоста
        # после того, как она была глобально отключена с помощью "a2disconf".
        #Include conf-available/serve-cgi-bin.conf
        ModPagespeed Off
     
</VirtualHost>

Порт 443 перед запуском Certbot

<IfModule mod_ssl.c>
<VirtualHost *:443>
        ServerName mysite.mydomain.com
        ServerAdmin webmaster@localhost
        #SSLProxyEngine on   #включите это после настройки Let's Encrypt на обратном прокси
  	    RewriteEngine On
        


  	    ProxyPreserveHost On
  	    ProxyRequests Off
  	    RequestHeader set X-Forwarded-Proto expr=%{REQUEST_SCHEME}
 	    RequestHeader set X-Real-IP expr=%{REMOTE_ADDR}

        #ProxyPass / http://127.0.0.1:8888/
        #ProxyPassReverse / http://127.0.0.1:8888/
        ProxyPass / unix:/var/discourse/shared/socket-only/nginx.http.sock|http://localhost/
        ProxyPassReverse  / unix:/var/discourse/shared/socket-only/nginx.http.sock|http://localhost/

        # Доступные уровни логирования: trace8, ..., trace1, debug, info, notice, warn,
        # error, crit, alert, emerg.
        # Также можно настроить уровень логирования для отдельных
        # модулей, например:
        #LogLevel info ssl:warn

        ErrorLog ${APACHE_LOG_DIR}/community_errors_ssl.log
        #CustomLog ${APACHE_LOG_DIR}/community_ssl.log combined

        # Для большинства файлов конфигурации из conf-available/, которые
        # включаются или отключаются на глобальном уровне, можно
        # добавить строку только для конкретного виртуального хоста. Например,
        # следующая строка включает конфигурацию CGI только для этого хоста
        # после того, как она была глобально отключена с помощью "a2disconf".
        #Include conf-available/serve-cgi-bin.conf
        ModPagespeed Off

</VirtualHost>
</IfModule>

Затем, если вы выполните:

certbot -d mysite.mydomain.com

Дружелюбный certbot автоматически добавит необходимый SSL-код за вас.

После того как наш друг certbot добавит свой код конфигурации и всё будет работать как ожидается, вы можете раскомментировать эту строку:

#SSLProxyEngine on   #включите это после настройки Let's Encrypt на обратном прокси

и снова перезапустить apache2.

Надеюсь, это поможет @Teraterayuki.

Берегите себя.


Заключительные замечания:

  1. Обратите внимание, что мы не используем haproxy в наших конфигурациях обратного прокси Apache2. haproxy добавляет ненужный уровень сложности с практически никакой ощутимой пользой (для нас), поэтому мы запускаем Apache2 в качестве обратного прокси «простым способом». Если вы хотите использовать haproxy, результат может быть другим (YMMV); но честно говоря, мы не используем haproxy (в нескольких рабочих настройках обратного прокси Apache2) и никогда не сталкивались с проблемами при использовании Apache2 в качестве обратного прокси.
  1. Если вы не используете mod_pagespeed, закомментируйте эти строки. Однако, если вы запускаете mod_pagespeed, отключите mod_pagespeed для каждого виртуального хоста при обратном проксировании к Discourse.

Всего наилучшего… и надеюсь, это хоть немного поможет вам.

Готово!
Спасибо!
Вот что мы фактически настроили!

<VirtualHost *:80>
  ServerName DOMAIN-NAME
    ProxyPreserveHost on
    RequestHeader set X-Forwarded-Proto expr=%{REQUEST_SCHEME}
    RequestHeader set X-Real-IP expr=%{REMOTE_ADDR}
    ProxyPass / unix:/var/discourse/shared/standalone/nginx.http.sock|http://localhost/
    ProxyPassReverse  / unix:/var/discourse/shared/standalone/nginx.http.sock|http://localhost/
</VirtualHost>

Добро пожаловать!

Видите, как это просто?

Настройка Apache2 в качестве обратного прокси для Discourse — дело пустяковое, как вы показали на примере вашей простой конфигурации порта 80 без HTTPS. Молодец :slight_smile:

Мы также успешно получили доступ к сайту через HTTPS.
Кроме того, я настроил обратный прокси-сервер Apache для перенаправления на HTTPS.
Однако ресурсы, по-видимому, запрашиваются через HTTP и отображаются некорректно.
Что можно сделать?

Вам следует опубликовать ваши рабочие файлы конфигурации для виртуальных хостов, так как никто не может их увидеть и помочь вам, если вы их не опубликуете :slight_smile:

Кстати: Я опубликовал полностью рабочие, операционные (продакшн) файлы конфигурации виртуальных хостов для той же конфигурации, которую вы пытаетесь настроить. Если вы поймёте их и будете следовать им, у вас не возникнет никаких проблем :wink:

Вот как я это настроил.
Похоже, что все URL-адреса, генерируемые Discourse, используют http.

<VirtualHost *:80>
  ServerName DOMAIN-NAME
  RewriteEngine on
  RewriteCond %{HTTPS} off
  RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
</VirtualHost>
<VirtualHost *:443>
  ServerName DOMAIN-NAME
  SSLEngine On
  SSLProtocol all -SSLv2
  SSLCertificateFile /etc/letsencrypt/live/DOMAIN-NAME/fullchain.pem
  SSLCertificateKeyFile /etc/letsencrypt/live/DOMAIN-NAME/privkey.pem
  ProxyPreserveHost on
  RequestHeader set X-Forwarded-Proto expr=%{REQUEST_SCHEME}
  RequestHeader set X-Real-IP expr=%{REMOTE_ADDR}
  ProxyPass / unix:/var/discourse/shared/standalone/nginx.http.sock|http://localhost/
  ProxyPassReverse  / unix:/var/discourse/shared/standalone/nginx.http.sock|http://localhost/
</VirtualHost>

Вам следует установить DISCOURSE_FORCE_HTTPS в значение true или изменить этот параметр в настройках системы.

Привет! Скрипт discourse-setup перенаправляет сюда, если порты 80/443 заняты, но эти инструкции не относятся к новым установкам. Как выполнить новую установку с использованием моего собственного обратного прокси?

Попробуйте следующее:

./discourse-setup  --skip-connection-test --skip-rebuild

После этого вам всё равно придётся вручную отредактировать файл app.yml, но хотя бы он заполнит те поля, которые запрашивает программа.

Сообщите, пожалуйста, помогло ли это, чтобы кто-то мог соответствующим образом обновить эту инструкцию.

Я модифицировал скрипт, чтобы использовать переменные для HTTP_PORT и HTTPS_PORT. Однако это не идеальное решение, так как настройки будут потеряны. Думаю, стоит упомянуть об этом в посте — это будет полезно при первой установке :slight_smile:

Вы внесли изменения в app.yml? Когда, по вашему мнению, они могут быть утеряны?