Настройки Nginx для веб-сервисов с SSL (https) - PullRequest
0 голосов
/ 04 января 2019

Nginx новичок здесь! У меня есть следующий фиктивный код:

<button onclick="myFunction()">Click me</button>
<p id="demo_id"></p>

<script>

function myFunction() 
{
    var loc = window.location;
    var wsStart = 'ws://';
    if (loc.protocol == 'https:') 
    {
        wsStart = 'wss://'
    }      

    var port =":8080" <!-- 
    var endpoint = wsStart + loc.host + port+'/personal/my_random_number/';

socket = new WebSocket(endpoint);

socket.onmessage = function(e) 
{
    document.getElementById("demo_id").innerHTML = e.data;
}

socket.onopen = function() 
{
    socket.send("hello world #");
} 

</script>

и настройки nginx, подобные этому (закомментировано ssl):

server {
listen 80;
#listen 443 ssl;
server_name 157.200.0.100;

 #ssl_certificate /etc/letsencrypt/live/mydomain.com-0002/fullchain.pem;
 #ssl_certificate_key /etc/letsencrypt/live/mydomain.com-0002/privkey.pem;


# serve static files
location /static/ {
alias /www/static_3/;
}

# serve media files
location /media/ {
alias /www/media_3/;
}

location / {
proxy_pass http://$server_name:8080;
proxy_set_header X-Forwarded-Host $server_name;
}
}

#server {
#        listen 80;
#        server_name 157.200.0.100;
#        return 301 https://$host$request_uri;
#}

в то время как веб-сервис отлично работает на http (небезопасно), я не мог понять, как разрешить wss работать с ssl (я закомментировал настройки SSL, когда я использую настройку SSL, сайт работает нормально, но не WSS).

Вопрос: как «обновить» мои настройки nginx, где WS может работать с SSL?

1 Ответ

0 голосов
/ 04 января 2019
var port =":8080" <!-- 
var endpoint = wsStart + loc.host + port+'/personal/my_random_number/';

Ваш ws://... использует порт 8080, который, по-видимому, вообще не обрабатывается nginx - по крайней мере, предоставленная вами конфигурация nginx показывает только порт 80 и (закомментировано) 443. Это означает, что, вероятно, есть некоторые (неизвестные) автономные сервер (возможно, nodejs?), который обеспечивает только поддержку простого ws://.

Таким образом, чтобы обеспечить поддержку wss://, необходимо добавить эту поддержку на неизвестный сервер веб-сокетов. И если вы хотите поддерживать ws:// и wss://, они, вероятно, должны быть на разных портах - только немногие серверы позволяют обычному HTTP (или ws://) и HTTPS (или wss://) использовать один и тот же порт.

Другой часто используемый параметр - использовать nginx в качестве обратного прокси-сервера для веб-сокетов. В этом случае используются стандартные порты (т.е. больше не 8080), и nginx направляет запрос на внутренний сервер ws://. Таким образом, wss:// будет автоматически переведен в локальный запрос ws://, и никаких изменений на локальном сервере веб-сокетов не требуется. См. NGINX как прокси-сервер WebSocket для получения более подробной информации об этом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...