nginx的记录(5)

背景:同事问我一个问题,nginx怎么代理websocket。

前面几天比较忙,今天总算能抽点时间出来折腾一下。

配置 Nginx 反向代理 WebSocket: https://www.hi-linux.com/posts/42176.html

上面的文章其实比较细了,我来给它精简一下。

本地起一个socket并测试

// app.js
const WebSocket = require('ws');
const wss = new WebSocket.Server({ port: 8010 });
wss.on('connection', (ws) => {
  ws.on('message', (message) => {
    console.log(`Received from client: %s', ${message}`);
    ws.send(`Server received from client: ${message}`);
  });
});
coffeescript

测试socket,可以使用wscat这个npm包。

nginx代理

这里假设对/sockjs-node的path进行URL代理。

server {
    listen       80;
    server_name  localhost;

    #charset koi8-r;

    #access_log  logs/host.access.log  main;

    location / {
        root   html;
        index  index.html index.htm;
    }

    location /sockjs-node {
        proxy_pass http://127.0.0.1:8010;
        proxy_read_timeout 300s;

        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection $connection_upgrade;

    }
}

正如网上说的,和普通的HTTP反向代理不同的点就是多加了:

proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;

仅仅配置这个就OK了么?不!会报错的。。

解决方法是:加一个map,与server平级

http {
    ...
    gzip  on;

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

OK,那我们来测试一下吧!

搞定了~~~

标签:Nginx 发布于:2019-10-18 06:29:43