Comment installer Discourse derrière Apache mod_proxy ?

Bonjour à tous.

Je tente de configurer Discourse dans un conteneur Docker. L’environnement hôte (Debian) exécute un serveur Apache httpd (je ne peux pas utiliser nginx car j’héberge d’autres sites sur Apache). Je souhaite utiliser mod_proxy pour faire un reverse-proxy vers le conteneur, qui écoute sur le port 3000.

La configuration actuelle d’Apache pour ce vhost est la suivante :

<VirtualHost *:80>
  ServerAdmin webmaster@example.com
  ServerName example.com
  ServerAlias www.example.com

  ErrorLog ${APACHE_LOG_DIR}/vhosts/example.com/error.log
  CustomLog ${APACHE_LOG_DIR}/vhosts/example.com/access.log combined

  <IfModule proxy_module>
  ## <https://meta.discourse.org/t/running-other-websites-on-the-same-machine-as-discourse/17247>
    ProxyPreserveHost on
    RequestHeader set X-Forwarded-Proto expr=%{REQUEST_SCHEME}
    RequestHeader set X-Real-IP expr=%{REMOTE_ADDR}
    ProxyPass / http://localhost:3000/
    ProxyPassReverse / http://localhost:3000/
  </IfModule>
</VirtualHost>

J’ai commencé uniquement avec les directives ProxyPass et ProxyPassReverse, puis j’ai ajouté ProxyPreserveHost et les directives RequestHeader une par une. Peu importe comment je configure le proxy avec ces directives, certains fichiers situés sous la racine du document renvoient une erreur 404 lors de l’accès (par exemple, des éléments dans /images et /assets).

Notez le commentaire contenant l’URL de Discourse Meta que j’ai convertie de la syntaxe nginx vers Apache.

Toute suggestion sur la manière de faire fonctionner cela serait grandement appréciée !

Jetez un coup d’œil à Set up Discourse on a server with existing Apache sites

Donc, la solution que vous proposez consiste à exécuter Discourse derrière HAProxy, lui-même derrière Apache ?

Comme je l’ai dit, je dois utiliser Apache en façade car j’héberge d’autres vhosts sur cette machine.

Pourquoi pas nginx ? Je ne suis pas sûr des performances de Discourse avec Apache.

Je n’ai ni le temps ni les ressources pour passer à nginx pour le moment.

Pour être clair, Discourse lui-même serait exécuté sur nginx, mais il doit être passé par proxy via Apache.

J’ai regardé un peu plus en détail cette question et je pense pouvoir réaliser ce que je souhaite, car il semble que HAProxy puisse sélectionner les backends en fonction du vhost.

Désolé. J’ai fait la mauvaise recherche. Peut-être pouvez-vous réessayer et trouver un howto pour Apache.

HAProxy fait exactement ce que je recherche et semble être un outil très abouti et utile. Merci pour l’indication.

Cependant, il semble que l’édition des fichiers templates/web*.yml pour écouter sur des ports autres que les valeurs par défaut 80 et 443 ait été la source du problème. J’ai restauré les configurations par défaut, puis j’ai édité containser/app.yml en ajoutant des lignes similaires à celles-ci, et les erreurs 404 ont disparu :

expose:
  - "127.0.0.1:1234:80"    # http

Je suis vraiment satisfait de Traefik récemment, et il gère automatiquement les certificats Let’s Encrypt (vous pouvez aussi le faire avec HA-Proxy, mais c’est un peu plus fastidieux).

Ravi que vous ayez trouvé la solution !