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;
  }
}

文學:

我已經經歷過伺服器名稱請求處理。我還回顧了其他一些似乎相關的問題,但似乎沒有一個問題涵蓋了我的情況。

問題:

我的問題是,當我在瀏覽器中輸入子網域時,我得到的是 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”。自檢git.lini.lan在測試中使用 URL,導致所有請求都定向到開發框而不是 gitlab 伺服器,如上所述。

相關內容