【问题标题】:Add custom route in Loopback over nginx proxy通过 nginx 代理在 Loopback 中添加自定义路由
【发布时间】:2015-06-12 00:36:09
【问题描述】:

我正在尝试将自定义中间件路由添加到现有 Loopback 应用程序,但使用我的本地域映射看到奇怪的错误,但在 localhost:3000 上一切正常。

我的设置是使用 nginx 作为代理服务器使用

location /api {
  proxy_pass http://localhost:3000;
}

我已从Add a custom Express Route 文档页面添加了示例 server/boot/aroutes.js 文件:

module.exports = function(app) {
  // Install a "/ping" route that returns "pong"
  app.get('/ping', function(req, res) {
    res.send('pong');
  });
}

我的服务器/启动看起来像这样,所以 aroutes.js 按字母顺序排在第一位:

server/boot/
  aroutes.js
  authentication.js
  rest-api.js

当被 AngularJS 调用时,我的应用程序和 /api 相同的域代理可以正常工作,但是当通过 https://domain.com/api/ping 调用时,我似乎无法获得自定义 Express 路由来工作,但它可以工作当我使用http://localhost:3000/ping 时很好。

使用http://localhost:3000/ping 我明白了

但是在 nginx ssl 代理上使用完整的模拟域,它不会采用相同的路由:

{
  "error": {
    "name": "Error",
    "status": 404,
    "message": "There is no method to handle GET /ping",
    "statusCode": 404,
    "stack": "Error: There is no method to handle GET /ping
    at restUrlNotFound (/Users/notbrain/src/proteus/node_modules/loopback/node_modules/strong-remoting/lib/rest-adapter.js:332:17)
    at Layer.handle [as handle_request] (/Users/notbrain/src/proteus/node_modules/loopback/node_modules/express/lib/router/layer.js:82:5)
    at trim_prefix (/Users/notbrain/src/proteus/node_modules/loopback/node_modules/express/lib/router/index.js:302:13)
    at /Users/notbrain/src/proteus/node_modules/loopback/node_modules/express/lib/router/index.js:270:7
    at Function.proto.process_params (/Users/notbrain/src/proteus/node_modules/loopback/node_modules/express/lib/router/index.js:321:12)
    at next (/Users/notbrain/src/proteus/node_modules/loopback/node_modules/express/lib/router/index.js:261:10)
    at jsonParser (/Users/notbrain/src/proteus/node_modules/loopback/node_modules/body-parser/lib/types/json.js:96:40)
    at Layer.handle [as handle_request] (/Users/notbrain/src/proteus/node_modules/loopback/node_modules/express/lib/router/layer.js:82:5)
    at trim_prefix (/Users/notbrain/src/proteus/node_modules/loopback/node_modules/express/lib/router/index.js:302:13)
    at /Users/notbrain/src/proteus/node_modules/loopback/node_modules/express/lib/router/index.js:270:7"
  }
}

这是预期的行为吗?我怎样才能使两者相等?这里似乎有两个问题

  1. nginx proxy_pass 干扰环回路由
  2. 我的自定义路由在 nginx 干扰时没有注册回环

更新 6/24:此处使用了更明确的 nginx 配置:

http {

  # ...snip logging etc... #

  upstream api {
    # loopback api on port 3000
    server localhost:3000;
  }

  upstream app {
    # browser-sync frontend for dev on port 3001
    server localhost:3001;
  }

  map $http_upgrade $connection_upgrade {
    default upgrade;
    '' close;
  }

  server {
    listen       443 ssl;
    server_name  dev.app.proteus.com;

    ssl_certificate      ssl/dev.app.proteus.com.crt;
    ssl_certificate_key  ssl/dev.app.proteus.com.key;

    ssl_session_cache    shared:SSL:1m;
    ssl_session_timeout  5m;

    # ----- PFS ----- #
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_prefer_server_ciphers on;
    ssl_ciphers "EECDH+ECDSA+AESGCM EECDH+aRSA+AESGCM EECDH+ECDSA+SHA384 EECDH+ECDSA+SHA256 EECDH+aRSA+SHA384 EECDH+aRSA+SHA256 EECDH+aRSA+RC4 EECDH EDH+aRSA RC4 !aNULL !eNULL !LOW !3DES !MD5 !EXP !PSK !SRP !DSS";

    location / {
      # proxy_pass to connect server spawned by gulp browserSync ------------
      proxy_pass http://app;
      proxy_http_version 1.1;
      proxy_set_header Upgrade $http_upgrade;
      proxy_set_header Connection "Upgrade";
    }

    location /api {
      proxy_pass http://api;
    }

  }

}

【问题讨论】:

    标签: node.js express nginx loopbackjs


    【解决方案1】:

    这似乎不是特定于 Loopback 的问题,而是与 Nginx 及其设置方式有关。要验证这一点,请尝试在 Node.js 中创建一个简单的 Hello World 应用程序,看看是否会遇到相同的错误。

    【讨论】:

      【解决方案2】:

      你可能想在 nginx 配置中使用upstream

      在该环境的环回配置中,将 host 参数更改为服务器名称。然后在您的 nginx 配置上游,而不是 localhost:{port},更改为相同的服务器名称。

      例如在server/config.test.js 用于测试环境(export NODE_ENV=test 在启动服务器之前),您可以覆盖默认主机:

      module.exports = {
          host: "app3",
          ...
      }
      

      然后在您的etc/nginx/conf.d/{app-name}.conf 文件中(每个应用创建一个很好),您可以拥有这样的内容:

      upstream my-app {
          server app3:3000;
      }
      
      server {
          listen 80;
          server_name your-server-domain.com;
      
          # custom handlers for internal apps
          # add stuff as needed below
          #
          location ^~ / {
              proxy_set_header HOST $host;
              proxy_set_header X-Forwarded-Proto $scheme;
              proxy_set_header X-Real-IP $remote_addr;
              proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
              proxy_pass http://my-app;
          }
      }
      

      现在您可以随时将 location 参数更改为非全局参数,而只需使用 /api 但相同的处理方式。诀窍是 Loopback 配置 host 参数必须匹配您在 nginx 配置上游声明的主机。

      【讨论】:

      • 根据我的经验,这是 Loopback 特定的,并且与配置中的“hosts”参数有关。同样,/explorer 似乎不起作用,并且 URL 从localhost:3000/v1/rest/endpoint 更改为app3/v1/rest/endpoint 而不是预期的your-server-domain.com/v1/rest/endpoint 所以还有一些配置我还没有找到自己来解决这个问题,但很快就会 -遇到同样的问题。希望这会有所帮助!
      • 我通过在 nginx 配置中的 location 块中添加一些额外的代理配置来解决/explorer URL 问题。更新了上面的示例。
      • 谢谢@Mike S。我已经在 nginx 中使用了upstream 语法,只是让帖子更简单。我会看看添加主机配置名称是否会有所帮助。幸运的是,我仅将这些服务器端模板用于 HTML 电子邮件的开发时预览,而不是用于生产的东西。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多