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!
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 .
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.
Suppose que vous utilisez CentOS:
init.d/nginx
)yum install pcre pcre-devel openssl openssl-devel
et toute autre bibliothèque nécessaire à la construction de NGINXEncore 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
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;
}
}
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
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
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;
}
}
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;
}
}
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;
}
}