【问题标题】:nginx reverse proxy multiple host configuration files instead of one big filenginx反向代理多个主机配置文件而不是一个大文件
【发布时间】:2020-01-16 13:12:35
【问题描述】:

link to issue

我还有一个问题。是否有可能为每个我像上面那样反向代理的系统在启用模块的文件夹中有一个单独的 conf 文件。我试过这个,但是,nginx 一直说,stream 指令是重复的。也许我可以将一个流模块指向各种服务器配置,但我不知道该怎么做。

有人可以帮忙吗?

【问题讨论】:

    标签: nginx stream reverse-proxy


    【解决方案1】:

    我在实验室环境中使用了您的用例,您实际上找到了一个非常简洁的解决方案,可以根据传入的子域流式传输代理传递。主要问题仍然是in my comment 提到的:你不能有两次你正在收听的同一个端口(在你的情况下是 443)。那是你在大组合文件中没有的东西,但是你在分割文件中引入它,并且由于 nginx 只是连接分离的文件,你提到的错误就会发生。

    从我的角度来看,通过更改文件的拆分它应该可以工作。这是一个我觉得有用的例子。它由三部分组成:

    • 包含映射的“前缀”部分
    • 服务器,随意添加。一台服务器有一个单独的server {} 指令,端口为 5480,因为该指令仅在它可以进入服务器特定文件时使用。如果其他服务器也会出现这种情况,则必须放在后缀文件中。
    • 一个“后缀”部分,其中包含实际的代理传递指令,由于使用了$upstreamvariable,该指令始终相同

    我以数字开头的文件名以确保它们在 nginx 连接它们时的顺序。

    请注意,我已经使用我拥有并且可以控制的 DNS 和服务器对此进行了测试。我确实重写了示例,以使它们与您的情况相匹配。我希望它能按原样工作,但由于我没有您的设置,它可能无法立即工作。

    前缀:00_prefix.conf

    map $ssl_preread_server_name:$server_port $upstream {
      tempserver01.domain.com:5480 tempserver01_vapp_5480;
      tempserver01.domain.com:443 tempserver01_backend_443;
      tempserver02.domain.com:443 tempserver02_backend_443;
    }
    

    服务器 1:01_realserver01.conf

    upstream $upstream {
      hash $remote_addr consistent;
      server duckduckgo.com:443;
    }
    
    server {
      listen 5480;
      proxy_pass $upstream;
      ssl_preread on;
    }
    

    服务器 2:02_realserver02.conf

    upstream $upstream {
      hash $remote_addr consistent;
      server duckduckgo.com:443;
    }
    

    您肯定已经意识到server {} 部分丢失了。这是因为它在所有情况下都是 100% 相同的,因此必须在一个文件中分离,以确保它在连接的大配置中仅出现 1 次 nginx 正在从分离的所有点点滴滴中创建配置文件。

    后缀:99_suffix.conf

    server {
      listen 443;
      proxy_pass $upstream;
      ssl_preread on;
    }
    

    使用nginx -s reload 重新加载 nginx 后,您可以检查 nginx 已使用 nginx -T 加载的完整连接配置,您会看到如下内容:

    # configuration file /etc/nginx/stream/enabled/00_prefix.conf:
    map $ssl_preread_server_name:$server_port $upstream {
      tempserver01.domain.com:5480 tempserver01_vapp_5480;
      tempserver01.domain.com:443 tempserver01_backend_443;
      tempserver02.domain.com:443 tempserver02_backend_443;
    }
    # configuration file /etc/nginx/stream/enabled/01_realserver01.conf:
    upstream $upstream {
      hash $remote_addr consistent;
      server duckduckgo.com:443;
    }
    
    server {
      listen 5480;
      proxy_pass $upstream;
      ssl_preread on;
    }
    # configuration file /etc/nginx/stream/enabled/02_realserver02.conf:
    upstream $upstream {
      hash $remote_addr consistent;
      server duckduckgo.com:443;
    }
    # configuration file /etc/nginx/stream/enabled/99_suffix.conf:
    server {
      listen 443;
      proxy_pass $upstream;
      ssl_preread on;
    }
    

    如您所见,分离的文件以正确的顺序组合在一起,一切都应该按预期工作。希望对你有帮助。

    【讨论】:

    • 你好,这不起作用我有一个流指令将请求传递给上游服务器。因此,当我将带有流指令的文件移动到 conf.d 时,nginx 不会启动。所以我从 conf 文件中删除了流指令,并将其作为包含指令放入 nginx.conf 中找到 confs 的位置,这也不起作用。我的主要目标是为每个主机提供一个单独的流文件。谢谢
    • 好的,我从您的上一条评论中了解到,您需要一个特定的订单,而 include *.conf 命令无法保证这一点。您还可以做的是使用*.include 文件并手动将它们一个接一个地以正确的顺序放置。我在我提到的 github repo 中也有这方面的例子。但我必须说实话:我还没有完全理解你的用例。您可以发布您今天拥有的示例配置文件吗?也许到那时会更清楚。谢谢。
    • 您好,请看上面的答案部分。此外,我想将此配置作为教程分享。我怎样才能做到这一点?谢谢海达尔
    • 哦,很抱歉回复晚了。我没有看到你的解释。我会在我的测试实验室试试这个。所以主要目标是添加尽可能多的 0X_realserver0X.conf 并扩展前缀:00_prefix.conf 以获得我想要的服务器数量。每次我在prefix.conf中添加一个服务器时,我需要添加一个server.conf吗?对吗?
    • 好的,我确信你会感到困惑;-) 我将开始一个新话题。分离的文件工作正常。
    猜你喜欢
    • 2017-09-25
    • 1970-01-01
    • 2019-08-22
    • 2018-04-05
    • 2015-02-12
    • 2021-10-13
    • 2020-04-16
    • 2017-06-18
    • 1970-01-01
    相关资源
    最近更新 更多