C'est une histoire lorsque j'ai utilisé Action Cable pour ajouter une fonction de chat en temps réel à une application créée avec Ruby on Rails.
Cela fonctionnait bien dans l'environnement local, mais la partie de chat en temps réel ne fonctionnait pas dans l'environnement de production.
Après avoir enquêté sur la cause, il semble qu'il soit nécessaire de configurer nginx pour qu'il corresponde à la communication appelée websocket utilisée dans ActionCable.
Il s'agit du paramètre nginx d'origine. Ceci est également inclus afin que la différence entre avant et après correction puisse être facilement comprise. Cela a bien fonctionné avant d'implémenter ActionCable.
# https://github.com/puma/puma/blob/master/docs/nginx.md
upstream app {
server unix:///app/tmp/sockets/puma.sock;
}
server {
listen 80;
nom_serveur ***. ***. ***. ***; # adresse IP de l'application
keepalive_timeout 5;
# static files
root /app/public;
location / {
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
# static files
if (-f $request_filename) {
break;
}
if (-f $request_filename.html) {
rewrite (.*) $1/index.html break;
}
if (-f $request_filename.html) {
rewrite (.*) $1.html break;
}
if (!-f $request_filename) {
proxy_pass http://app;
break;
}
}
location ~* \.(ico|css|gif|jpe?g|png|js)(\?[0-9]+)?$ {
expires max;
break;
}
}
Pour pouvoir gérer la communication Websocket Emplacement / câble ajouté et ci-dessous.
https://github.com/puma/puma/blob/master/docs/nginx.md
upstream app {
server unix:///app/tmp/sockets/puma.sock;
}
server {
listen 80;
nom_serveur ***. ***. ***. ***; # adresse IP de l'application
keepalive_timeout 5;
# static files
root /app/public;
location / {
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
# static files
if (-f $request_filename) {
break;
}
if (-f $request_filename.html) {
rewrite (.*) $1/index.html break;
}
if (-f $request_filename.html) {
rewrite (.*) $1.html break;
}
if (!-f $request_filename) {
proxy_pass http://app;
break;
}
}
# Ajoutez ce qui suit
location /cable {
proxy_http_version 1.1;
proxy_set_header Upgrade websocket;
proxy_set_header Connection Upgrade;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_pass http://app/cable;
}
#Pièce supplémentaire jusqu'à ici
location ~* \.(ico|css|gif|jpe?g|png|js)(\?[0-9]+)?$ {
expires max;
break;
}
}