Nginx反向代理多个后端服务器

41

这是我的情况:我将有一个运行Nginx的前端服务器,以及多个运行Apache + passenger不同Rails应用程序的后端服务器。 我并不试图做任何负载均衡。 我需要做的是设置Nginx根据URL代理连接到特定服务器。例如,client.example.com应指向x.x.x.100:80client2.example.com应指向x.x.x.101:80,等等。

我对Nginx并不那么熟悉,但我找不到适合我情况的特定配置。


嘿,你能找到解决方案吗?在我的情况下,我希望同一个客户端可以访问多个后端服务器,你能帮我找到一个配置吗? - Vinodborole
2个回答

40

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

下面是一张示意图;

server {
  server_name client.example.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.example.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)。


2
能否配置每个源服务器基于路径而非仅基于传入的主机/权限进行代理?即/system1/被代理到http://x.x.x.100/,而/system2/被代理到http://x.x.x.120/ - Asbjørn Ulsberg
1
在这种情况下,您只需将代理指令放置在适当的位置块中,而不是主服务器块中。 - cobaco
6
我把这个放在了sites-enabled目录下的配置文件中,然后重新启动了nginx,现在日志中出现了这个错误:/etc/nginx/sites-enabled/my.domain.com中不允许使用该指令。 - mohamnag
哪个指令是不允许的?(运行 nginx -t 命令应该会告诉你哪个指令在哪一行)。该指令所在的配置块的作用域是什么(http/server/location)? - cobaco
为什么不添加上游配置呢?这样可以使配置更清晰。请参考官方指南中的此示例 - qtopierw
显示剩余2条评论

28

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

参见:

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

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

因此,正确的配置应该是

server {
    server_name client.example.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.example.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;
    }
}

1
我应该把这些写在哪个文件里?是在/etc/nginx/nginx.conf还是sites-enabled目录下? - Eziz Durdyyev
2
@EzizDurdyyev:在我看来,“sites-enabled”是Ubuntu相关的配置文件布局,只包含到“sites-available”中可用站点的符号链接。但是,是的,这应该放置在“sites-available”下的单个站点配置中。 - jaltek

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接