AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 1089252
Accepted
O'Niel
O'Niel
Asked: 2022-01-07 17:54:57 +0800 CST2022-01-07 17:54:57 +0800 CST 2022-01-07 17:54:57 +0800 CST

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

  • 772

我有两个应用程序。

  • 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.com, businnesX.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 的正确方法吗?

nginx reverse-proxy
  • 1 1 个回答
  • 831 Views

1 个回答

  • Voted
  1. Best Answer
    Tero Kilkanen
    2022-01-07T23:47:03+08:002022-01-07T23:47:03+08:00

    您的设计有点复杂,因此很脆弱。但是,您可以尝试以下方法。我添加了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.com告诉 nginx 使用这些规则处理对主域和任何子域的所有请求。

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

    编辑

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

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

相关问题

  • Gzip 与反向代理缓存

  • nginx 作为代理的行为

  • Nginx 学习资源 [关闭]

  • 提供 70,000 个静态文件 (jpg) 的最佳方式?

  • 在 Apache、LightTPD 和 Nginx Web 服务器上提供 PHP 5.x 应用程序的现状?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve