Запуск Discourse вместе с Apache

Я видел несколько руководств, объясняющих, как это сделать, но все они описывают разные подходы, что меня не устраивает. Можно ли настроить виртуальный хост Apache для Discourse так, чтобы конкретный домен перенаправлял на это приложение, точно так же, как это делается для других веб-сайтов и соответствующих доменов?

Спасибо.

Да. В этих руководствах объясняется, как это сделать.

Или, если вы спрашиваете, можно ли запустить Discourse без Docker и с Apache в качестве обратного прокси, то ответ — нет.

За 5 долларов в месяц вы можете избежать этих проблем.

Спасибо за ответ.

Я запускаю его на VPS. У меня установлен Apache, и я не очень опытен в работе с веб-сайтами. Я изучаю эту тему: Run other websites on the same machine as Discourse

Но, судя по всему, для этого нужно использовать Nginx из-за конфигурационных файлов. Мой вопрос: можно ли сделать то же самое с Apache?

Посмотрите: Set up Discourse on a server with existing Apache sites

Да, я тоже смотрел это. Он освещал это для CentOS, а не для Ubuntu, некоторые моменты мне не совсем ясны

Если вы не знакомы с этим (и не хотите разбираться), я настоятельно рекомендую отказаться от Apache и запускать только Discourse на VPS. Если вам нужно запускать дополнительные службы, выделите отдельный VPS для Apache и другой — для Discourse.

Итак, я переключился на Nginx, и всё работает. Я считаю, что SSL настроен правильно, но в Chrome появляется сообщение «Ваше соединение с этим сайтом не полностью защищено». Принудительный HTTPS включён.

SSL настроен для службы nginx внутри контейнера. Если контейнер доступен из интернета и вы обращаетесь к нему напрямую через браузер (стандартная установка Discourse), то SSL будет работать.

Однако, если вы размещаете обратный прокси-сервер перед ним (будь то Apache, Nginx или сторонний сервис, например Cloudflare), вам необходимо обеспечить безопасность соединения между браузером и обратным прокси-сервером.

Таким образом, в вашем случае вам нужно будет сгенерировать сертификаты для обратного прокси-сервера nginx (я не думаю, что вам нужно добавлять шаблоны SSL из Discourse, поскольку контейнер не доступен напрямую из интернета; вы можете это сделать, но это не обязательно).

Вы можете ознакомиться с инструкциями по настройке этого с помощью Let’s Encrypt (бесплатно, тот же сервис, что используется в стандартной установке Discourse, но в данном случае для nginx вне контейнера).

Кратко: обратный прокси-сервер nginx требует настройки SSL. Внутренний nginx в контейнере не требует SSL (при условии, что вы обращаетесь к нему с той же машины).

Так, для обеспечения безопасности между браузером и обратным прокси мне нужно настроить SSL в конфигурационном файле nginx?

Спасибо

Вот моя конфигурация, что еще нужно добавить?

server {
listen 80; listen [::]:80;
server_name a1rp.xyz; # ← измените это

return 301 https://$host$request_uri;

}

server {
listen 443 ssl http2; listen [::]:443 ssl http2;
server_name a1rp.xyz; # ← измените это

ssl on;
ssl_certificate      /var/discourse/shared/standalone/ssl/a1rp.xyz.cer;
ssl_certificate_key  /var/discourse/shared/standalone/ssl/a1rp.xyz.key;
ssl_dhparam          /var/discourse/shared/standalone/ssl/dhparams.pem;
ssl_session_tickets off;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:ECDHE-RSA-DES-CBC3-SHA:ECDHE-ECDSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA;

http2_idle_timeout 5m; # увеличено с 3 м по умолчанию

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 https;
    proxy_set_header X-Real-IP $remote_addr;
}

}

Убедитесь, что:

  1. Закомментированы все шаблоны SSL в папке templates (в файле app.yml). Если вы используете Let’s Encrypt, у вас будет два шаблона:
# - "templates/web.ssl.template.yml"
# - "templates/web.letsencrypt.ssl.template.yml"
  1. Добавлен шаблон сокета:
- "templates/web.socketed.template.yml"
  1. Закомментированы все открытые порты:
# - "80:80"   # http
# - "443:443" # https

(Или вы можете открыть другие порты, например 8080:80 и 8443:443, и вместо использования сокета на следующем шаге перенаправлять запросы на upstream, указывающий на localhost:80 и/или localhost:443)

  1. У вас есть:
proxy_pass http://unix:/var/discourse/shared/standalone/nginx.http.sock;

Думаю, вам нужно добавить : в конце пути к сокету:

proxy_pass http://unix:/var/discourse/shared/standalone/nginx.http.sock:;
  1. Убедитесь, что файлы SSL-сертификата находятся в директории /var/discourse/shared/standalone/ssl/. Есть ли они у вас? Предполагаю, что вы уже владеете доменом a1rp.xyz и ознакомились с инструкциями по генерации SSL-сертификатов на сайте Let’s Encrypt. Также имейте в виду, что в стандартной установке Discourse автоматически обновляет сертификаты, но в вашем случае вам придётся делать это самостоятельно (например, с помощью cron), иначе сертификаты истекут через 3 месяца.

См.:

Да, у меня в конфигурации приложения есть всё, что вы перечислили (включая пост с исправлением некоторых моментов). Что касается двоеточия (:), я не думаю, что это имеет значение. Был пост, где говорилось, что двоеточие там тоже быть не должно. SSL-файлы у меня уже есть.

Так что я решил проблему. Кто-то упомянул, что фавикон отображается по HTTP, из-за чего возникала ошибка. Я загрузил что-то другое и удалил его, теперь сайт полностью работает по HTTPS :slight_smile: