Maison  >  Article  >  Opération et maintenance  >  Comment configurer le proxy inverse nginx webSocket

Comment configurer le proxy inverse nginx webSocket

王林
王林avant
2023-05-21 12:13:061287parcourir

Étant donné que le protocole websocket est mis à niveau sur la base du protocole http (voir l'image ci-dessous), vous pouvez utiliser le websocket de proxy inverse nginx.

Comment configurer le proxy inverse nginx webSocket

websocket

Comme vous pouvez le voir sur cette image, la connexion websocket est établie en fonction de le protocole http sur la base de.

get /chat http/1.1
host: server.example.com
upgrade: websocket
connection: upgrade
sec-websocket-key: x3jjhmbdl1ezlkh9gbhxdw==
sec-websocket-protocol: chat, superchat
sec-websocket-version: 13
origin: http://example.com

Les enfants qui connaissent http ont peut-être remarqué qu'il y a juste quelques éléments supplémentaires dans cette demande de poignée de main, similaires au protocole http.

upgrade: websocket
connection: upgrade
这个就是websocket的核心了,告诉apache、nginx等服务器:我发起的是websocket协议。
sec-websocket-key: x3jjhmbdl1ezlkh9gbhxdw==
sec-websocket-protocol: chat, superchat
sec-websocket-version: 13

Tout d'abord, sec-websocket-key est une valeur d'encodage base64, générée aléatoirement par le navigateur. Elle indique au serveur : Peat, ne me trompez pas, je veux vérifier si vous êtes vraiment un assistant Websocket. .

Enfin, sec-websocket-version indique au serveur le brouillon du websocket (version du protocole) utilisé. Au début, le protocole websocket était encore au stade du brouillon, et il y avait toutes sortes de protocoles étranges, et il y en avait beaucoup. C'est étrange qu'il y ait des choses différentes. Firefox et Chrome utilisent des versions différentes. Au début, il y avait trop de protocoles Websocket, ce qui était un gros problème. . Mais c'est bon maintenant, c'est réglé. C'est une chose que tout le monde utilise

Ensuite, le serveur renverra la chose suivante, indiquant que la demande a été acceptée et que le websocket a été établi avec succès !

http/1.1 101 switching protocols
upgrade: websocket
connection: upgrade
sec-websocket-accept: hsmrc0smlyukagmm5oppg2hagwk=
sec-websocket-protocol: chat

C'est le dernier domaine dont http est responsable. Il indique au client que j'ai changé de protocole avec succès ~

upgrade: websocket
connection: upgrade

Il est toujours corrigé et indique au client que la mise à niveau à venir est le protocole websocket. À ce stade, http a terminé tout son travail et la prochaine étape consiste à procéder entièrement conformément au protocole websocket.

Une fois que vous avez compris le principe du protocole, vous pouvez passer à l'étape suivante

Tout d'abord, nginx configure d'abord le certificat https

Le certificat du serveur a été configuré par le patron, je l'ai donc utilisé directement. Vérifiez-le vous-même si nécessaire. 0.0

Ajoutez la configuration suivante dans le nœud service du fichier de configuration nginxservice 节点中添加如下配置

location /wss
    {
         proxy_pass http://127.0.0.1:8888;
         proxy_http_version 1.1;
         proxy_set_header upgrade $http_upgrade;
         proxy_set_header connection "upgrade";
        proxy_set_header x-real-ip $remote_addr;
     }

解释一下参数

/wss 这个是随便起的,告诉nginx要代理的url,现在我的设置为 wss ,当我访问的我的服务器 https://abc.com/wss 时,nginx会把我的请求映射到本机的8888端口。

proxy_pass 要代理到的url,我的代理到本机的8888端口。

proxy_http_version 代理时使用的 http版本。

重点来了:

代理websocket的关键参数

proxy_set_header upgrade 把代理时http请求头的 upgrade 设置为原来http请求的请求头,wss协议的请求头为 websocket
proxy_set_header connection 因为代理的wss协议,所以http请求头的 connection 设置为 upgrade

proxy_set_header x-real-ip 给代理设置原http请求的ip,填写 $remote_addr 即可

至于websocket协议的response的参数,在反向代理的时候不用管。

到这里,nginx反向代理websocket的配置就完成了,重启nginx,用websocket连接试试,在原来wss地址的地方填写 wss://abc.com/wss

location ~ .php$ {
   root html;
   fastcgi_pass 127.0.0.1:9000;
   fastcgi_index index.php;
   fastcgi_param script_filename $document_root$fastcgi_script_name;
   include fastcgi_params;
}

Expliquez les paramètres

/wss Ceci est juste au hasard Oui, indiquez à nginx l'URL à utiliser par proxy. Maintenant, mon paramètre est wss Lorsque j'accède à mon serveur https://abc.com/wss, nginx mappera. ma demande de port 8888 de cette machine.

proxy_pass L'URL vers laquelle vous souhaitez effectuer un proxy, mon proxy est vers le port 8888 de cette machine.

proxy_http_version La version http utilisée lors du proxy.

Voici le point clé :

Paramètres clés du proxy websocket

proxy_set_header Upgrade Définissez la upgrade de l'en-tête de requête http pendant le proxy sur l'en-tête de requête de la requête http d'origine. L'en-tête de requête du protocole wss est websocket
proxy_set_header connection En raison du protocole proxy wss, l'en-tête de requête http connection est défini sur <code>upgrade
🎜🎜proxy_set_header x-real-ip Définissez l'adresse IP de la requête http d'origine sur le proxy et remplissez $remote_addr🎜🎜Comme pour websocket Les paramètres de réponse du protocole n'ont pas besoin d'être contrôlés lors du proxy inverse. 🎜🎜À ce stade, la configuration du websocket du proxy inverse nginx est terminée. Redémarrez nginx, essayez de vous connecter avec websocket et remplissez wss://abc.com/wss à la place du wss d'origine. adresse. Si le websocket est connecté avec succès, cela signifie que le websocket du proxy inverse nginx a réussi. 🎜🎜🎜Résumé🎜🎜🎜La configuration actuelle concerne uniquement la configuration lors du proxy inverse sur la machine locale. Si vous souhaitez effectuer un proxy inverse vers d'autres hôtes, il peut y avoir des problèmes entre domaines lors du proxy. Proxy inverse nginx. 🎜🎜🎜Réflexion🎜🎜🎜Vous pouvez voir ce paragraphe dans le fichier de configuration nginx🎜
location /tomcat
    {
         proxy_pass http://127.0.0.1:8080;
         proxy_http_version 1.1;
        proxy_set_header x-real-ip $remote_addr;
     }
🎜Il s'agit du fichier de configuration php dans nginx, je pense qu'il semble si familier. Cette liste de configuration est tellement similaire au proxy inverse websocket en ce moment. . J'ai découvert en recherchant sur Internet que lorsque nginx gère les requêtes de type PHP, il envoie la requête au processus de gestion fastcgi. Le processus de gestion fascgi sélectionne le résultat du traitement du sous-processus cgi et le renvoie à nginx, et php-fpm est un PHP. Le gestionnaire fastcgi. nginx lui-même ne peut pas gérer PHP. Lorsqu'une requête est reçue, s'il s'agit d'une requête PHP, elle est envoyée à l'interpréteur PHP pour traitement et le résultat est renvoyé au client. Par conséquent, lorsque nginx gère les requêtes de type PHP, il est essentiellement implémenté via la fonction de proxy inverse. 🎜🎜Nous pouvons élargir notre réflexion et utiliser le proxy inverse nginx pour réaliser plus de fonctions, telles que le proxy de Tomcat🎜rrreee

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer