Веб-сокеты с обратным проксированием Nginx

#apache #node.js #nginx #fastcgi

#apache #node.js #nginx #fastcgi

Вопрос:

Есть ли способ скомпилировать nginx для обработки запросов на обратное проксирование websockets? Я создаю приложение реального времени в Node.JS и нужен веб-сервер поверх этого. Все, что я прочитал, говорит о том, что Nginx не может отменить запросы прокси websockets, поэтому я немного запутался в том, как мне следует подойти к этой проблеме.

Я думал о том, чтобы просто реализовать всю серверную логику в Node, но есть некоторые проблемы с этим подходом

1) PHP — мне нужен способ обслуживать PHP-файлы 2) Статические файлы — мне действительно нравится, что nginx очень быстр для статических файлов. Однако для этого есть несколько модулей, так что эта проблема не слишком велика. 3) Когда мне нужно обновить мое приложение Node, я хотел бы иметь возможность перезапускать эту часть отдельно от основного сервера. Кроме того, если по какой-либо причине произойдет сбой приложения Node, я не хочу, чтобы весь веб-сервер выходил из строя!

Комментарии:

1. Просто используйте node.js балансировщик нагрузки, за которым стоит узел и сервер nginx.

Ответ №1:

Самым простым решением было бы настроить виртуальные хосты в nginx для нескольких поддоменов и запускать каждую службу на отдельном. Таким образом, вам не нужно беспокоиться об отличии запросов websockets от стандартных http-запросов на том же порту.

Кроме того, вы можете запустить php за nginx, используя PHP-FPM, но это довольно сложная задача для начала работы, и по этой причине Apache может быть лучшим выбором.

Ответ №2:

Я делаю нечто подобное, вот конфигурация сервера nginx (файл: MY_DOMAIN.tk.conf на: /etc/nginx /config.d /), которая работает для меня, с:

  • давайте зашифруем tls-сертификат для ssl
  • обратный прокси php7.2
  • обратный прокси-сервер nodejs для сервера websockets, работающий на порту 8000.

     map $http_upgrade $connection_upgrade {
        default upgrade;
        '' close;
    }
    
    upstream appserver {
        server localhost:8000; # appserver_ip:ws_port
    }
    
    server {
    
        server_name MY_DOMAIN.tk;
    
        root /var/www/html;
        index index.php;
    
        location /ws {
            proxy_pass http://appserver;
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection $connection_upgrade;
        }
    
        location / {
            try_files $uri $uri/ /index.php?$args;
        }
    
        location ~ .php$ {
            include snippets/fastcgi-php.conf;
            fastcgi_pass unix:/run/php/php7.2-fpm.sock;
        }
    
    
        client_max_body_size 128m;
        # add_header Strict-Transport-Security "max-age=15768000" always;
    
        listen 443 ssl; # managed by Certbot
        ssl_certificate /etc/letsencrypt/live/MY_DOMAIN.tk/fullchain.pem; # managed by Certbot
        ssl_certificate_key /etc/letsencrypt/live/MY_DOMAIN.tk/privkey.pem; # managed by Certbot
        include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
        ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
    
    }
    
    server {
        if ($host = MY_DOMAIN.tk) {
            return 301 https://$host$request_uri;
        } # managed by Certbot
    
        server_name MY_DOMAIN.tk;
        listen 80;
        return 404; # managed by Certbot
    
    }
      

сделав это, вы сможете подключиться к wss://MY_DOMAIN.tk/ws