web-dev-qa-db-fra.com

NGINX pour inverser les serveurs Web proxy et activer SSL (wss: //)?

Je suis tellement perdu et nouveau d’avoir construit NGINX tout seul, mais je veux pouvoir activer des websockets sécurisés sans avoir de couche supplémentaire.

Je ne veux pas activer SSL sur le serveur Websocket lui-même, mais plutôt utiliser NGINX pour ajouter une couche SSL à l'ensemble. 

Chaque page Web dit que je ne peux pas le faire, mais je sais que je peux le faire! Merci à quiconque (moi-même) peut me montrer comment!

99
crockpotveggies

Il suffit de noter que nginx prend désormais en charge Websockets dans la version 1.3.13. Exemple d'utilisation:

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;

}

Vous pouvez également consulter les documents nginx changelog et WebSocket faisant un proxy .

136
Tarantula

N'ayez crainte, car un groupe courageux de programmeurs ont résolu la situation avec une toute nouvelle _ nginx_tcp_proxy_module

Écrit en août 2012, si vous êtes du futur, vous devriez faire vos devoirs.

Conditions préalables

Suppose que vous utilisez CentOS:

  • Supprimez l'instance actuelle de NGINX (suggérez d'utiliser dev server pour cela)
  • Si possible, sauvegardez vos anciens fichiers de configuration NGINX afin de pouvoir les réutiliser (avec votre script init.d/nginx)
  • yum install pcre pcre-devel openssl openssl-devel et toute autre bibliothèque nécessaire à la construction de NGINX
  • Obtenez le nginx_tcp_proxy_module auprès de GitHub ici https://github.com/yaoweibin/nginx_tcp_proxy_module et mémorisez le dossier dans lequel vous l'avez placé (assurez-vous qu'il n'est pas compressé)

Construisez votre nouveau NGINX

Encore une fois, suppose CentOS:

  • 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 (vous pouvez ajouter plus de modules si vous en avez besoin)
  • make
  • make install

Optionnel:

  • Sudo /sbin/chkconfig nginx on

Configurer Nginx

N'oubliez pas de copier d'abord vos anciens fichiers de configuration si vous souhaitez les réutiliser.

Important: vous devrez créer une directive tcp {} au plus haut niveau de votre conf. Assurez-vous qu'il ne se trouve pas dans votre directive http {}.

L'exemple de configuration ci-dessous montre un seul serveur Websocket en amont et deux mandataires pour SSL et non-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

Cela a fonctionné pour moi:

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";
}

- emprunté à: https://github.com/nicokaiser/nginx-websocket-proxy/blob/df67cd92f71bfcb513b343beaa89cb33ab09fb05/simple-wss.conf

27
Harlan T Wood

pour .net core 2.0 Nginx avec 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;
}

Cela a fonctionné pour moi

14
Altair CA

Pour moi, il s’agissait du paramètre d’emplacement proxy_pass. In nécessaire pour changer le http://nodeserver en https://nodeserver et disposer d'un certificat SSL valide installé du côté serveur de nœud. Ainsi, lorsque je présente un serveur de noeud externe, il ne me reste plus qu'à changer l'adresse IP et tout le reste reste la même configuration.

J'espère que cela aidera quelqu'un en cours de route ... Je regardais le problème tout le temps ... soupir ...

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

Un bon article concis de Pankaj Malhotra explique comment faire cela avec NGINX et est disponible ici .

La configuration de base de NGINX est reproduite ci-dessous:

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

Utilisation de nginx/1.14.0 

j'ai un serveur WebSocket fonctionnant sur le port 8097 et les utilisateurs se connectent de WSS sur le port 8098, Nginx décrypte simplement le contenu et le transmet au serveur Websocket.

J'ai donc ce fichier de configuration (dans mon cas, /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