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

Уважаемый @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.

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