nginx 无法匹配子域名的 server_name

nginx 无法匹配子域名的 server_name

我无法让 nginx 匹配子域的服务器声明。我正在使用Linux服务器/letsencrypt,一个从 letsencrypt api 请求 ssl 证书的 docker,并且包含一个基本的 nginx 配置。

域结构为sub1.host.example.com

我的配置有一个 default_server,以及一个配置了 server_name 'sub1.*' 的子域

任何对 sub1.host.example.com 的请求都通过默认服务器配置路由,我正在使用日志输出来确认。

我的服务器配置如下。

  log_format sub 'shout $host $remote_addr - $remote_user [$time_local] '
                 '"$request" $status $body_bytes_sent '
                 '"$http_referer" "$http_user_agent"';
    log_format def 'default-server $host $remote_addr - $remote_user [$time_local] '
               '"$request" $status $body_bytes_sent '
               '"$http_referer" "$http_user_agent"';

# main server block
server {
    listen 443 ssl default_server;

    root /config/www;
    index index.html index.htm index.php;

    server_name _;

    access_log /config/log/nginx/access.log def;


    # all ssl related config moved to ssl.conf
    include /config/nginx/ssl.conf;

    client_max_body_size 0;

    location / {
        try_files $uri $uri/ /index.html /index.php?$args =404;
    }

    location ~ \.php$ {
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        # With php7-cgi alone:
        fastcgi_pass 127.0.0.1:9000;
        # With php7-fpm:
        #fastcgi_pass unix:/var/run/php7-fpm.sock;
        fastcgi_index index.php;
        include /etc/nginx/fastcgi_params;
    }

}

# sample reverse proxy config without url base, but as a subdomain "cp", ip and port same as above
# notice this is a new server block, you need a new server block for each subdomain
#server {
#   listen 443 ssl;
#
#   root /config/www;
#   index index.html index.htm index.php;
#
#   server_name cp.*;
#
#   include /config/nginx/ssl.conf;
#
#   client_max_body_size 0;
#
#   location / {
#       auth_basic "Restricted";
#       auth_basic_user_file /config/nginx/.htpasswd;
#       include /config/nginx/proxy.conf;
#       proxy_pass http://192.168.1.50:5050;    
#   }
#}

server {
  listen 443 ssl;
  root /config/www;
  index index.html index.htm index.php
  server_name sub1.*;
  include /config/nginx/ssl.conf;
  client_max_body_size 0;

  access_log /config/log/nginx/access.log sub;

  location / {
    auth_basic "Restricted";
    auth_basic_user_file /config/nginx/.htpasswd;
    include /config/nginx/proxy.conf;
    proxy_pass http://127.0.0.1:9000;
  }
}

我尝试/审查了一些可能相关或不相关的事情:

上游

我的配置与docker容器提供的示例几乎相同,我省略了一些不相关的注释,原文在这里

那里该 repo 上存在某人的子域名不匹配的问题,但该用户表示这是他们的重定向配置的问题,重定向被发送到 IP 地址,因此与此无关。

因此,我很确定这是我的一般 nginx 配置错误,而不是该 repo 的问题。

记录请求

在我的配置中,你会看到我使用了自定义格式来确保主机正确,以及哪个服务器正在响应。对“sub1.host.example.com”的所有请求都会在访问日志中生成一行,如下所示:

default-server sub1.host.example.com 120.146.246.49 - - [31/Mar/2018:15:40:39 +0800] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:59.0) Gecko/20100101 Firefox/59.0"

DNS 配置

我没有为 host.example.com 配置单独的 DNS 区域,因此在 example.com 的区域中,我有一个“sub1.host”的“A”记录,它指向运行 nginx 的主机的 IP 地址。这已正确解析。此外,运行“hostname -f”会返回“host.example.com”

letsencrypt 证书

这一切似乎都运行正常,默认服务器返回的页面具有有效证书。我认为没有任何东西会干扰此服务器。

nginx 名称解析

默认服务器的服务器名称是“_”,这显然是故意无效的主机名。我检查了 nginx 名称解析顺序,似乎与当前问题没有任何关系。

没有通配符

我试过了server_name sub1.host.example.com;,但没有效果。

相关内容