Я пытаюсь заставить nginx прокси-соединение через веб-сокет с внутренним сервером.Все сервисы связаны через docker-compose.
Когда я создаю объект WebSocket в моем приложении реакции внешнего интерфейса:
let socket = new WebSocket(`ws://engine/socket`)
Я получаю следующую ошибку:
WebSocket connection to 'ws://engine/socket' failed: Error in connection establishment: net::ERR_NAME_NOT_RESOLVED
Я полагаю, что проблема заключается в преобразовании ws://
в http://
и что моя конфигурация nginx, похоже, неправильно определяет местоположение совпадения.
Вот моя конфигурация nginx:
server {
# listen on port 80
listen 80;
root /usr/share/nginx/html;
index index.html index.htm;
location ^~ /engine {
proxy_pass http://matching-engine:8081/;
proxy_http_version 1.1;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
location / {
try_files $uri $uri/ /index.html;
}
# Media: images, icons, video, audio, HTC
location ~* \.(?:jpg|jpeg|gif|png|ico|cur|gz|svg|svgz|mp4|ogg|ogv|webm|htc)$ {
expires 1M;
access_log off;
add_header Cache-Control "public";
}
# Javascript and CSS files
location ~* \.(?:css|js)$ {
try_files $uri =404;
expires 1y;
access_log off;
add_header Cache-Control "public";
}
# Any route containing a file extension (e.g. /devicesfile.js)
location ~ ^.+\..+$ {
try_files $uri =404;
}
}
Вот часть моей конфигурации docker-compose:
matching-engine:
image: amp-engine
ports:
- "8081:8081"
depends_on:
- mongodb
- rabbitmq
- redis
deploy:
restart_policy:
condition: on-failure
max_attempts: 3
window: 120s
client:
image: amp-client:latest
container_name: "client"
ports:
- "80:80"
depends_on:
- matching-engine
deploy:
restart_policy:
condition: on-failure
max_attempts: 3
window: 120s
docker-compose разрешает 'механизм поиска'автоматически (я могу делать обычные запросы http get / post, которые nginx разрешает правильно, и nslookup правильно находит механизм соответствия, поэтому я считаю, что базовая сеть работает правильно для запросов HTTP, что заставляет меня думать, что проблема связана с расположением совпаденияв конфигурации nginx.
Как можно получить запрос, исходящий из `new WebSocket ('ws: // engine / socket') в директиве location. Я пробовал следующие:
location ^~ engine
location /engine
location /engine/socket
location ws://engine
без какого-либо успеха.
Я также пытался изменить new Websocket('ws://engine/socket')
на new Websocket('/engine/socket')
, но это не удалось (только ws: // или wss: // префиксы принимаются)
Как заставить эту конфигурацию работать?