it-swarm.com.de

NGINX zum Umkehren von Proxy-Websockets UND Aktivieren von SSL (wss: //)?

Ich bin so verrückt, NGINX selbst zu bauen, aber ich möchte sichere Websockets aktivieren können, ohne eine zusätzliche Schicht zu haben.

Ich möchte SSL nicht auf dem Websocket-Server selbst aktivieren, stattdessen möchte ich NGINX verwenden, um der gesamten Sache eine SSL-Schicht hinzuzufügen. 

Jede Webseite da draußen sagt, ich kann es nicht, aber ich weiß, dass ich es kann! Danke, wer (mir) kann mir zeigen wie!

99
crockpotveggies

Zu beachten ist, dass nginx ab Version 1.3.13 nun auch Websockets unterstützt. Anwendungsbeispiel:

location /websocket/ {

    proxy_pass ​http://backend_Host;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_read_timeout 86400;

}

Sie können auch die nginx-Änderungsprotokollierung und die WebSocket-Proxying -Dokumentation überprüfen.

136
Tarantula

Haben Sie keine Angst, denn eine mutige Gruppe von Ops-Programmierern hat die Situation mit einer neuen Marke gelöst. nginx_tcp_proxy_module

Geschrieben im August 2012, wenn Sie also aus der Zukunft kommen, sollten Sie Ihre Hausaufgaben machen.

Voraussetzungen

Angenommen, Sie verwenden CentOS:

  • Entfernen Sie die aktuelle Instanz von NGINX (schlagen Sie hierfür den dev-Server vor).
  • Speichern Sie nach Möglichkeit Ihre alten NGINX-Konfigurationsdateien, damit Sie sie wiederverwenden können (dazu gehört auch Ihr init.d/nginx-Skript).
  • yum install pcre pcre-devel openssl openssl-devel und alle anderen erforderlichen Bibliotheken zum Erstellen von NGINX
  • Holen Sie sich das nginx_tcp_proxy_module von GitHub hier https://github.com/yaoweibin/nginx_tcp_proxy_module und merken Sie sich den Ordner, in dem Sie ihn abgelegt haben (stellen Sie sicher, dass er nicht gepackt ist).

Bauen Sie Ihr neues NGINX auf

Geht wiederum von CentOS aus:

  • cd /usr/local/
  • wget 'http://nginx.org/download/nginx-1.2.1.tar.gz'
  • tar -xzvf nginx-1.2.1.tar.gz
  • cd nginx-1.2.1/
  • patch -p1 < /path/to/nginx_tcp_proxy_module/tcp.patch
  • ./configure --add-module=/path/to/nginx_tcp_proxy_module --with-http_ssl_module (Sie können bei Bedarf weitere Module hinzufügen)
  • make
  • make install

Wahlweise:

  • Sudo /sbin/chkconfig nginx on

Nginx einrichten

Denken Sie daran, Ihre alten Konfigurationsdateien zuerst zu kopieren, wenn Sie sie wiederverwenden möchten.

Wichtig: Sie müssen eine tcp {}-Direktive auf der höchsten Ebene in Ihrer Konfiguration erstellen. Stellen Sie sicher, dass es sich nicht in Ihrer http {}-Direktive befindet.

Die folgende Beispielkonfiguration zeigt einen einzelnen Upstream-Websocket-Server und zwei Proxies für sowohl SSL als auch Nicht-SSL.

tcp {
    upstream websockets {
        ## webbit websocket server in background
        server 127.0.0.1:5501;

        ## server 127.0.0.1:5502; ## add another server if you like!

        check interval=3000 rise=2 fall=5 timeout=1000;
    }   

    server {
        server_name _;
        listen 7070;

        timeout 43200000;
        websocket_connect_timeout 43200000;
        proxy_connect_timeout 43200000;

        so_keepalive on;
        tcp_nodelay on;

        websocket_pass websockets;
        websocket_buffer 1k;
    }

    server {
        server_name _;
        listen 7080;

        ssl on;
        ssl_certificate      /path/to/cert.pem;
        ssl_certificate_key  /path/to/key.key;

        timeout 43200000;
        websocket_connect_timeout 43200000;
        proxy_connect_timeout 43200000;

        so_keepalive on;
        tcp_nodelay on;

        websocket_pass websockets;
        websocket_buffer 1k;
    }
}
52
crockpotveggies

Das hat für mich funktioniert:

location / {
    # redirect all HTTP traffic to localhost:8080
    proxy_pass http://localhost:8080;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header Host $Host;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

    # WebSocket support
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
}

- geliehen bei: https://github.com/nicokaiser/nginx-websocket-proxy/blob/df67cd92f71bfcb513b343beaa89cb33ab09fb05/simple-wss.conf

27
Harlan T Wood

für .net Core 2.0 Nginx mit SSL

location / {
    # redirect all HTTP traffic to localhost:8080
    proxy_pass http://localhost:8080;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header Host $Host;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

    # WebSocket support
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection $http_connection;
}

Das hat bei mir funktioniert

14
Altair CA

Für mich kam es auf die proxy_pass-Standorteinstellung an. In http://nodeserver muss https://nodeserver geändert werden, und auf der Seite des Knotenservers muss ein gültiges SSL-Zertifikat eingerichtet sein. Wenn ich also einen externen Knotenserver einführe, muss ich nur die IP ändern und alles andere bleibt dieselbe Konfiguration.

Ich hoffe, das hilft jemandem auf dem Weg ... Ich habe die ganze Zeit das Problem angestarrt ... Seufz ...

map $http_upgrade $connection_upgrade {
    default upgrade;
    ''      close;
}
upstream nodeserver {
        server 127.0.0.1:8080;
}
server {
        listen 443 default_server ssl http2;
        listen [::]:443 default_server ssl http2 ipv6only=on;
        server_name mysite.com;
        ssl_certificate ssl/site.crt;
        ssl_certificate_key ssl/site.key;
        location /horizon {
                proxy_pass https://nodeserver;
                proxy_set_header Upgrade $http_upgrade;
                proxy_set_header Connection $connection_upgrade;
                proxy_http_version 1.1;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header Host $http_Host;
                proxy_intercept_errors on;
                proxy_redirect off;
                proxy_cache_bypass $http_upgrade;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-NginX-Proxy true;
                proxy_ssl_session_reuse off;
            }
}
7
magoomby

Ein guter, prägnanter Artikel von Pankaj Malhotra diskutiert, wie man dies mit NGINX macht, und ist hier verfügbar.

Die grundlegende NGINX-Konfiguration wird unten wiedergegeben:

map $http_upgrade $connection_upgrade {
    default upgrade;
    '' close;
}

upstream appserver {
    server 192.168.100.10:9222; # appserver_ip:ws_port
}

server {
    listen 8888; // client_wss_port

    ssl on;
    ssl_certificate /path/to/crt;
    ssl_certificate_key /path/to/key;


    location / {
        proxy_pass http://appserver;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection $connection_upgrade;
    }
}
4
btiernay

Verwendung von Nginx/1.14.0 

ich habe einen Websocket-Server, der auf Port 8097 ausgeführt wird, und die Benutzer stellen eine Verbindung von und WSS auf Port 8098 her. Nginx entschlüsselt den Inhalt und leitet ihn an den Websocket-Server weiter

Ich habe also diese Konfigurationsdatei (in meinem Fall /etc/nginx/conf.d/default.conf)

server {
    listen   8098;
        ssl on;
        ssl_certificate      /etc/ssl/certs/combined.pem;
        ssl_certificate_key  /root/domain.key;
    location / {

        proxy_pass http://hostname:8097;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_read_timeout 86400;

    }
}
0
john Smith