HTTPS funciona perfectamente, pero la URL HTTP muestra la página de bienvenida de NGINX y no redirige

Recientemente he instalado Discourse en un VPS con Ubuntu Focal Fossa y funciona genial, pero tengo dificultades para resolver algunas peculiaridades de las URL.

A continuación se muestra el comportamiento que estoy observando (en Safari). He creado registros A con el nombre @, WWW y * en mi proveedor de dominio.

example.com [muestra la página 'Welcome to nginx!'] FALLA
www.example.com [redirige a https://example.com] ÉXITO
http://example.com [muestra la página 'Welcome to nginx!'] FALLA
http://www.example.com [redirige a https://example.com y funciona correctamente] ÉXITO
https://example.com [funciona como se esperaba, no redirige] ÉXITO
https://www.example.com [muestra el error 'Esta conexión no es privada'] FALLA

Me gustaría que mi instalación estuviera en la raíz/pico, por lo que ingresé example.com durante la configuración.

¡Agradecería mucho cualquier consejo!

¿Estás ejecutando un nginx externo en el servidor de Discourse? ¿Por qué?

Discourse ya incluye un nginx preconfigurado que se encargará de ello, siempre que le permitas escuchar en los puertos 80 y 443.

1 me gusta

Hola @Falco, gracias por tu respuesta. Que yo sepa, no. La imagen del proveedor de VPS simplemente se llama “Focal Fossa Clean OS”, lo que supongo significa que no contiene herramientas de terceros.

Esto es directamente de la caja, siguiendo la ruta de instalación de “30 minutos” publicada.

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 me gusta

¡Vaya, eso es un comportamiento bastante extraño!

¿Podrías compartir aquí tu archivo app.yml (elimina los datos sensibles como las contraseñas)? El archivo se encuentra en /var/discourse/containers/app.yml.

También el resultado de docker ps -a.

¡Claro que sí, gracias! ¿Podría causar algún problema que mi dominio tenga una TLD extraña? (es un .community).

## esta es la plantilla del contenedor Docker de Discourse todo en uno y autónomo
##
## Después de realizar cambios en este archivo, DEBES reconstruir
## /var/discourse/launcher rebuild app
##
## ¡TEN *MUCHO* CUIDADO AL EDITAR!
## ¡LOS ARCHIVOS YAML SON EXTREMADAMENTE SENSIBLES A ERRORES EN LOS ESPACIOS EN BLANCO O EN LA ALINEACIÓN!
## visita http://www.yamllint.com/ para validar este archivo según sea necesario

templates:
  - "templates/postgres.template.yml"
  - "templates/redis.template.yml"
  - "templates/web.template.yml"
  - "templates/web.ratelimited.template.yml"
## Descomenta estas dos líneas si deseas agregar Lets Encrypt (https)
  - "templates/web.ssl.template.yml"
  - "templates/web.letsencrypt.ssl.template.yml"

## ¿Qué puertos TCP/IP debe exponer este contenedor?
## Si deseas que Discourse comparta un puerto con otro servidor web como Apache o nginx,
## consulta https://meta.discourse.org/t/17247 para obtener detalles
expose:
  - "80:80"   # http
  - "443:443" # https

params:
  db_default_text_search_config: "pg_catalog.english"

  ## Establece db_shared_buffers en un máximo del 25% de la memoria total.
  ## se establecerá automáticamente durante el arranque según la RAM detectada, o puedes sobrescribirlo
  db_shared_buffers: "768MB"

  ## puede mejorar el rendimiento de ordenamiento, pero aumenta el uso de memoria por conexión
  #db_work_mem: "40MB"

  ## ¿Qué revisión de Git debe usar este contenedor? (por defecto: tests-passed)
  #version: tests-passed

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

  ## ¿Cuántas solicitudes web concurrentes se admiten? Depende de la memoria y los núcleos de CPU.
  ## se establecerá automáticamente durante el arranque según las CPU detectadas, o puedes sobrescribirlo
  UNICORN_WORKERS: 8

  ## TODO: El nombre de dominio al que responderá esta instancia de Discourse
  ## Obligatorio. Discourse no funcionará con una dirección IP desnuda.
  DISCOURSE_HOSTNAME: example.com

  ## Descomenta si deseas que el contenedor se inicie con el mismo
  ## nombre de host (opción -h) que se especificó anteriormente (por defecto "$hostname-$config")
  #DOCKER_USE_HOSTNAME: true

  ## TODO: Lista de correos electrónicos separados por comas que serán administradores y desarrolladores
  ## en el registro inicial, ejemplo 'user1@example.com,user2@example.com'
  DISCOURSE_DEVELOPER_EMAILS: 'email@gmail.com'

  ## TODO: El servidor de correo SMTP utilizado para validar nuevas cuentas y enviar notificaciones
  # La dirección, el nombre de usuario y la contraseña de SMTP son obligatorios
  # ADVERTENCIA: el carácter '#' en la contraseña de SMTP puede causar problemas
  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           # (opcional, por defecto true)
  #DISCOURSE_SMTP_DOMAIN: discourse.example.com    # (requerido por algunos proveedores)

  ## Si agregaste la plantilla de Lets Encrypt, descomenta lo siguiente para obtener un certificado SSL gratuito
  LETSENCRYPT_ACCOUNT_EMAIL: email@gmail.com


  ## La dirección CDN http o https para esta instancia de Discourse (configurada para extraer)
  ## consulta https://meta.discourse.org/t/14857 para obtener detalles
  #DISCOURSE_CDN_URL: https://discourse-cdn.example.com

  ## La clave de dirección IP de geolocalización de Maxmind para la búsqueda de direcciones IP
  ## consulta https://meta.discourse.org/t/-/137387/23 para obtener detalles
  #DISCOURSE_MAXMIND_LICENSE_KEY: 1234567890123456

## El contenedor Docker es sin estado; todos los datos se almacenan en /shared
volumes:
  - volume:
      host: /var/discourse/shared/standalone
      guest: /shared
  - volume:
      host: /var/discourse/shared/standalone/log/var-log
      guest: /var/log

## Los plugins van aquí
## consulta https://meta.discourse.org/t/19157 para obtener detalles
hooks:
  after_code:
    - exec:
        cd: $home/plugins
        cmd:
          - git clone https://github.com/discourse/docker_manager.git

## Cualquier comando personalizado para ejecutar después de la compilación
run:
  - exec: echo "Comienzo de los comandos personalizados"
  ## Si deseas establecer la dirección de correo electrónico 'De' para tu primer registro, descomenta y cambia:
  ## Después de recibir el primer correo de registro, vuelve a comentar la línea. Solo necesita ejecutarse una vez.
  #- exec: rails r "SiteSetting.notification_email='info@unconfigured.discourse.org'"
  - exec: echo "Fin de los comandos personalizados"

y

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

¿Quizás la distribución que te proporcionó tu proveedor viene con nginx preinstalado?

¿Qué imprime curl -I localhost?

HTTP/1.1 301 Movido Permanentemente
Servidor: nginx/1.18.0
Fecha: lun, 25 ene 2021 20:18:00 GMT
Tipo de contenido: text/html
Longitud del contenido: 169
Conexión: keep-alive
Ubicación: https://example.com

¿Esto significa que ya estaba instalado? (lo siento, soy un n00b en esto)

Esa es exactamente la respuesta esperada cuando funciona correctamente. ¿Sigues viendo la página de bienvenida de nginx en http://example.com?

https://example.com funciona perfectamente, pero http://example.com (HTTP) te lleva a la página de ¡Bienvenido a nginx! :sob:

¿Puedes compartir el dominio real?

Bueno, eso no me muestra en absoluto la página de bienvenida de nginx.

¿Podrías probarlo en otro dispositivo, como tu teléfono?

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 me gusta

Bueno, claramente soy un tonto. Lo intenté desde mi teléfono con 4G (para verificar el DNS local) y todas esas URLs funcionaron bien. Me volví a conectar al WiFi y todo funcionó bien. Entonces, limpié la caché de Safari en el escritorio y, ¡zas! — todo funciona allí también.

Debe haber sido de cuando estaba probando inicialmente el servidor y la caché no se ha vaciado desde entonces. Muchas gracias por tu ayuda para solucionar el problema y perdona por ocupar tu tiempo.

2 Me gusta

fwiw, hoy me encontré con el mismo problema en Ubuntu 22.04. Borrar la caché de Safari y actualizar también solucionó el problema.