nginx websocket支持
nginx.conf配置
#user nobody;
worker_processes 1;
events {
worker_connections 1024;
}
http {
server_names_hash_bucket_size 128;
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}
server {
listen 80 default_server;
server_name localhost default_server;
root html;
location / {
index index.html index.htm;
}
}
include ../vhost/*.conf;
}
解释:
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}
这段代码使用了 Nginx 的 map
指令,目的是根据 $http_upgrade
头的值,来设置 $connection_upgrade
变量的值。这通常用于处理 WebSocket 连接,因为 WebSocket 升级请求要求 HTTP 升级到更持久的连接协议。
具体来说:
$http_upgrade
是一个 Nginx 内置变量,它表示请求头中的Upgrade
字段的值。Upgrade
是一个 HTTP 请求头,它用于将 HTTP 协议升级到其他协议(例如,WebSocket)。$connection_upgrade
是自定义变量,map
指令的作用是为$connection_upgrade
变量分配不同的值,具体根据$http_upgrade
的值。
工作原理
第 13 行 (
default upgrade;
):这行代码表示,如果$http_upgrade
请求头的值为任意非空字符串,则将$connection_upgrade
的值设置为upgrade
。通常,在处理 WebSocket 请求时,浏览器会发送Upgrade: websocket
头。Nginx 将识别这个头并将$connection_upgrade
变量设置为upgrade
,允许连接升级。第 14 行 (
'' close;
):这行代码表示,如果$http_upgrade
请求头的值为空(即不请求协议升级),那么将$connection_upgrade
变量设置为close
,表示关闭连接。对于普通的 HTTP 请求,不需要保持连接持续升级,因此将其设置为close
。
作用
这段配置主要用于支持 WebSocket 连接的场景。通过它,Nginx 能够识别客户端请求是否是升级请求(例如 WebSocket 请求):
- 如果是升级请求,Nginx 会将连接设置为
upgrade
,允许升级。 - 如果是普通 HTTP 请求,Nginx 会保持连接关闭。
用途场景
这段代码通常出现在需要处理 WebSocket 的应用中,例如实时聊天、在线游戏或其他需要持久连接的场景。WebSocket 需要通过 HTTP 升级协议来切换为双向通信模式,这段配置正是用于处理这种升级逻辑。