【问题标题】:How to route to different servers and namespaces如何路由到不同的服务器和命名空间
【发布时间】:2020-04-03 09:55:40
【问题描述】:

如果这在黑暗中有点冒险,请原谅我,我的 DevOps/架构技能是 v v 最低的,所以我不太确定正确的术语。

我有一个托管在 AWS 上的 react 应用程序,我想将它放在根目录 mysite.com 以及某些“子目录”上,例如mysite.com/itemsmysite.com/category

此外,我希望在其他地方托管一个博客,但可以通过 mysite.com/blog 和一些其他静态页面访问,例如 mysite.com/aboutmysite.com/contact。我希望将这些静态页面托管在同一个地方(我正在考虑 webflow)。

这似乎有点复杂,但我想知道最好的解决方案是什么。使用 Nginx 的反向代理是否可以工作,如果可以,您将如何配置它?还有其他可能有效的“无服务器”解决方案吗?

也许有一种方法可以将所有流量发送到静态页面服务器,除非它是根目录或特定的 /items/category/blog

【问题讨论】:

    标签: nginx url routing url-routing reverse-proxy


    【解决方案1】:

    您好,基本配置可能如下所示:

    server {
        listen 8080;
        return 200 "Blog \n";
    }
    
    server {
        listen 8081;
        return 200 "About and Contact \n";
    }
    
    server {
        listen 80;
    
        location = /about {
            proxy_pass http://localhost:8081;
        }
    
        location  /blog {
            proxy_pass http://localhost:8080;
        }
    }
    

    让我给它添加一些文字:)

    如果您只想拥有一个位置 /about,而该位置中没有任何其他内容,您可以使用 = /about

    尝试在/about 后面添加一些内容,例如/about/foo,将导致 404。

    如果您想将博客代理到其他位置,请使用/blog。使用此配置,您可以随意向您的位置添加一些内容,例如 /blog/test/,它仍会以 200 响应。

    [root@localhost conf.d]# curl -v localhost/blog/test
    * About to connect() to localhost port 80 (#0)
    *   Trying ::1...
    * Connection refused
    *   Trying 127.0.0.1...
    * Connected to localhost (127.0.0.1) port 80 (#0)
    > GET /blog/test HTTP/1.1
    > User-Agent: curl/7.29.0
    > Host: localhost
    > Accept: */*
    >
    < HTTP/1.1 200 OK
    < Server: nginx/1.17.6
    < Date: Tue, 17 Mar 2020 06:09:31 GMT
    < Content-Type: application/octet-stream
    < Content-Length: 12
    < Connection: keep-alive
    <
    /blog/test
    * Connection #0 to host localhost left intact
    

    开发中的无服务器方式

    在你的 react 应用中使用某些东西将流量路由到正确的目标。

    https://create-react-app.dev/docs/proxying-api-requests-in-development#configuring-the-proxy-manually

    我为我的一个项目做了这个,它的工作很棒!

    我将分享我的文件,但不会根据您的问题进行调整,仅作为一般参考和想法。

    const proxy = require('http-proxy-middleware');
    
    module.exports = function (app) {
        app.use('/api', proxy({
            target: 'http://localhost:8080',
            changeOrigin: true,
        }));
    
        app.use('/img', proxy({
            target: 'http://localhost:8080',
            changeOrigin: true,
        }));
    
        app.use('/oauth', proxy({
            target: 'http://localhost:8080',
            changeOrigin: true,
        }));
    };
    

    此文件 (setupProxy.js) 位于根级别的 thr src 目录中。

    用于生产

    我只知道一些与 node.js 之上的 express 的集成。由于代理与 http-protocoll 密切相关,因此您需要一些了解 http 协议的服务器组件。

    在过去的几个月里,我注意到使用快速网络服务器作为代理的一些缺点。缓存在 NGINX 级别上更有效。如果路由复杂度增加,NGINX 可以更好地处理它。

    【讨论】:

    • 感谢您非常详细的回复和显示的不同选项。我没想过直接在 react 应用程序中进行路由,这是一个有趣的选择!在 NGINX 版本中,您谈到能够使用 /blog/somethingelse 是不是 . 应该是该位置的一部分?所以location /blog. {?
    • 没有。就像我上面列出的配置一样。没有. .
    • 完美,所以这一切都与=有关。令我困惑的部分是我如何告诉它使用 S3 存储桶作为根和 react 应用程序的其他部分?
    • 这样的东西会起作用吗? server { listen 8080; return 200 "Blog \n"; } server { listen 8081; return 200 "About and Contact static pages \n"; } server { listen 8082; return 200 "React app \n"; }
    • server { listen 80; location = /about { proxy_pass http://localhost:8081/contact; } location = /about { proxy_pass http://localhost:8081/about; } location /blog { proxy_pass http://localhost:8080; } location = / { proxy_pass http://localhost:8082; } location /items { proxy_pass http://localhost:8082/items; } location /category { proxy_pass http://localhost:8082/category; } }
    猜你喜欢
    • 2018-05-01
    • 1970-01-01
    • 2015-07-05
    • 1970-01-01
    • 1970-01-01
    • 2023-01-24
    • 2020-01-31
    • 2015-09-23
    • 1970-01-01
    相关资源
    最近更新 更多