Как добавить поддержку WebSocket в Nginx: методы и примеры кода

Чтобы добавить поддержку WebSocket в Nginx, вы можете использовать несколько методов. Вот несколько примеров кода:

Метод 1: использование модуля ngx_http_proxy_module

  1. Установите Nginx с модулем ngx_http_proxy_module.
  2. Откройте файл конфигурации Nginx, который обычно находится по адресу /etc/nginx/nginx.conf.
  3. Добавьте следующую конфигурацию в блок server:
location /websocket {
    proxy_pass http://backend;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "Upgrade";
}
  1. Замените http://backendсоответствующим адресом внутреннего сервера.
  2. Сохраните файл конфигурации и перезапустите Nginx, чтобы изменения вступили в силу.

Метод 2: использование модуля ngx_http_upstream_module

  1. Установите Nginx с модулем ngx_http_upstream_module.
  2. Откройте файл конфигурации Nginx.
  3. Добавьте блок upstream, чтобы определить внутренний сервер:
http {
    upstream backend {
        server backend_server_ip:backend_server_port;
    }
}
  1. В блоке serverдобавьте следующую конфигурацию:
location /websocket {
    proxy_pass http://backend;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "Upgrade";
}
  1. Замените backend_server_ipи backend_server_portсоответствующими значениями.
  2. Сохраните файл конфигурации и перезапустите Nginx.

Метод 3: использование модуля ngx_http_lua_module

  1. Установите Nginx с модулем ngx_http_lua_module.
  2. Откройте файл конфигурации Nginx.
  3. Добавьте следующую конфигурацию в блок http:
http {
    lua_shared_dict websocket_store 10m;
    server {
        listen 80;
        location /websocket {
            access_by_lua_block {
                local sock, err = ngx.req.socket(true)
                if not sock then
                    ngx.log(ngx.ERR, "failed to get the request socket: ", err)
                    return
                end
                sock:settimeout(1000)  -- Set the timeout value as needed
                local backend = ngx.socket.tcp()
                local ok, err = backend:connect("backend_server_ip", backend_server_port)
                if not ok then
                    ngx.log(ngx.ERR, "failed to connect to the backend server: ", err)
                    return
                end
                local data, typ, err = sock:recv()
                if not data then
                    ngx.log(ngx.ERR, "failed to receive data from the client: ", err)
                    return
                end
                local bytes, err = backend:send(data)
                if not bytes then
                    ngx.log(ngx.ERR, "failed to send data to the backend server: ", err)
                    return
                end
                local data, err = backend:receive()
                if not data then
                    ngx.log(ngx.ERR, "failed to receive data from the backend server: ", err)
                    return
                end
                local bytes, err = sock:send(data)
                if not bytes then
                    ngx.log(ngx.ERR, "failed to send data to the client: ", err)
                    return
                end
                backend:setkeepalive()
                sock:setkeepalive()
            }
        }
    }
}
  1. Замените backend_server_ipи backend_server_portсоответствующими значениями.
  2. Сохраните файл конфигурации и перезапустите Nginx.

Это всего лишь несколько способов добавить поддержку WebSocket в Nginx. У каждого метода есть свои плюсы и минусы, поэтому выберите тот, который лучше всего соответствует вашим требованиям.