
介紹 :
我的本地網路上有一台機器,運行 NginX。它不會讓我直接存取我的子網域,而是將我導向到 NginX 索引頁面。如果我訪問主網域,我會被重定向到正確載入代理網站的子網域。
也就是說,存取git.lini.lan
將會失敗並載入 NginX 索引頁面。
我期望發生的是git.lini.lan
加載代理站點 GitlabHQ。
造訪主網域lini.lan
會回退到唯一配置的網站/虛擬主機,git.lini.lan
它會如預期載入代理網站 GitlabHQ。
因此,我可以透過對主網域的間接請求來存取代理站點,但無法透過直接指定子網域來存取它。
觀察結果:
我的理解是訪問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.11
Gitlab 伺服器。
因此,請求將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 伺服器,如上所述。