【问题标题】:NGINX invalid port in upstream上游 NGINX 无效端口
【发布时间】: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 和结束" 之间是否有一些空白?

标签: nginx proxy port


【解决方案1】:

端口变量中有一些额外的信息。我能够以 json 格式存储端口号并在 js 中解析它。 {"port":"8000"} 存储在文件中。

function port(r) {
        var host = r.headersIn.host;
        var subdomain = host.split('.');
        var fs = require('fs');
        var filename = '/home/' + subdomain[0] + '/myport';
        var jport = fs.readFileSync(filename);
        var port = JSON.parse(jport);
        return(port.port);
}

通过进行 json 解析,它删除了变量中所有看不见的字符。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多