在我的 Nginx 服务器(Ubuntu 18.04)上,我想要托管 example.com 和 apis.example.com,其中 example.com 是一个 index.html 文件,apis.example.com 是我的 node js api 的代理,它在端口 3001 上运行。
我在/etc/nginx/sites-available
文件夹中有 2 个文件,分别名为 example.com 和 apis.example.com,以下是这些文件的内容。
// example.com
server {
listen 80;
listen [::]:80;
root /var/www/example.com/html/production;
index index.html
server_name example.com www.example.com;
location / {
try_files $uri $uri/ =404;
}
}
// apis.example.com
upstream domain_apis {
server 127.0.0.1:3001;
keepalive 64;
}
server {
listen 80;
server_name apis.example.com;
location / {
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $http_host;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_pass http://domain_apis/;
proxy_redirect off;
proxy_read_timeout 240s;
}
}
当我点击 时example.com
,一切正常。但是当我点击 时apis.example.com
,它会从根文件夹提供页面example.com
。我已将反向代理替换为具有另一个子域的简单服务器,但它始终为根域提供服务。
关于如何调试这个问题以及如何检查请求是否击中正确的块,有什么想法吗?
答案1
在您的server
阻止中apis.example.com
您忘记了listen
指令:
listen [::]:80;
因此,无论何时通过 IPv6 访问 nginx,它都永远不会到达该server
块,而只会到达example.com
服务器块。
由于 IPv6 是默认协议,而 IPv4 是旧协议,仅在 IPv6 不可用时使用,因此只要有可能,就会优先使用它。因此,您需要listen
在 IPv4 和 IPv6 上都安装 nginx。(更多信息)