首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >两个默认/覆盖nginx所有位置的“冲突服务器名称”--一个带有default_server,另一个没有?

两个默认/覆盖nginx所有位置的“冲突服务器名称”--一个带有default_server,另一个没有?
EN

Stack Overflow用户
提问于 2014-12-30 01:53:05
回答 1查看 1.3K关注 0票数 0

我的智慧在这里结束了。我已经和nginx的配置做了几个小时了。以下是我试图使用的两个街区:

代码语言:javascript
复制
server {
    listen 80 default_server;
    location /health-check {
        default_type 'text/plain';
        access_log off;
        return 200;
    }
}

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

# other application servers/upstreams follow -- one is provided here for completeness,
# although the issue is almost certainly above

upstream quinoa-icehouse {
    server 172.17.8.100:49153;

}

server {
    server_name ~^quinoa-icehouse\.(?<domain>.+)$;
    server_name_in_redirect off;
    port_in_redirect off;


    listen 443 ssl spdy;
    listen 80;
    ssl_certificate /etc/ssl/deis.cert;
    ssl_certificate_key /etc/ssl/deis.key;

    location / {

        proxy_buffering             off;
        proxy_set_header            Host $host;

        proxy_set_header            X-Forwarded-Proto $scheme;

        proxy_set_header            X-Forwarded-For   $proxy_add_x_forwarded_for;
        proxy_redirect              off;
        proxy_connect_timeout       30s;
        proxy_send_timeout          1200s;
        proxy_read_timeout          1200s;
        proxy_http_version          1.1;
        proxy_set_header            Upgrade           $http_upgrade;
        proxy_set_header            Connection        $connection_upgrade;

        proxy_next_upstream         error timeout http_502 http_503 http_504;

        add_header                  X-Deis-Upstream   $upstream_addr;

        proxy_pass                  http://quinoa-icehouse;
    }
}

请注意,我希望/health-check端点仅在其他服务器名称不匹配时才能工作,但我希望每当服务器名称匹配时就会出现301

我似乎尝试过这些指令的每一个组合,结果却得到:

代码语言:javascript
复制
[INFO] - 2014/12/30 01:26:34 [warn] 39#0: conflicting server name "" on 0.0.0.0:80, ignored

有什么办法让我完成我想要的吗?谢谢你!!

EN

回答 1

Stack Overflow用户

发布于 2014-12-30 19:20:35

本质上,您是在Nginx定义的参数之外。可以这么说,您不能让两个默认的服务器块坐在一起。

但是,您可以通过定义:

  1. 侦听端口80以将所有请求重定向到端口443的catch all块
  2. 在端口443上侦听所有不匹配域的catch all块

然后,您需要确保以下内容:

  1. 删除"default_server“指令,并依赖于服务器块的位置,如示例答案中所示
  2. 确保其他应用服务器/上游只侦听端口443。

因此,您的配置应该是这样的:

代码语言:javascript
复制
http {

    [ ... ]

    # Default to redirect from Port 80 to Port 443
    server {
        listen 80;
        return 301 https://$host$request_uri;
    }
    # Default for unmatched domains on Port 443
    server {
        listen 443 ssl spdy;
        ssl_certificate /etc/ssl/someCert.cert;
        ssl_certificate_key /etc/ssl/someKey.key;
        # Return 403, 404 or 444
        return 403;
    }

    # Other servers.
    # 1. These must be below this for this configuration to work.
    # 2. None should listen on Port 80
    server {
        server_name ABC
        listen 443 ssl spdy;
        ssl_certificate /etc/ssl/someCert.cert;
        ssl_certificate_key /etc/ssl/someKey.key;

        [ ... ]

    }
    server {
        server_name XYZ
        listen 443 ssl spdy;
        ssl_certificate /etc/ssl/someCert.cert;
        ssl_certificate_key /etc/ssl/someKey.key;

        [ ... ]

    }
}

参见:Why is nginx responding to any domain name?

还请注意,对于只返回简单响应的简单服务器块,不需要有位置块。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27698636

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档