首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在nginx代理上的回圈中添加自定义路由

在nginx代理上的回圈中添加自定义路由
EN

Stack Overflow用户
提问于 2015-06-12 00:36:09
回答 2查看 2.9K关注 0票数 0

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

我的安装程序使用nginx作为代理服务器,使用

代码语言:javascript
运行
复制
location /api {
  proxy_pass http://localhost:3000;
}

我从添加自定义快车路线文档页面添加了示例server/boot/aroutes.js文件:

代码语言:javascript
运行
复制
module.exports = function(app) {
  // Install a "/ping" route that returns "pong"
  app.get('/ping', function(req, res) {
    res.send('pong');
  });
}

我的服务器/引导看起来是这样的,所以aroutes.js首先是字母顺序的:

代码语言:javascript
运行
复制
server/boot/
  aroutes.js
  authentication.js
  rest-api.js

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

使用http://localhost:3000/ping我得到

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

代码语言:javascript
运行
复制
{
  "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配置:

代码语言:javascript
运行
复制
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;
    }

  }

}
EN

回答 2

Stack Overflow用户

发布于 2015-06-15 21:27:34

这似乎不是一个回溯特定的问题,但更多有关的Nginx和它的设置。要验证这一点,请尝试在Node.js中创建一个简单的Hello应用程序,看看是否有相同的错误。

票数 1
EN

Stack Overflow用户

发布于 2015-06-22 23:47:19

您可能希望在nginx中使用upstream

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

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

代码语言:javascript
运行
复制
module.exports = {
    host: "app3",
    ...
}

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

代码语言:javascript
运行
复制
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 param必须与在nginx上游声明的主机匹配。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30793622

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档