Nginx:WebSocket 通配符位置

Posted

技术标签:

【中文标题】Nginx:WebSocket 通配符位置【英文标题】:Nginx: WebSocket wildcard location 【发布时间】:2016-02-16 09:35:40 【问题描述】:

我在 Go 服务前使用 nginx 实例。

我想将端口 80 上的任何内容重定向到 https。 [完成] /* 处的所有(非 websocket)https 请求都应该转到 https://localhost:8443/* [完成] /ws/* 处的所有 websocket https 请求都应该转到 https://localhost:8443/ws/* [缺失]

我当前的配置:

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 专家,所以请耐心等待 =)。

[编辑]

我现在开始工作了。我不确定是否可以始终设置_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】:

查看文章https://www.digitalocean.com/community/tutorials/understanding-nginx-server-and-location-block-selection-algorithms

你没有使用任何location_match,所以匹配是前缀匹配。

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

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

【讨论】:

谢谢,我去看看。

以上是关于Nginx:WebSocket 通配符位置的主要内容,如果未能解决你的问题,请参考以下文章

nginx 为通配符域配置不同的证书

nginx 和一个域的两个证书(EV nad 通配符)

nginx server_name 通配符或包罗万象

NGINX使用带通配符的虚拟主机

Nginx--server块配置

centos+nginx申请Let's Encrypt 通配符HTTPS证书