Nginx:子域名失败,而主域名(回退到子域名)成功

Nginx:子域名失败,而主域名(回退到子域名)成功

介绍 :

我的本地网络上有一台机器,运行着 NginX。它不允许我直接访问我的子域名,而是将我定向到 NginX 索引页。如果我访问主域名,我会被重定向到正确加载代理站点的子域名。

也就是说访问git.lini.lan将会失败并加载 NginX 索引页。

NginX 无法加载指定子域名的代理网站

我期望发生的是git.lini.lan加载代理站点 GitlabHQ。

NginX 代理站点正确指定子域名

访问主域lini.lan将回退到唯一配置的站点/虚拟主机,git.lini.lan它会按预期加载代理站点 GitlabHQ。

NginX 将主域名重定向到子域名并加载代理站点

因此,我可以通过对主域的间接请求访问代理站点,但无法通过直接指定子域来访问它。

观察结果:

我的理解是,访问lini.lan会重定向到“默认”虚拟主机。由于我没有使用指令设置虚拟主机,因此listen ... default_server;NginX 默认使用第一个虚拟主机,该虚拟主机提供git.lini.lan。但是,当直接访问时git.lini.lan,NginX 会毫无理由地返回到索引页。

家庭作业 :

为了进行比较,我有另一台机器,它按预期工作,但那台机器在线,有自己的 DNS 记录设置并使用 SSL,因此两台机器上的 NginX 配置之间没有完全 1 对 1 的比较。例如,DNS 记录可能会以某种方式修复 NginX 可能正在做的任何奇怪的事情。我已经对两台机器之间的配置文件进行了比较,忽略 SSL 内容后,这两个配置实际上是等效的。

我也检查了我的日志文件但似乎没有什么异常。

理论 :

今天下午我一直在研究这个问题,以下是我学到的东西。我的“默认”虚拟主机/服务器配置必须正确读取,否则我无法访问 GitlabHQ。也就是说代理成功并按预期加载。NginX 路由似乎有点不正确。

信息 :

我对出现问题的机器的配置如下。这是我的输出nginx -T

nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
# configuration file /etc/nginx/nginx.conf:
user nginx nginx;
worker_processes 1;

error_log /var/log/nginx/error_log info;

events {
        worker_connections 1024;
        use epoll;
}

http {
        include /etc/nginx/mime.types;
        default_type application/octet-stream;

        log_format main
                '$remote_addr - $remote_user [$time_local] '
                '"$request" $status $bytes_sent '
                '"$http_referer" "$http_user_agent" '
                '"$gzip_ratio"';

        client_header_timeout 10m;
        client_body_timeout 10m;
        send_timeout 10m;

        connection_pool_size 256;
        client_header_buffer_size 1k;
        large_client_header_buffers 4 2k;
        request_pool_size 4k;

        gzip on;
        gzip_min_length 1100;
        gzip_buffers 4 8k;
        gzip_types text/plain;

        output_buffers 1 32k;
        postpone_output 1460;

        sendfile on;
        tcp_nopush on;
        tcp_nodelay on;

        keepalive_timeout 75 20;

        ignore_invalid_headers on;

        index index.html;

        include /etc/nginx/sites/*.conf;

}

# configuration file /etc/nginx/mime.types:

types {
    text/html                             html htm shtml;
    ...
    List of MIME Types
    ...
    video/x-msvideo                       avi;
}

# configuration file /etc/nginx/sites/gitlab.conf:

upstream git.lini.lan {
  server unix:/opt/gitlabhq-8.15/tmp/sockets/gitlab.socket;
}

server {
  listen 80;

  server_name git.lini.lan;

  root /opt/gitlab-8.15/public;

  access_log  /var/log/nginx/gitlab_access.log;
  error_log   /var/log/nginx/gitlab_error.log;

  location / {
    try_files $uri $uri/index.html $uri.html @gitlab;
  }

  location @gitlab {
    proxy_read_timeout 300;    # https://github.com/gitlabhq/gitlabhq/issues/694
    proxy_connect_timeout 300; # https://github.com/gitlabhq/gitlabhq/issues/694
    proxy_redirect     off;

    proxy_set_header   X-Forwarded-Proto $scheme;
    proxy_set_header   Host              $http_host;
    proxy_set_header   X-Real-IP         $remote_addr;

    proxy_pass http://git.lini.lan;
  }
}

文学:

我经历过服务器名称请求处理。我还查看了一些其他看似相关的 SO 问题,但似乎没有一个涵盖我的情况。

问题:

我的问题是,当我在浏览器中输入子域名时,我得到的是 NginX 索引页,而不是子域名上的代理站点,即git.lini.lan重定向到 NginX指数页面,而不是Gitlab总部的界面。我不确定为什么会发生这种情况?

也许有人遇到过这种情况,可以解释一下吗?或者有没有一种方法可以记录 NginX 所做的一切,以便我可以获取更多信息。

答案1

事实证明,管理网络的 DHCP 服务器配置错误。网络上的机器如下:

...
192.168.1.10 devbox.lan The machine I was on
192.168.1.11 lini.lan   The target server
...

DNS 服务器上的主机名记录配置如下:

...
192.168.1.10 git.lini.lan
...

错误地git.lini.lan指向了192.168.1.10我的 devbox,而不是192.168.1.11Gitlab 服务器。

因此,对 的请求lini.lan将按照原始问题所示进行。它们到达了正确的框,NginX 会将 默认为第一个虚拟主机,并为 gitlab 主页提供服务。对机器名称本身 的请求lini也将起作用,因为 DHCP 服务器会将这些请求映射到lini.lan

但是,对 的请求git.lini.lan会错误地重定向回我的机器,因为本地服务器无法识别该 URL 并提供默认索引页。

笔记 :

最初我在执行 gitlab 自检时遇到了这个问题,sudo -u git bundle exec rake gitlab:env:info --trace RAILS ENV=production并且一直收到消息“检查 GitLab API 访问:失败:无法连接到内部 API”。自我检查在其测试中使用 URL git.lini.lan,导致所有请求都被定向到开发箱而不是 gitlab 服务器,如上所述。

相关内容