Rails5 Action Cable Nginx 404 и 502 ошибки
Каждый:). Я знаю, что люди уже столкнулись с множеством проблем, связанных с моей. Я перепробовал все, но моя проблема не была решена. Я работал с прошлыми 3 днями, чтобы исправить это, но я не могу сделать это.
Я впервые использую ActionCable, и на сервере разработки он работает нормально. Но на производстве, где я использую Puma и Nginx, я сталкиваюсь с ужасными проблемами.
Первоначально, когда у меня не было настроек (местоположение / кабель) в конфигурации nginx, сервер выдает ошибку 404 рукопожатия
т.е. ошибка во время рукопожатия WebSocket: неожиданный код ответа: 404Затем, после добавления следующей конфигурации местоположения / кабеля в конфигурации nginx, я начинаю получать ошибку 502 неверного шлюза.
Примечание: я не открыл ни один порт специально для ActionCable. Я предполагаю, что это не требуется. только порт 80 открыт на моем сервере.
Мне нужен эксперт, чтобы помочь мне с этим. Мне нужна быстрая помощь, чтобы исправить это. Заранее спасибо:)
У меня есть эти две строки в моей среде /production.rb
config.action_cable.url = "ws://my_linode_domain/cable"
config.action_cable.allowed_request_origins = [/http:\/\/*/, /https:\/\/*/]
Это мой конфигурационный файл nginx
upstream app {
# Path to Puma SOCK file, as defined previously
server unix:/home/deploy/artcrate/shared/tmp/sockets/puma.sock fail_timeout=0;
}
server {
listen 80;
#server_name localhost;
server_name my_linode_domain
# prevents 502 bad gateway error
large_client_header_buffers 8 32k;
root /home/deploy/artcrate/current/public;
try_files $uri/index.html $uri @app;
location / {
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $host;
proxy_redirect off;
proxy_http_version 1.1;
proxy_set_header Connection '';
proxy_pass http://app;
}
location ~ ^/(assets|fonts|system)/|favicon.ico|robots.txt {
gzip_static on;
expires max;
add_header Cache-Control public;
}
location /cable{
proxy_pass http://app;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
}
error_page 500 502 503 504 /500.html;
client_max_body_size 4G;
keepalive_timeout 10;
}
Я пробовал различные параметры proxy_pass в настройках местоположения / кабеля, но ни один не работал.
2 ответа
RAILS и RUBY версия, которую я использую для этого проекта
Rails 5.0.7
рубин 2.3.1p112
Хорошо. Поэтому сегодня я хотел снова интегрировать Action Cable в свой проект, но снова столкнулся с той же проблемой. Я применил свое решение выше, но оно не сработало. В прошлый раз, хотя это работало, но я не был удовлетворен решением, думая, что почему ActionCable будет работать в одном потоке / работнике на локальной машине.
Но на этот раз я сосредоточился и выяснил виновника.
Culprit - это конфигурация NGINX
Конфигурация, когда я столкнулся с ошибками 404 рукопожатия
location /cable {
proxy_pass http://example.com;
proxy_http_version 1.1;
proxy_set_header Upgrade websocket;
proxy_set_header Connection Upgrade;
}
Конфигурация когда все начало работать нормально.
location /cable {
proxy_pass http://puma;
proxy_http_version 1.1;
proxy_set_header Upgrade websocket;
proxy_set_header Connection Upgrade;
}
Таким образом, виновная линия была:
proxy_pass http://example.com;
Здесь мы указываем на NGINX, что неверно, он должен указывать на путь к нашему серверу puma, который в моей конфигурации представлен как 'puma'.
Вот краткое изложение моей реализации ActionCable и его рабочей копии на производственном сервере.
Поэтому для интеграции Action Cable с Rails 5 вам необходимо выполнить следующие шаги:
- Настройте Redis на порт по умолчанию.
Добавьте эти строки в environment / staging.rb или environment / production.rb, в зависимости от среды вашего приложения.
config.action_cable.url = [/ ws: // * /, / wss: // * /]
config.action_cable.allowed_request_origins = [/ http: // * /, / https: // * /]
Наконец, настройте файл NGINX, как описано выше. Вот моя полная конфигурация NGINX в gist nginx.conf. Я заменил имя своего сайта на example.com, а имя проекта на example. Поэтому, если вы что-то копируете, просто замените их на свои, иначе ничего не будет работать, поскольку пути будут нарушены.
Я надеюсь, что это действительно избавит от боли, когда приложение ActionCable будет запущено в реальном времени, и разрешит эту ошибку рукопожатия для всех, поскольку это очень сложная и техническая вещь, и во многих документах просто упоминается, что нужно указать кабель действия на URL основного сайта, а не на сервер puma. работает за вашим nginx.
Благодарю.
Каждый.:)
После недели борьбы, усердной работы и постоянной игры с файлами конфигурации nginx и puma и увлекательного чтения блогов снова и снова я смог разобраться в проблеме.
Мои настройки nginx были правильными. Мне пришлось добавить еще две строки в конфигурацию puma.rb, которые не входят в конфигурации по умолчанию. Эти две строки:
workers 2
daemonize true
daemonize true: это заставляет puma запускаться в фоновом режиме, вызывая подпроцесс и отсоединяя его от исполняющей оболочки. Если вы не используете daemonize, вам нужно запустить процесс puma через nohup и явно поместить его в фоновый режим.
Я не уверен, что мне нужны рабочие 2, но я добавил их при решении моей проблемы. Так что я позволил это там. Но после добавления двух строк выше мой ActionCable начал нормально работать.