介绍 :
我的本地网络上有一台机器,运行着 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;
}
}
文学:
我经历过服务器名称和请求处理。我还查看了一些其他看似相关的 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.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”。自我检查在其测试中使用 URL git.lini.lan
,导致所有请求都被定向到开发箱而不是 gitlab 服务器,如上所述。