Рейтинг:0

Ошибка веб-сокета прокси-сервера Nginx 404

флаг cn

я работаю с двумя Nginx один за другим.

Наша инфраструктура такая инфраструктура

Проблема

У меня проблемы с соединениями через веб-сокет, когда я отправляю запрос на прокси-сервер Nginx, всегда возвращаю 404, но когда я отправляю запрос на последний NGINX, он работает нормально.

Логи в ОКОНЧАТЕЛЬНОМ NGINX
# когда запрос не проходит через NGINX PROXY PASS
# это хорошо
<SOME-CLIENT-IP> - - [30/Sep/2021:13:46:02 +0000] "GET /cable HTTP/1.1" 101 22120 "-" "Mozilla/5.0 (Linux; Android 9; SM-A105M ) AppleWebKit/537.36 (KHTML, как Gecko) Chrome/94.0.4606.61 Mobile Safari/537.36"

# когда запрос проходит через NGINX PROXY PASS
# это не правильно
<IP-NGINX-PROXY-PASS> - - [30/Sep/2021:13:46:09 +0000] "GET /cable HTTP/1.0" 301 14 "-" "Mozilla/5.0 (Linux; Android 11; SM -A505G) AppleWebKit/537.36 (KHTML, как Gecko) Chrome/89.0.4389.105 Mobile Safari/537.36"

Это происходит только с конечной точкой /кабелем соединений Websockets.

Конфигурация прокси-сервера NGINX

сервер {
  имя_сервера домен.com;

  место расположения / {
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Хост $host;
    proxy_set_header X-Forwarded-Ssl включен; # По желанию
    proxy_set_header X-Forwarded-Port $server_port;
    proxy_set_header X-Forwarded-Host $host;
    прокси_перенаправление выключено;
    proxy_pass https://<IP-FINAL-NGINX>;
  }

  местоположение / кабель {
    proxy_pass http://<IP-FINAL-NGINX>;
    прокси_http_версия 1.1;
    proxy_set_header Обновить $http_upgrade;
    proxy_set_header Соединение "обновление";
    proxy_set_header Хост $host;
    
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Хост $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-Proto https;
    прокси_перенаправление выключено;
   }

  слушать [::]:443 ssl http2 ipv6only=on;
  слушать 443 ssl http2; # под управлением Certbot
  ssl_certificate /etc/letsencrypt/live/domain.com/fullchain.pem; # под управлением Certbot
  ssl_certificate_key /etc/letsencrypt/live/domain.com/privkey.pem; # под управлением Certbot
  
  если ($ хост ! = "домен.com") {
    вернуть 404;
  }
}

сервер {
  имя_сервера www.domain.com;
  
  слушать 443 ssl http2; # под управлением Certbot
    ssl_certificate /etc/letsencrypt/live/domain.com/fullchain.pem; # под управлением Certbot
    ssl_certificate_key /etc/letsencrypt/live/domain.com/privkey.pem; # под управлением Certbot
  
  вернуть 301 example.com$request_uri;
}

сервер {
  имя_сервера домен.com;
  слушать 80;

  вернуть 301 https://<IP-FINAL-NGINX>$request_uri;
}

сервер {
  имя_сервера домен.com;

  место расположения / {
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Хост $host;
    proxy_set_header X-Forwarded-Ssl включен; # По желанию
    proxy_set_header X-Forwarded-Port $server_port;
    proxy_set_header X-Forwarded-Host $host;
    прокси_перенаправление выключено;
    proxy_pass https://<IP-FINAL-NGINX>;
  }

  местоположение / кабель {
    proxy_pass http://<IP-FINAL-NGINX>;
    прокси_http_версия 1.1;
    proxy_set_header Обновить $http_upgrade;
    proxy_set_header Соединение "обновление";
    proxy_set_header Хост $host;
    
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Хост $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-Proto https;
    прокси_перенаправление выключено;
   }

  слушать [::]:31117 ssl http2 ipv6only=on;
  слушать 31117 ssl http2; # под управлением Certbot
  ssl_certificate /etc/letsencrypt/live/domain.com/fullchain.pem; # под управлением Certbot
  ssl_certificate_key /etc/letsencrypt/live/domain.com/privkey.pem; # под управлением Certbot
  
  если ($ хост ! = "домен.com") {
    вернуть 404;
  }
}

сервер {
  имя_сервера www.domain.com;
  
  слушать 31117 ssl http2; # под управлением Certbot
    ssl_certificate /etc/letsencrypt/live/domain.com/fullchain.pem; # под управлением Certbot
    ssl_certificate_key /etc/letsencrypt/live/domain.com/privkey.pem; # под управлением Certbot
  
  вернуть 301 example.com$request_uri;
}


сервер {
  имя_сервера домен.com;
  слушать 30723;

  вернуть 301 https://<IP-FINAL-NGINX>$request_uri;
}

Окончательный NGINX — это соединяется с окончательным приложением

вверх по течению myapp {
  сервер unix:/var/www/myapp/current/tmp/sockets/puma.sock fail_timeout=30s;
}

сервер {
  имя_сервера домен.com;

  место расположения / {
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Хост $http_host;
    proxy_set_header X-Forwarded-Ssl включен; # По желанию
    proxy_set_header X-Forwarded-Port $server_port;
    proxy_set_header X-Forwarded-Host $host;
    прокси_перенаправление выключено;
    прокси_пасс http://myapp;
  }

   местоположение / кабель {
    # эта конечная точка '/cable' обрабатывает подключения через веб-сокет
    прокси_пасс http://myapp;
    прокси_http_версия 1.1;
    proxy_set_header Обновить $http_upgrade;
    proxy_set_header Соединение "обновление";
    proxy_set_header Хост $http_host;
    
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Хост $http_host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-Proto https;
    прокси_перенаправление выключено;
   }
 
  расположение ~ ^/(активы|img|статические|фавикон)/ {
    корень /var/www/nulinga/current/public;

    gzip_static включен;
    истекает макс.;
    add_header Cache-Control общедоступный;
  }
  
  слушать [::]:443 ssl http2 ipv6only=on;
  слушать 443 ssl http2; # под управлением Certbot
    ssl_certificate /etc/letsencrypt/live/domain.com/fullchain.pem; # под управлением Certbot
    ssl_certificate_key /etc/letsencrypt/live/domain.com/privkey.pem; # под управлением Certbot
  включить /etc/letsencrypt/options-ssl-nginx.conf; # под управлением Certbot
  ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # под управлением Certbot

  если ($ хост ! = "домен.com") {
    вернуть 404;
  }
  
  error_page 502 503 504 =503/503.html;
  страница_ошибки 404 =404/404.html;
  
  местоположение = /503.html {
    корень /var/www/myapp/current/public;
    позволять все;
    внутренний;
  }

  местоположение = /404.html {
    корень /var/www/myapp/current/public;
    позволять все;
    внутренний;
  }


}

сервер {
  имя_сервера www.domain.com;
  
  слушать 443 ssl http2; # под управлением Certbot
    ssl_certificate /etc/letsencrypt/live/domain.com/fullchain.pem; # под управлением Certbot
    ssl_certificate_key /etc/letsencrypt/live/domain.com/privkey.pem; # под управлением Certbot
  включить /etc/letsencrypt/options-ssl-nginx.conf; # под управлением Certbot
  ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # под управлением Certbot

  вернуть 301 example.com$request_uri;


}

сервер {
  имя_сервера домен.com www.домен.com;
  слушать 80;

  вернуть 301 example.com$request_uri;
}

флаг ro
Вы нашли точную первопричину?

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.