Nginx обратное проксирование веб-сокетов - PullRequest
1 голос
/ 20 апреля 2011

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

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

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

Ответы [ 2 ]

1 голос
/ 20 апреля 2011

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

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

0 голосов
/ 22 декабря 2018

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

  • давайте зашифруем tls cert для ssl
  • php7.2 обратный прокси
  • nodejs обратный прокси для сервера веб-сокетов, работающего на порту 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

...