【问题标题】:nginx reverse proxy multiple backendsnginx反向代理多个后端
【发布时间】:2012-10-25 19:18:12
【问题描述】:

这是我的情况:我将有一台运行 nginx 的前端服务器,以及运行具有不同 rails 应用程序的 apache + 乘客的多台后端服务器。我不想做任何负载平衡。我需要做的是设置 nginx 以根据 url 代理到特定服务器的连接。 IE,client.domain.com 应该指向 x.x.x.100:80,client2.domain.com 应该指向 x.x.x.101:80,等等

我对 nginx 不是很熟悉,但是我在网上找不到适合我情况的具体配置。

谢谢。

【问题讨论】:

  • 嘿,您能找到解决方案吗?在我的情况下,我希望同一个客户端访问多个这些后端服务器,你能帮我找到一个配置吗?

标签: nginx


【解决方案1】:

您可以将不同的 URL 与 server {} 块匹配,然后在每个服务器块内,您将拥有反向代理设置。

下面是插图;

server { 
  server_name client.domain.com;

  # app1 reverse proxy follow
  proxy_set_header X-Real-IP $remote_addr;
  proxy_set_header Host $host;
  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  proxy_pass http://x.x.x.100:80;

}

server { 
  server_name client2.domain.com;

  # app2 reverse proxy settings follow
  proxy_set_header X-Real-IP $remote_addr;
  proxy_set_header Host $host;
  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  proxy_pass http://x.x.x.101:80;
}

此外,您可以根据需要在每个 server {} 块中添加更多 Nginx 设置(例如 error_pageaccess_log)。

【讨论】:

  • 是否可以将每个源服务器配置为基于路径而不仅仅是传入主机/权限代理? IE。 /system1/ 被代理到 http://x.x.x.100//system2/ 被代理到 http://x.x.x.120/?
  • 当然,在这种情况下,您只需将代理指令放在适当的位置块中,而不是放在主服务器块中
  • 我把它放在启用站点的配置文件中并重新启动 nginx,现在我在日志中收到此错误:指令在 /etc/nginx/sites-enabled/my 中是不允许的.domain.com
  • 不允许使用哪个指令? (运行nginx -t 应该会告诉你哪个指令在哪一行)。该指令所在的配置块是什么范围(http/server/location)?
  • proxy_pass 似乎不允许在服务器上下文中
【解决方案2】:

@mohamnag 的评论是正确的。 proxy_pass 只允许在 location 中使用

见:

http://wiki.nginx.org/HttpProxyModule#proxy_pass

https://www.nginx.com/resources/admin-guide/reverse-proxy/

所以正确的配置应该是

server { 
    server_name client.domain.com;

    location / {
        # app1 reverse proxy follow
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_pass http://x.x.x.100:80;
    }
}

server { 
    server_name client2.domain.com;

    location / {
        # app2 reverse proxy settings follow
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_pass http://x.x.x.101:80;
    }
}

【讨论】:

  • 我应该在哪个文件中写这些?是 /etc/nginx/nginx.conf 吗?或启用网站?
  • @EzizDurdyyev:恕我直言,“sites-enabled”是与 Ubuntu 相关的配置文件布局,仅包含指向“sites-available”中可用站点的符号链接。但是,是的,这应该放在“可用站点”下的单站点配置中。