我无法让 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;
,但没有效果。