【发布时间】:2020-05-07 02:55:03
【问题描述】:
我使用 nginx 作为 nodejs 应用程序的代理。我有相同的应用程序在不同的端口上运行多次。根据主机名将请求定向到正确的应用程序/端口。
So
test1.domain.com would be proxied to 127.0.0.1:8000
test2.domain.com would be proxied to 127.0.0.1:8001
test3.domain.com would be proxied to 127.0.0.1:8002
当我硬编码“proxy_pass http://127.0.0.1:8000;”时一切正常。
现在我编写了一个 njs 脚本来读取用户目录中的文件以获取基于子域的端口号。这是脚本。
#inclusion of js file
js_include sites-available/port_assign.js;
js_set $myPort port;
function port(r) {
var host = r.headersIn.host;
var subdomain = host.split('.');
var fs = require('fs');
var filename = '/home/' + subdomain[0] + '/port';
var port = fs.readFileSync(filename);
port.trim();
return(port);
}
这确实会读取文件并正确返回端口号。我已经在错误日志中验证了这一点,因为我得到:
2020/01/21 04:26:46 [error] 2729#2729: *6 invalid port in upstream "127.0.0.1:8001
", client: 96.54.17.234, server: *.foundryserver.com, request: "GET / HTTP/1.1", host: "test1.foundryserver.com"
现在,当我尝试发出指令时:proxy_pass http://127.0.0.1:$myPort 我收到内部服务器错误和上述错误。
不知道这两者有什么区别。我只能认为以某种方式使用变量 $myPort 会得到奇怪的字符或其他东西。
【问题讨论】:
-
这很难说,但
8001和结束"之间是否有一些空白?