HTTPS fonctionne parfaitement, mais l'URL HTTP affiche la page d'accueil NGINX et ne redirige pas

J’ai récemment installé Discourse sur un VPS Ubuntu Focal Fossa et cela fonctionne très bien, mais je rencontre des difficultés pour résoudre certaines particularités d’URL.

Voici le comportement que j’observe (dans Safari). J’ai créé des enregistrements A nommés @, WWW et * chez mon registraire.

example.com [affiche la page « Bienvenue sur nginx ! »] ÉCHEC
www.example.com [redirige vers https://example.com] SUCCÈS
http://example.com [affiche la page « Bienvenue sur nginx ! »] ÉCHEC
http://www.example.com [redirige vers https://example.com et fonctionne correctement] SUCCÈS
https://example.com [fonctionne comme prévu, sans redirection] SUCCÈS
https://www.example.com [affiche l'erreur « Cette connexion n'est pas privée » du navigateur] ÉCHEC

Je souhaite que mon installation soit située à la racine/apex, j’ai donc saisi example.com lors de la configuration.

Tous conseils seront les bienvenus !

Exécutez-vous un nginx externe sur le serveur Discourse ? Pourquoi ?

Discourse est déjà livré avec un nginx préconfiguré qui s’en chargera, à condition que vous lui permettiez d’écouter les ports 80 et 443.

1 « J'aime »

Bonjour @Falco, merci pour votre réponse. À ma connaissance, non, l’image du fournisseur VPS est simplement nommée « Focal Fossa Clean OS », ce qui signifie probablement qu’elle ne contient aucun outil tiers.

Il s’agit d’une installation standard, directement sortie de la boîte, en suivant la procédure d’installation de « 30 minutes » publiée.

sudo su

wget -qO- https://get.docker.com/ | sh

git clone https://github.com/discourse/discourse_docker.git /var/discourse

cd /var/discourse

./discourse-setup
1 « J'aime »

Oh, c’est alors un comportement vraiment étrange !

Peux-tu partager ton app.yml ici (en supprimant les données sensibles comme les mots de passe) ? Le fichier se trouve dans /var/discourse/containers/app.yml.

Aussi, le résultat de docker ps -a.

Bien sûr, merci. Est-ce que le fait que mon domaine ait une extension de domaine (TLD) inhabituelle pourrait causer des problèmes ? (c’est une .community).

## Ceci est le modèle de conteneur Docker Discourse autonome tout-en-un
##
## Après avoir apporté des modifications à ce fichier, vous DEVEZ reconstruire
## /var/discourse/launcher rebuild app
##
## SOYEZ *TRÈS* PRUDENT EN ÉDITANT !
## LES FICHIERS YAML SONT EXTRÊMEMENT SENSIBLES AUX ERREURS D'ESPACEMENT OU D'ALIGNEMENT !
## visitez http://www.yamllint.com/ pour valider ce fichier si nécessaire

templates:
  - "templates/postgres.template.yml"
  - "templates/redis.template.yml"
  - "templates/web.template.yml"
  - "templates/web.ratelimited.template.yml"
## Décommentez ces deux lignes si vous souhaitez ajouter Lets Encrypt (https)
  - "templates/web.ssl.template.yml"
  - "templates/web.letsencrypt.ssl.template.yml"

## Quels ports TCP/IP ce conteneur doit-il exposer ?
## Si vous souhaitez que Discourse partage un port avec un autre serveur web comme Apache ou nginx,
## consultez https://meta.discourse.org/t/17247 pour plus de détails
expose:
  - "80:80"   # http
  - "443:443" # https

params:
  db_default_text_search_config: "pg_catalog.english"

  ## Définissez db_shared_buffers à un maximum de 25 % de la mémoire totale.
  ## Sera défini automatiquement par bootstrap en fonction de la RAM détectée, ou vous pouvez le remplacer
  db_shared_buffers: "768MB"

  ## Peut améliorer les performances de tri, mais augmente l'utilisation de la mémoire par connexion
  #db_work_mem: "40MB"

  ## Quelle révision Git ce conteneur doit-il utiliser ? (par défaut : tests-passed)
  #version: tests-passed

env:
  LANG: en_US.UTF-8
  # DISCOURSE_DEFAULT_LOCALE: en

  ## Combien de requêtes web simultanées sont prises en charge ? Dépend de la mémoire et des cœurs CPU.
  ## Sera défini automatiquement par bootstrap en fonction des CPU détectés, ou vous pouvez le remplacer
  UNICORN_WORKERS: 8

  ## TODO : Le nom de domaine auquel cette instance Discourse répondra
  ## Requis. Discourse ne fonctionnera pas avec une adresse IP brute.
  DISCOURSE_HOSTNAME: example.com

  ## Décommentez si vous souhaitez que le conteneur soit démarré avec le même
  ## nom d'hôte (option -h) que spécifié ci-dessus (par défaut "$hostname-$config")
  #DOCKER_USE_HOSTNAME: true

  ## TODO : Liste d'e-mails séparés par des virgules qui seront définis comme administrateurs et développeurs
  ## lors de l'inscription initiale, par exemple 'user1@example.com,user2@example.com'
  DISCOURSE_DEVELOPER_EMAILS: 'email@gmail.com'

  ## TODO : Le serveur de messagerie SMTP utilisé pour valider les nouveaux comptes et envoyer des notifications
  # L'adresse SMTP, le nom d'utilisateur et le mot de passe sont requis
  # ATTENTION, le caractère '#' dans le mot de passe SMTP peut causer des problèmes !
  DISCOURSE_SMTP_ADDRESS: smtp.postmarkapp.com
  DISCOURSE_SMTP_PORT: 587
  DISCOURSE_SMTP_USER_NAME: username
  DISCOURSE_SMTP_PASSWORD: "password"
  #DISCOURSE_SMTP_ENABLE_START_TLS: true           # (optionnel, par défaut true)
  #DISCOURSE_SMTP_DOMAIN: discourse.example.com    # (requis par certains fournisseurs)

  ## Si vous avez ajouté le modèle Lets Encrypt, décommentez ci-dessous pour obtenir un certificat SSL gratuit
  LETSENCRYPT_ACCOUNT_EMAIL: email@gmail.com


  ## L'adresse CDN http ou https pour cette instance Discourse (configurée pour récupérer)
  ## consultez https://meta.discourse.org/t/14857 pour plus de détails
  #DISCOURSE_CDN_URL: https://discourse-cdn.example.com

  ## La clé d'adresse IP de géolocalisation Maxmind pour la recherche d'adresses IP
  ## consultez https://meta.discourse.org/t/-/137387/23 pour plus de détails
  #DISCOURSE_MAXMIND_LICENSE_KEY: 1234567890123456

## Le conteneur Docker est sans état ; toutes les données sont stockées dans /shared
volumes:
  - volume:
      host: /var/discourse/shared/standalone
      guest: /shared
  - volume:
      host: /var/discourse/shared/standalone/log/var-log
      guest: /var/log

## Les plugins vont ici
## consultez https://meta.discourse.org/t/19157 pour plus de détails
hooks:
  after_code:
    - exec:
        cd: $home/plugins
        cmd:
          - git clone https://github.com/discourse/docker_manager.git

## Toutes les commandes personnalisées à exécuter après la construction
run:
  - exec: echo "Début des commandes personnalisées"
  ## Si vous souhaitez définir l'adresse e-mail 'From' pour votre première inscription, décommentez et modifiez :
  ## Après avoir reçu le premier e-mail d'inscription, re-commentez la ligne. Elle ne doit être exécutée qu'une seule fois.
  #- exec: rails r "SiteSetting.notification_email='info@unconfigured.discourse.org'"
  - exec: echo "Fin des commandes personnalisées"

et

CONTAINER ID   IMAGE                 COMMAND        CREATED          STATUS          PORTS                                      NAMES
465fbf1c3fb8   local_discourse/app   "/sbin/boot"   47 minutes ago   Up 46 minutes   0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp   app

Peut-être que cette distribution fournie par votre hébergeur est livrée avec nginx préinstallé ?

Que retourne la commande curl -I localhost ?

HTTP/1.1 301 Déplacé de façon permanente
Serveur : nginx/1.18.0
Date : lun. 25 janv. 2021 20:18:00 GMT
Type de contenu : text/html
Longueur du contenu : 169
Connexion : keep-alive
Emplacement : https://example.com

Cela signifie-t-il qu’il était déjà installé désolé, je suis un n00b dans ce domaine

C’est exactement la réponse attendue lorsque tout fonctionne. Alors, est-ce que http://example.com affiche toujours la page de bienvenue de nginx ?

https://example.com fonctionne parfaitement, mais http://example.com (HTTP) redirige vers la page Welcome to nginx! :sob:

Pouvez-vous partager le vrai domaine ?

Donc, cela ne me donne absolument pas la page de bienvenue de nginx.

Peux-tu essayer sur un autre appareil, comme ton téléphone ?

curl -I example.com -L
HTTP/1.1 301 Moved Permanently
Server: nginx/1.18.0
Date: Mon, 25 Jan 2021 20:35:21 GMT
Content-Type: text/html
Content-Length: 169
Connection: keep-alive
Location: https://example.com/

HTTP/2 200 
server: nginx
date: Mon, 25 Jan 2021 20:35:22 GMT
content-type: text/html; charset=utf-8
vary: Accept-Encoding
x-frame-options: SAMEORIGIN
x-xss-protection: 1; mode=block
x-content-type-options: nosniff
x-download-options: noopen
x-permitted-cross-domain-policies: none
referrer-policy: strict-origin-when-cross-origin
x-discourse-route: finish_installation/index
cache-control: no-cache, no-store
content-security-policy: base-uri 'none'; object-src 'none'; script-src https://example.com/logs/ https://example.com/sidekiq/ https://example.com/mini-profiler-resources/ https://example.com/assets/ https://example.com/brotli_asset/ https://example.com/extra-locales/ https://example.com/highlight-js/ https://example.com/javascripts/ https://example.com/plugins/ https://example.com/theme-javascripts/ https://example.com/svg-sprite/; worker-src 'self' https://example.com/assets/ https://example.com/brotli_asset/ https://example.com/javascripts/ https://example.com/plugins/
x-request-id: 8755d4fa-387f-4509-8709-b6075f274d09
x-runtime: 0.026020
strict-transport-security: max-age=31536000
1 « J'aime »

Bon, je suis clairement un idiot. J’ai essayé sur mon téléphone en 4G (pour vérifier le DNS local), tous ces URL ont fonctionné sans problème. Une fois reconnecté au WiFi, tout fonctionne bien. J’ai donc vidé le cache de Safari sur le bureau et paf — tout fonctionne aussi là-bas.

Cela doit provenir de quand je testais initialement l’hébergeur et que le cache n’a pas été vidé depuis. Merci beaucoup pour votre aide dans le dépannage et désolé d’avoir pris de votre temps.

2 « J'aime »

Pour information, j’ai rencontré le même problème aujourd’hui avec Ubuntu 22.04. Vider le cache de Safari et rafraîchir a également résolu le problème.