如何配置Nginx的Websocket?

  

要配置 Nginx 使用 WebSocket,需要完成以下几个步骤:

  1. 安装 Nginx

首先需要在服务器上安装 Nginx。可以通过包管理器获取或者下载源代码进行编译安装。

  1. 配置 Nginx

在 Nginx 配置文件中,在 http 块下添加以下内容:

map $http_upgrade $connection_upgrade {
    default upgrade;
    ''      close;
}

upstream websocket {
    server 127.0.0.1:8000;
}

server {
    listen 80;
    server_name example.com;

    location / {
        try_files $uri @proxy;
    }

    location @proxy {
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection $connection_upgrade;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $host;
        proxy_pass http://websocket;
    }
}

以上配置中:

  • map 块将请求头中的 Upgrade 字段映射为 Connection 字段,用于告诉 Nginx 是否需要升级连接协议。
  • upstream 块定义后端服务器地址,并命名为 websocket
  • server 块监听特定 IP 和端口,并将所有请求转发到 location / 中。
  • location / 块的 try_files 指令将所有静态文件请求转发到 @proxy 中,由 @proxy 代理实现。
  • location @proxy 块开启协议升级并启用 WebSockets 协议,将所有请求代理到后端服务器。

  • 配置后端服务器

在后端服务器上启动 WebSocket 服务,并监听 127.0.0.1:8000

示例1:

前端代码:

var socket = new WebSocket('ws://example.com/ws');

socket.addEventListener('open', function (event) {
    console.log('WebSocket connected');
});

socket.addEventListener('message', function (event) {
    console.log('Received message:', event.data);
});

socket.addEventListener('close', function (event) {
    console.log('WebSocket closed:', event.code, event.reason);
});

socket.addEventListener('error', function (error) {
    console.error('WebSocket error:', error);
});

示例2:

后端代码:

import asyncio
import websockets

async def counter(websocket, path):
    i = 0
    while True:
        await asyncio.sleep(1)
        i += 1
        await websocket.send(str(i))

async def main():
    async with websockets.serve(counter, "127.0.0.1", 8000):
        await asyncio.Future()  # run forever

asyncio.run(main())

以上示例代码中,前端代码通过 WebSocket 协议连接到 Nginx 提供的 WebSocket 服务,后端代码通过 websockets 库提供一个简单的 WebSocket 计数器服务。

  1. 重启 Nginx

使用以下命令重新加载 Nginx 配置文件:

sudo nginx -t && sudo service nginx reload

这样就成功配置了 Nginx 的 WebSocket 服务。

相关文章