Comment exécuter Discourse en tant que VirtualHost Apache

J’ai réussi à installer Discourse sur mon serveur, à m’inscrire en tant que premier utilisateur et à publier mon premier sujet. Tout semble donc fonctionner correctement côté Discourse.

Cependant, pour installer et faire fonctionner Discourse, j’ai dû désactiver mon démon Apache httpd. C’est un problème majeur pour moi, car j’ai essentiellement arrêté l’ensemble de mon serveur web, qui héberge plusieurs domaines ainsi qu’un serveur de conférence Jitsi.

Mon installation de Jitsi fonctionne comme un hôte virtuel distinct, utilisant un sous-domaine de l’un des sites que j’héberge. Puisque Jitsi peut partager le port 443 avec le reste du trafic web, je souhaiterais faire de même avec Discourse.

Quelqu’un possède-t-il une définition de modèle d’hôte virtuel permettant de rediriger le trafic vers Discourse lorsqu’il arrive sur le sous-domaine de Discourse ?

2 « J'aime »

Oui, il existe des guides ici sur Meta qui discutent de l’exécution de Discourse parallèlement à d’autres sites.

Je suis convaincu que si vous utilisez la recherche, vous pourrez les trouver.

2 « J'aime »

Essentiellement résolu, cependant la page d’accueil semble prendre beaucoup de temps pour terminer la requête, même après que la page semble être complètement chargée. (Je ne suis pas sûr que ce soit un comportement normal ou non.)

Discourse
J’ai modifié le bloc expose dans /var/discourse/containers/app.yml pour :

expose:
  - "127.0.0.1:8000:80"   # http
  - "127.0.0.1:8443:443"  # https

Ce qui redirige depuis localhost vers le conteneur Docker. Après cela, une reconstruction est nécessaire en utilisant ./launcher rebuild app

Apache2 2.4.43 (Ubuntu)
J’ai ajouté un nouvel hôte virtuel pour le sous-domaine : discourse..com.conf dans sites-available, qui redirige le trafic du sous-domaine vers le port localhost sur lequel l’instance Docker de Discourse écoute. La définition de l’hôte virtuel est ci-dessous :

<VirtualHost *:80>
    ServerName discourse.<myDomain>.com
    Redirect permanent / https://discourse.<myDomain>.com/
    RewriteEngine On
    RewriteCond %{HTTPS} off
    RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
</VirtualHost>

<VirtualHost *:443>

  ServerName discourse.<myDomain>.com

  SSLProtocol TLSv1 TLSv1.1 TLSv1.2
  SSLEngine on
  SSLProxyEngine on
  SSLCertificateFile /etc/letsencrypt/live/<myDomain>.com/cert.pem
  SSLCertificateKeyFile /etc/letsencrypt/live/<myDomain>.com/privkey.pem
  SSLCACertificateFile /etc/letsencrypt/live/<myDomain>.com/chain.pem
  SSLCipherSuite "EECDH+ECDSA+AESGCM:EECDH+aRSA+AESGCM:EECDH+ECDSA+SHA256:EECDH+aRSA+SHA256:EECDH+ECDSA+SHA384:EECDH+ECDSA+SHA256:EECDH+aRSA+SHA384:EDH+aRSA+AESGCM:EDH+aRSA+SHA256:EDH+aRSA:EECDH:!aNULL:!eNULL:!MEDIUM:!LOW:!3DES:!MD5:!EXP:!PSK:!SRP:!DSS:!RC4:!SEED"
  SSLHonorCipherOrder on
  Header set Strict-Transport-Security "max-age=31536000"

  <Location />
    Order allow,deny
    Allow from all
    Require all granted
  </Location>

  ProxyPreserveHost on
  ProxyRequests Off
  RequestHeader set X-Forwarded-Proto expr=%{REQUEST_SCHEME}
  RequestHeader set X-Real-IP expr=%{REMOTE_ADDR}
  ProxyPass / https://127.0.0.1:8443/
  ProxyPassReverse / https://127.0.0.1:8443/

</VirtualHost>

Comme je ne passe pas beaucoup de temps à configurer Apache, il peut y avoir des lignes inutiles, ou des lignes qui pourraient être ajoutées ou améliorées. Tout retour est le bienvenu.

1 « J'aime »

Bonjour @Nap,

Ravi de lire que vous avez résolu votre problème.

J’exécute Discourse sur plusieurs serveurs avec Apache2 comme proxy inverse frontal se connectant à une socket Unix, et la configuration fonctionne parfaitement (comme nous le savons tous, elle est un peu plus lente que nginx, que j’utilise également sur certains serveurs, mais elle fonctionne bien).

En gros, je configure le virtual host comme suit :

Configuration du port 80

<VirtualHost *:80>
    ServerAdmin webmaster@localhost
    ServerName  discourse.mygreatwebsite.com
    DocumentRoot /website/discourse  # souvent inutile

    RewriteEngine On
    ProxyPreserveHost On
    ProxyRequests Off
    ErrorLog /var/log/apache2/discourse.error.log
    LogLevel warn
    CustomLog /var/log/apache2/discourse.access.log combined

    RewriteCond %{SERVER_NAME} =discourse.mygreatwebsite.com
    RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]
</VirtualHost>

Configuration du port 443 :

<VirtualHost *:443>
  ServerAdmin webmaster@localhost
  ServerName  discourse.mygreatwebsite.com
  DocumentRoot /website/nginx  # généralement inutile dans cette configuration
  
  SSLProxyEngine on
  RewriteEngine On
  ProxyPreserveHost On
  ProxyRequests Off
  RequestHeader set X-Forwarded-Proto expr=%{REQUEST_SCHEME}
  RequestHeader set X-Real-IP expr=%{REMOTE_ADDR}
  
  ProxyPass / unix:/var/discourse/shared/socket-only/discourse.http.sock|http://mon.ip.adresse.ici/
  ProxyPassReverse  / unix:/var/discourse/shared/socket-only/discourse.http.sock|http://mon.ip.adresse.ici/
  ErrorLog /var/log/apache2/discourse-ssl.error.log
  LogLevel warn
  CustomLog /var/log/apache2/discourse-ssl.access.log combined

  Include /etc/letsencrypt/options-ssl-apache.conf
  SSLCertificateFile /etc/letsencrypt/live/discourse.com/fullchain.pem
  SSLCertificateKeyFile /etc/letsencrypt/live/discourse.com/privkey.pem
</VirtualHost>

Remarques :

  1. Habituellement, je laisse letsecrypt certbot faire tout le travail concernant la configuration des certificats SSL, des redirections, etc.

  2. Nous utilisons l’adresse IP à laquelle Apache2 est lié dans les fichiers de configuration d’Apache2.

  3. Nous configurons toujours cela (exposer) avec des sockets Unix dans le conteneur Discourse et n’exposons aucun port TCP/IP du conteneur dans cette configuration.

Salutations et j’espère que cela apporte une certaine valeur, même en fin de parcours.

5 « J'aime »

Deux ajouts rapides :

  1. Si vous souhaitez utiliser un socket Unix au lieu d’un proxy direct, vous pouvez le faire (après avoir activé web.socketed.template.yml dans votre app.yml) de la manière suivante :
  ProxyPreserveHost On
  ProxyRequests Off
  RequestHeader set X-Forwarded-Proto https
  RequestHeader set X-Real-IP expr=%{REMOTE_ADDR}
  <Location />
    ProxyPass unix:/var/discourse/shared/standalone/nginx.http.sock|http://localhost/
    ProxyPassReverse unix:/var/discourse/shared/standalone/nginx.http.sock|http://localhost/
  </Location>

Notez que vous devrez probablement gérer SELinux si vous essayez de faire lire Apache à partir de /var/discourse de cette manière. Une commande comme semanage fcontext -a -t httpd_sys_rw_content_t /var/discourse/shared/standalone/nginx.http.sock, suivie de restorecon /var/discourse/shared/standalone/nginx.http.sock, devrait suffire.

  1. Apache dispose du plutôt génial mod_md qui peut obtenir automatiquement vos certificats LetsEncrypt. Je le recommande vivement.
2 « J'aime »

This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.