Nginx:WebSocket通配符位置

时间:2016-02-16 09:35:40

标签: nginx go websocket wildcard nginx-location

我在Go服务前面使用了一个nginx实例。

我当前的配置:

ssl_certificate                 ...
ssl_certificate_key             ...
ssl_ciphers                     ...
ssl_prefer_server_ciphers       on;

server {
        listen         80;
        location / {
                return 301 https://$host$request_uri;
        }
}

server {
        listen          443 ssl;
        server_name     www.mydomain.com mydomain.com;

        add_header Strict-Transport-Security "max-age=31536000";

        location /ws {   <--- This only works for /ws but not /ws/app1
            proxy_pass http://localhost:8443/ws;
            proxy_http_version 1.1;
            proxy_set_header Host $http_host;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection "upgrade";
        }

        location / {    <--- Catches anything, even without wildcard ?!
                proxy_pass http://localhost:8443;
        }
}

server {
        listen 443 ssl;
        server_name *.mydomain.com;
        return 444;
}

为什么这有必要?好吧,据我所知,你必须明确设置升级头,所以我猜你来指定另一个位置。

理想情况下,我只会使用一个位置,但然后会阻止websockets(因为升级标头永远不会进入Go服务...)

我不是nginx专家,所以忍受我=)。

[编辑]

我现在就开始工作了。我不确定它是否可以始终set_header升级/连接,即使它不是websocket请求,但我的Go服务不提供****,所以它适用于我=]

ssl_certificate                 ...
ssl_certificate_key             ...
ssl_ciphers                     ...
ssl_prefer_server_ciphers       on;

server {
        listen         80;
        location / {
                return 301 https://$host$request_uri;
        }
}

server {
        listen          443 ssl;
        server_name     www.mydomain.com mydomain.com;

        add_header Strict-Transport-Security "max-age=31536000";

        location / {    <--- Catches anything, even without wildcard ?!
            proxy_pass http://localhost:8443;
            proxy_redirect off;
            proxy_http_version 1.1;
            proxy_set_header Host $http_host;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection "upgrade";
        }
}

server {
        listen 443 ssl;
        server_name *.mydomain.com;
        return 444;
}

1 个答案:

答案 0 :(得分:1)

查看Javadoc

上的文章

您没有使用任何location_match,因此匹配是前缀匹配。

使用~作为位置匹配修饰符,将其解释为正则表达式。

location /ws行应该与以/ws开头的每个查询匹配。