两个 Web 应用程序的 Nginx 反向代理

两个 Web 应用程序的 Nginx 反向代理

我有两个申请。

  • Laravel 应用程序- 只是一个动态网站。没有数据知识。所有数据都使用 AJAX 请求从第二个应用程序获取。运行于127.0.0.1:8000
  • Rust 应用- 包含所有业务逻辑和数据访问的 Web 应用程序。运行于127.0.0.1:8080

两个应用程序都需要从 URL 访问example.com。为此,我想使用 Nginx 反向代理。我已经能够将所有请求重新路由到我的 Laravel 应用程序。

events {}
http {
    server {
        listen 80;

        # Website
        location / {
            proxy_pass http://127.0.0.1:8000;
        }
        
    }
}

当 Laravel 应用程序运行时,我实际上需要以下 Nginx 配置:

  • 特定页面如/news//about/contact...... 应重定向至127.0.0.1:8000
  • 注意:上面的页面可以包含 GET 参数,例如/news?article=abc
  • 所有其他请求都需要重定向到127.0.0.1:8080
  • 注意: 127.0.0.1 :8080 通常可以包含子域名。但此子域名需要充当通配符,并且在配置时未知。示例:bussiness1.example.com,,,...bussiness2.example.combusinnesX.example.com

子域名返回一个个性化页面,无限数量的企业可以在 example.com 上请求该页面。

我该如何实现这种配置?我在想这样的事情?

#PSEUDO
events {}
http {
    server {
        listen 80;

        # Website
        location / {
            proxy_pass http://127.0.0.1:8000;
        }
        location /news {
            proxy_pass http://127.0.0.1:8000;
        }
        location /about {
            proxy_pass http://127.0.0.1:8000;
        }

        # Application
        location * {
            proxy_pass http://127.0.0.1:8080;
        }

    }
}

编辑关于Tero的回答: 我需要一种用于子域名的通配符。

 # Application catch-all
    location / {
        proxy_pass http://$subdomain.$application;
    }

abc.example.com 需要转到 abc.127.0.0.1:8080 def.example.com 需要转到 def.127.0.0.1:8080 ...

我知道 IP 不能有子域名,但不用担心。我使用虚拟主机解决了这个问题。

编辑 2-将请求的子域传递给 proxy_pass:

server {
        listen 80;
        server_name *.website.com;
        server_name ~^(?<subdomain>.+)\.website\.com$;

        location / {
            proxy_pass http://$subdomain.vhost.local:8080;
        }
    }

这是将 dynamicxxx.website.com 重定向到 dynamicxxx.vhost.local:8080 的正确方法吗?

答案1

您的设计有点复杂,因此很脆弱。但是,您可以尝试以下方法。我添加了upstream块,以便不同的proxy_pass目的地更具可读性。

upstream website {
    server 127.0.0.1:8000;
}

upstream application {
    server 127.0.0.1:8080;
}

server {
    server_name example.com *.example.com;

    listen 80;

    # Application catch-all
    location / {
        proxy_pass http://application;
    }

    # Website
    location = / {
        proxy_pass http://website;
    }

    location /news {
        proxy_pass http://website;
    }

    location /about {
        proxy_pass http://website;
    }
}

=字符表示 URI 上的精确匹配,并且是 nginx 查找过程中的首要任务,如中所述nginx 文档

另一种方法是使用正则表达式:

server {
    server_name example.com *.example.com;

    listen 80;

    location / {
        proxy_pass http://application;
    }

    location ~ ^(?:/|/news|/about) {
        proxy_pass http://website;
    }
}

告诉server_name example.com *.example.comnginx 使用这些规则处理对主域和任何子域的所有请求。

如果网站请求规则只需要应用于example.com,那么您需要定义另一个仅server包含和应用规则的块server_name *.example.com

编辑

是的,子域名可以捕获到这样的变量中,并在proxy_pass目标中使用。您需要将所有域名放在一行中server_name

server_name example.com ~^(?<subdomain>[^.]+)\.example\.com;

相关内容