nginx反向代理wss - 客户端在读取客户端请求行

时间:2016-04-09 19:47:54

标签: nginx websocket mqtt google-kubernetes-engine mosquitto

有这个荒谬的问题设置nginx反向代理websocket(一个Mosquitto MQTT服务)。 以下配置适用于 ws:// ,但 wss://

失败
events {
    worker_connections 768;
}

http {
    sendfile on;
    tcp_nopush on;
    tcp_nodelay on;
    keepalive_timeout 65;
    types_hash_max_size 2048;

    include /etc/nginx/mime.types;
    default_type application/octet-stream;

    access_log /var/log/nginx/access.log;
    error_log /var/log/nginx/error.log info;

    gzip on;
    gzip_vary on;
    gzip_proxied any;
    gzip_comp_level 6;
    gzip_buffers 16 8k;
    gzip_http_version 1.1;
    gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;

    server {
        listen 80;
        listen 443 ssl;

        # nginx is smart enough to ignore these when serving HTTP instead of HTTPS
        ssl_certificate /etc/nginx/cert;
        ssl_certificate_key /etc/nginx/key;

        location /ws {
            # access_log off;

            rewrite ^/ws$ / break;
            rewrite ^/ws(.*)$ $1 break;

            proxy_pass http://mqtt:9001;
            proxy_redirect default;
            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_set_header X-Forwarded-Proto https;

            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection "Upgrade";
            proxy_read_timeout 86400;
        }

    }

    client_max_body_size 1M;
    client_body_buffer_size 1M;
}

以下是我在nginx日志中看到的内容:

  

10.142.0.4 - - [09 / Apr / 2016:19:15:16 +0000]“\ x16 \ x03 \ x01 \ x012 \ x01 \ x00 \ x01。\ x03 \ x03- \ xFD \ xD4C \ x828 \ xDFai \ XB1 \的x87 \ x96l \ x8E \ xF6a \ X00 \ x059 \ XC4 \ xF1y:!\ X89 \ XFF $ d ^ \的x87 \ xE5 \ X00 \ x00z \ XC0' \ x00g \ X00 \ x9C \ XC0 \ x11 \ xC0 \ x07 \ xC0 \ x0C \ xC0 \ x02 \ x00 \ x05 \ xC00 \ xC0,\ xC0(\ xC0 $ \ xC0 \ x14 \ xC0“400 173” - “” - “   2016/04/09 19:15:17 [info] 7#7:* 6客户端在读取客户端请求行时发送了无效方法,客户端:10.48.0.1,server :, request:“2. 6OK 4f = 4                                                                                                                                                         jЁǐ

我完全失去了 - 请帮助:(所有非websocket路由(为简单而遗留在原始代码段中)正在使用SSL,并且带有TLS的websocket也适用:(

如果有帮助,我将Nginx作为GCP上Kubernetes内的Docker容器运行。

2 个答案:

答案 0 :(得分:6)

我简直不敢相信我浪费了一整天的时间。在我的MQTT.JS客户端中,我只是将网址从wss://my.domain.com/ws更改为wss://my.domain.com:443/ws并且有效。离开这里希望能节省一些时间。

答案 1 :(得分:0)

通过修改服务器块上的 listen 行,我始终能够重现该问题。

A - 错误: 重现乱码和 client sent invalid method while reading client request line 错误。

server {
    listen 443;
server {
    listen ssl;

B - 已修复:错误消失,我可以处理我的请求(纯 html、fastcgi_pass 等)。

server {
    listen 443 ssl;