Nginx,第二个子域名不工作

Nginx,第二个子域名不工作

我使用了 CNAME 通配符 DNS 条目,例如:

@    IN A      ip.add.re.ss  
www  IN CNAME  @  
*    IN CNAME  @  

我的根 domain.com 和 sub1.domain.com 可以访问(在同一个 digitalocean droplet 上)。
但是,如果我尝试访问 sub2.domain.com,在配置 Web 服务器后,它会带我到 sub1.domain.com。
我使用的是 NginX 服务器块,所有域都使用相同的 IP 地址。(我在 80 上配置了 domain.com,同时访问/配置了 sub1.domain.com:8088 和 sub2.domain.com:8088 等子域)

sub1 是 phpmyadmin:

server {
    listen          8088;
    server_name     phpmyadmin.mydomain.com;
    root            /usr/share/nginx/html/phpmyadmin;
    index           index.php index.html index.htm;
    access_log      /var/log/nginx/phpmyadmin/access.log;
    error_log       /var/log/nginx/phpmyadmin/error.log;
 
    if (!-e $request_filename) {
        rewrite ^/(.+)$ /index.php?url=$1 last;
        break;
    }
 
    # Images and static content is treated different
    location ~* ^.+.(jpg|jpeg|gif|css|png|js|ico|xml)$ {
        access_log        off;
        expires           360d;
    }
 
    location ~ /\.ht {
        deny  all;
    }
 
    location ~ /(libraries|setup/frames|setup/libs) {
        deny all;
        return 404;
    }
 
    location ~ \.php$ {
        try_files $uri =404;
        fastcgi_pass unix:/var/run/php5-fpm.sock;
        fastcgi_index index.php;
        include /etc/nginx/fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    }
}

sub2 是统计数据:

server {
    listen          8088;
    server_name     stats.mydomain.com;
    root            /usr/share/nginx/html/piwik;
    index           index.php piwik.php;
    access_log      /var/log/nginx/piwik/access.log;
    error_log       /var/log/nginx/piwik/error.log;
 
    location ~ /\.ht {
        deny  all;
    }
 
    location ~ \.php$ {
        try_files $uri =404;
        fastcgi_pass unix:/var/run/php5-fpm.sock;
        fastcgi_index index.php;
        include /etc/nginx/fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    }
}

我的/etc/hosts:

127.0.0.1   localhost mydomain
::1     ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters  

在浏览器中输入 phpmyadmin.mydomain.com:8088 没问题,但输入 stats.mydomain.com:8088 会转到 phpmyadmin 登录页面。我需要为多个子域创建更多 A 或 CNAME 记录吗?

答案1

如果你重新加载了配置(nginx -s reload),但没有任何变化,那么我怀疑是有人default_server耍了花招。让我们来看看文档

nginx 仅测试请求的标头字段“Host”,以确定应将请求路由到哪个服务器。如果其值与任何服务器名称都不匹配,或者请求根本不包含此标头字段,则 nginx 会将请求路由到此端口的默认服务器。

基本上,这意味着如果没有server{}为您的请求提供句柄,它将被转移到默认服务器。由于您没有明确设置一个...

在上面的配置中 [参见文档中的示例],默认服务器是第一个 - 这是 nginx 的标准默认行为。

在您的例子中,“第一个服务器”是 phpMyAdmin,因为字母表中的“p”位于“s”(统计)之前。发生的情况是:

  • 您的请求已发送至stats.mydomain.com
  • 统计信息server{}块不提供与您的 URI 匹配的任何位置块。
  • nginx 将请求转发到默认服务器,即 phpMyAdmin

从那里 :

  • phpMyAdmin 可以处理该请求,或者......
  • 但不能,导致 404 或 403 错误。

由于以下配置...

if (!-e $request_filename) {}

... phpMyAdminserver{}能够处理任何请求,因为它将所有错误的请求重写为index.php请求。当它无法处理参数时,您会被重定向到登录页面,因为这是默认的 phpMyAdmin 页面$_GET['url']

为了验证该理论,只需default_server在统计配置中添加监听端口:

listen 8088 default_server;

如果行为发生变化,那么你就可以确定了。下一步就是调查日志。你的统计配置可能与实际目录结构不匹配,从而导致 404 或 403 错误(这首先导致请求被转发到默认服务器 phpMyAdmin)。

相关内容