nginx:[emerg]unknown「connection_upgrade」variable解決と思考
4603 ワード
に質問
一日にプライマリブランチを更新した後にnginxを起動し、結果エラー:
ネットで調べてみると、nginxプロファイルに問題があることがわかりました.下のmapコードブロックを補充すればいいです.
考える
問題は解決したが、なぜこのような状況が発生したのか、解決方法の本当の原理を知りたい.このブログでは、
Websocketとは
従来のhttp通信モードは、クライアントが要求を開始し、サービス側が要求を受信して応答することである.
Websocketプロトコルはhttpの握手チャネルを多重化しており、具体的には、クライアントがHTTP要求を通じてWebSocketサービス側とアップグレードプロトコルを協議することを指す.
第一歩は、接続を確立し、クライアントはhttpメッセージのフォーマットを使用してプロトコルのアップグレードの要求を開始し、サービス側はプロトコルのアップグレードに応答する.
第2のステップは、データを交換し、クライアントとサービス側がwebsocketプロトコルを使用して双方向通信を行うことができる.
nginx逆プロキシwebsocket
まず、クライアントはプロトコルアップグレードの要求を開始し、nginxはブロック時にプロトコルアップグレード(upgrade)の要求であることを認識する必要があるので、アップグレード(Upgrade head)と接続ヘッダ(Connection head)を明示的に設定する必要があります.以下のようにします.
完了後、nginxはこれをWebSocket接続処理とする.
次に、サーバがアップグレード要求に応答してnginxがエージェントとして処理する場合、以下の構成が必要となる.
このとき、最初に私が修正したところが現れました.上記の内容と結びつけて、mapコードセグメントの役割は主にクライアントリクエストの$http_に基づいていると推測できます.upgradeの値を使用して$connection_を変更します.upgradeの値、すなわち変数$http_に基づいてupgradeの値は、新しい変数$connection_を作成します.upgrade.mapマッピングを行っていないのでconnection_を知りませんupgradeは何なのか、
まとめ
小さな変更でも、背後には膨大な情報が隠されている.
私のレベルは有限で、各位が評論区で不足を指摘することを歓迎して、あなた达のフィードバックは私の進歩の動力です!参照ドキュメント:https://www.nginx.com/blog/we... https://www.cnblogs.com/chyin...
一日にプライマリブランチを更新した後にnginxを起動し、結果エラー:
nginx: [emerg] unknown "connection_upgrade" variable
解決策ネットで調べてみると、nginxプロファイルに問題があることがわかりました.下のmapコードブロックを補充すればいいです.
http {
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}
server {
location / {
#…
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
}
}
}
考える
問題は解決したが、なぜこのような状況が発生したのか、解決方法の本当の原理を知りたい.このブログでは、
nginx websocket
に問題が発生していることがわかります.Websocketとは
従来のhttp通信モードは、クライアントが要求を開始し、サービス側が要求を受信して応答することである.
Websocketプロトコルはhttpの握手チャネルを多重化しており、具体的には、クライアントがHTTP要求を通じてWebSocketサービス側とアップグレードプロトコルを協議することを指す.
第一歩は、接続を確立し、クライアントはhttpメッセージのフォーマットを使用してプロトコルのアップグレードの要求を開始し、サービス側はプロトコルのアップグレードに応答する.
第2のステップは、データを交換し、クライアントとサービス側がwebsocketプロトコルを使用して双方向通信を行うことができる.
nginx逆プロキシwebsocket
まず、クライアントはプロトコルアップグレードの要求を開始し、nginxはブロック時にプロトコルアップグレード(upgrade)の要求であることを認識する必要があるので、アップグレード(Upgrade head)と接続ヘッダ(Connection head)を明示的に設定する必要があります.以下のようにします.
location /sockjs-node/ {
proxy_pass http://127.0.0.1:4200/sockjs-node/;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
}
完了後、nginxはこれをWebSocket接続処理とする.
次に、サーバがアップグレード要求に応答してnginxがエージェントとして処理する場合、以下の構成が必要となる.
http {
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}
server {
...
}
}
このとき、最初に私が修正したところが現れました.上記の内容と結びつけて、mapコードセグメントの役割は主にクライアントリクエストの$http_に基づいていると推測できます.upgradeの値を使用して$connection_を変更します.upgradeの値、すなわち変数$http_に基づいてupgradeの値は、新しい変数$connection_を作成します.upgrade.mapマッピングを行っていないのでconnection_を知りませんupgradeは何なのか、
unknown "connection_upgrade" variable
エラーが発生します.まとめ
小さな変更でも、背後には膨大な情報が隠されている.
ではなく
に止まると、永遠に進歩しません.私のレベルは有限で、各位が評論区で不足を指摘することを歓迎して、あなた达のフィードバックは私の進歩の動力です!参照ドキュメント:https://www.nginx.com/blog/we... https://www.cnblogs.com/chyin...