ruby on rails - ActionCable ya no trabaja en el entorno de producción
ruby-on-rails ssl (2)
Ahora puedo concluir con seguridad que esto es un error, probablemente en Rails / ActionCable. Esto está corroborado por otros informes y, como dije en un momento dado, funcionó bien, esto fue cuando usé Rails 5.0.0.1
. Cuando actualicé a 5.0.1
se rompió y permanece roto en 5.0.2
. Estoy abriendo un problema en el rastreador de problemas GitHub del proyecto Rails.
Edición de julio de 2017: Rails cambió algo en cuanto a la forma en que lee y escribe en el zócalo de Rack, sin embargo, el software de servidor web real que usa necesita ser compatible con estos métodos de lectura y escritura sin bloqueo. En mi caso, Puma no lo hizo en ese momento, por lo que los websockets no funcionaron. Para Puma ahora hay una nueva versión con una solución para este problema.
Tengo una aplicación Rails 5 que usa Action Cable
para la funcionalidad de websocket.
En mi entorno de desarrollo, todo funciona como se esperaba y los clientes del navegador se conectan con éxito a los canales de Action Cable
.
En mi entorno de producción, Action Cable
estaba funcionando en algún momento, pero luego dejó de funcionar repentinamente sin ninguna causa aparente inmediata.
Si cambio RAILS_ENV
a production
mientras RAILS_ENV
la aplicación en mi máquina de desarrollo, el Action Cable
funciona bien. Algo parece diferente cuando se ejecuta la aplicación en la máquina de producción real, aunque el entorno básico es el mismo.
El error específico que veo en la consola de Chrome:
mydomain.com/:1 WebSocket connection to ''wss://mydomain.com/cable'' failed: WebSocket is closed before the connection is established
. Recibo un error similar en otros navegadores por lo que no parece estar relacionado con el navegador. Deshabilité todos los bloqueadores de anuncios durante las pruebas solo para asegurarme de que no interfieran.
Desarrollo relacionado con la configuración de ENV:
config.action_cable.url = "ws://localhost:#{port}/cable"
Producción.rb ENV configuración relacionada:
hostname = ENV.fetch(''HOSTNAME'')
port = ENV.fetch(''PORT'')
base_url = "#{hostname}:#{port}"
config.action_cable.url = "wss://#{hostname}/cable"
config.action_cable.allowed_request_origins = ["https://#{base_url}", "https://#{hostname}"]
Yo uso Puma
como un servidor web. El servidor web sirve una conexión SSL para la cual se instala un certificado válido. En la máquina de producción, Puma sirve la aplicación en el puerto 3000
pero esto se reenvía al puerto 443
en el enrutador.
La única diferencia notable con la ejecución de la aplicación en mi máquina de desarrollo y producción es que en la producción se usa SSL.
Según su declaración de problema
- El entorno de desarrollo funciona porque lo configuró para manejar el tráfico web inseguro, pero en su entorno de producción está configurado para manejar el tráfico seguro.
Desarrollo relacionado con la configuración de ENV:
config.action_cable.url = "ws://localhost:#{port}/cable"
Producción.rb ENV configuración relacionada:
config.action_cable.url = "wss://#{hostname}/cable"
De acuerdo con la configuración de su red, usted configuró la redirección de puerto SSL al puerto 3000 y la solicitud web desde el servidor PUMA rb.
Ahora, el problema que veo aquí es wss://#{hostname}
intentará escuchar en el puerto predeterminado 443 en busca de tráfico seguro en lugar de su puerto redirigido 3000