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 вам необходимо выполнить следующие шаги:

  1. Настройте Redis на порт по умолчанию.
  2. Добавьте эти строки в environment / staging.rb или environment / production.rb, в зависимости от среды вашего приложения.

    config.action_cable.url = [/ ws: // * /, / wss: // * /]

    config.action_cable.allowed_request_origins = [/ http: // * /, / https: // * /]

  3. Наконец, настройте файл 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 начал нормально работать.

Другие вопросы по тегам