【问题标题】:Replacing nginx as a reverse-proxy with express用 express 替换 nginx 作为反向代理
【发布时间】:2018-11-12 08:45:54
【问题描述】:

我想用 node js express 应用程序替换作为反向代理的 nginx 应用程序,这样我就可以设置动态规则并具有更好的日志记录和测试可能性。

我的 nginx 设置如下:

http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        off;
    keepalive_timeout  65;
    gzip  on;

    server {
        listen       8023;
        server_name  localhost;
        sendfile        off;

        location / {
            proxy_pass https://main.app.url.com/;
        }

        location /module1/v1/ {
            client_max_body_size 30000M;
            client_body_buffer_size 200000k;
            # local backend of module 1
            proxy_pass http://localhost:8080/module1/v1/;
        }

        location /module1/v1/web/ {
            # local front end files for module 1
            alias /some/local/path/build/dist;
        }

        location /module2/v1/web/ {
            # local front end files for module 1
            alias /some/other/local/path/build/dist;
        }
    }
}

我尝试使用 express-http-proxy 中间件,但我很难将上述规则应用于它。首先,我不完全理解 proxy_passalias 指令之间的区别。

第二次我尝试了以下操作:

const express   = require('express');
const app       = express();
const proxy     = require('express-http-proxy')

const path = '/some/local/path/build/dist';

app.all('/module1/v1/web/', proxy(path, {
            proxyReqPathResolver: (req) => {
                return '';
            }
        })
    );
};

我遇到了一个错误:

TypeError: Cannot read property 'request' of undefined
    at /Users/user1/Dev/local-dev-runner/node_modules/express-http-proxy/app/steps/sendProxyRequest.js:13:29
    at new Promise (<anonymous>)
    at sendProxyRequest (/Users/user1/Dev/local-dev-runner/node_modules/express-http-proxy/app/steps/sendProxyRequest.js:11:10)
    at <anonymous>
    at process._tickCallback (internal/process/next_tick.js:188:7)

虽然cont path = 'http://www.google.com'返回了一个有效的响应。

【问题讨论】:

    标签: express nginx reverse-proxy http-proxy


    【解决方案1】:

    所以这就是我带来的:

    诀窍是提供本地文件代理网络请求。显然,nginx 可以自动识别请求的 URI 是本地路径还是远程路径。

    我决定使用 nmp 包 is-urlexpress-http-proxy 所以,工作解决方案如下所示:

    const express   = require('express');
    const app       = express();
    const isUrl     = require('is-url');
    const proxy     = require('express-http-proxy');
    
    ...
    
    /**
     * Function adding new redirects to the current server instance. If the target URL is an URL the request will be
     * handeled with the express-http-proxy middleware. If the target URL is some local directory the content will be serverd using the express-static middleware.
     * @param matchedPath The path (endpoint) for which the redireciton should be configured.
     * @param targetUrl The target URL or directory for the redirection.
     */
    const setUpRedirect = (matchedPath, targetUrl, name) => {
        // Use proxy for Urls 
        if (isUrl(targetUrl)) {
            app.use(matchedPath,
                proxy(targetUrl,
                    {
                        memoizeHost: false,
                        limit: '50mb',
                        proxyReqPathResolver: function(req) {
                            // I do not have (yet) any clue why I had to do this but it fixed the behavior
                            return req.originalUrl;
                        },
                    }),
            )
        }
        else { // When targetUrl is directory serve static files from there
            app.use(matchedPath,
                express.static(targetUrl),
            );
        };  
    };
    
    ...
    
    setUpRedirect('/module1/v1/web/:major([0-9]+).:minor([0-9]+).:bugfix([0-9]+)', '/some/local/path/build/dist';)
    setUpRedirect('/module2/v1/web/:major([0-9]+).:minor([0-9]+).:bugfix([0-9]+)', 'http://some/remote/url/';)
    server = app.listen(8080);
    

    【讨论】:

      猜你喜欢
      • 2016-02-26
      • 1970-01-01
      • 2018-08-18
      • 2021-06-17
      • 2011-10-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-10
      相关资源
      最近更新 更多