【问题标题】:Nginx - Reverse proxy to multiple backendsNginx - 多个后端的反向代理
【发布时间】:2012-11-04 03:43:13
【问题描述】:

请在标记为重复之前阅读我自己的案例,它与其他人有点不同。

我正在开发多个我希望在同一个域下拥有的 node.js 端点。

这些服务确实会响应以下内容:

  • /user/:user_id/authorization - 授权服务的基本路径
  • /user/:user_id/log - 日志服务的基本路径

等等。

第一部分/user/:user_id/ 对所有服务都是一样的,它只是一种 REST 方式,在路径中传递用户 ID,而不是使用 Authentication 标头。

有没有办法可以将 NGINX 反向代理到这些网络服务,因为它们使用相同的基本路径?

另一个问题:如果 NGINX 不用于缓存内容,如果它是反向代理,它是否会降低 node.js 的性能(例如,如果它的性能比 node.js 最差)?

【问题讨论】:

    标签: node.js nginx


    【解决方案1】:

    如果我清楚地理解你的问题,你需要这样的东西:

    server {
        listen              80;
        server_name default;
        root                /var/www/;
    
        access_log  /var/log/nginx/access.log combined;
        error_log   /var/log/nginx/error.log error;
    
        location / {
            if (-f $request_filename) {
                    access_log      off;
                    expires         30d;
                    break;
            }
            error_log       off;
            error_page 404  = @node;
        }
    
        location @node {
            if ($uri ~ "/user/(.*)/authorization") { proxy_pass     http://127.0.0.1:8080; } #authorization service
            if ($uri ~ "/user/(.*)/log")           { proxy_pass     http://127.0.0.1:8081; } #log service
    
            proxy_next_upstream     error timeout http_500 http_502 http_503 http_504;
            proxy_set_header        Host $host;
            proxy_set_header        X-Real-IP $remote_addr;
            proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_ignore_headers    X-Accel-Expires Expires Cache-Control;
        }
    }
    

    【讨论】:

      【解决方案2】:

      使用 nginx,你可以做任何你想做的路由,看这里作为起点:http://nginx.org/en/docs/http/request_processing.htmlhttp://nginx.org/r/location


      另一个问题:如果 NGINX 不用于缓存内容,如果它是反向代理,它是否会降低 node.js 的性能(例如,如果它的性能比 node.js 最差)?

      node.js itself or nginx frontend for serving static files?

      另见:http://www.aosabook.org/en/nginx.html

      【讨论】:

      • 感谢这些资源,我正在阅读它们。我还看到了您对 Vadim 答案的评论,我查看了“IfIsEvil”,他们说它是否有效,不是随机行为,所以如果我配置它并且它在测试中有效,它将永远有效......否则,他们会采用不同的方法(如果有的话)。这是我的问题:我还有其他方法吗?我正在阅读“request_processing”,我应该使用不同的“位置”部分吗?它会完成这项工作吗?非常感谢。
      • 是的,在 nginx 中使用位置是首选方式。它使配置更清晰。此外,“位置”被优化为有效的搜索树,工作速度更快。不同的工具用于不同的任务。我知道 apache 的家伙喜欢在它的配置中编程,但是 nginx 是不同的。
      • 另请注意,您可以嵌入位置块,例如:location /user/ { location ~ ^/user/(?:.*)/authorization$ { .. } }