通过nginx代理在Loopback中添加自定义路由

时间:2015-06-12 00:36:09

标签: node.js express nginx loopbackjs

我正在尝试将自定义中间件路由添加到现有的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

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

使用http://localhost:3000/ping

enter image description here

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

enter image description here

{
  "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干扰
  3. 时,我的自定义路由未注册环回

    UPDATE 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;
        }
    
      }
    
    }
    

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

您可能希望在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 param更改为不是全局的,只需使用/api但处理相同。诀窍是Loopback config host param必须匹配nginx config上游声明的主机。