使用 Nginx 作为多台服务器的反向代理

Dan*_*aes 9 nginx reverse-proxy

我正在尝试将 nginx 配置为 LAN 上多个服务器的反向代理。他们应该在我的 WAN 上使用不同的子域。我的配置是这样的:

@ReverseProxy:/etc/nginx/sites-enabled$ cat reverseproxy 
server { 
  server_name DOMAIN.eu;

  # 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://10.0.2.5:80;

}

server { 
  server_name Subdomain.domain.eu;

  # 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://10.0.2.33:80;
}
Run Code Online (Sandbox Code Playgroud)

但是我收到此错误并且无法再进一步....

@ReverseProxy:/etc/nginx/sites-enabled$ nginx -t
nginx: [alert] could not open error log file: open() "/var/log/nginx/error.log" failed (13: Permission denied)
2009/01/04 12:22:13 [warn] 1302#0: the "user" directive makes sense only if the master process runs with super-user privileges, ignored in /etc/nginx/nginx.conf:1
2009/01/04 12:22:13 [emerg] 1302#0: "proxy_pass" directive is not allowed here in /etc/nginx/sites-enabled/reverseproxy:8
Run Code Online (Sandbox Code Playgroud)

nginx: 配置文件 /etc/nginx/nginx.conf 测试失败

Ter*_*nen 12

您的问题是您正在使用proxy_pass内部server块,这是不允许的。尝试使用:

server {
    server_name Subdomain.domain.eu;

    location / {
        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://10.0.2.33:80;
    }
}
Run Code Online (Sandbox Code Playgroud)

在你的server街区内。server正如nginx 文档所述,代理选项不能在级别上设置。

发生日志中的其他问题是因为您以某种方式将 nginx 以普通用户身份启动,尽管它应该以root.


use*_*331 9

这个线程解决了我的问题,但我认为其他人有一个完整的配置来查看会很有用。以下配置将反向代理主机名 app1.local 和 app2.local,其中 app1 被转发到另一个侦听端口 3300 的应用程序,而 app2 转发到另一个侦听端口 3000 的应用程序。它位于此处的文件中/etc/nginx/sites-available/two-applications.conf

server {
  server_name app1.local;

  location ~ {
    proxy_pass_header Authorization;
    proxy_pass http://localhost:3300;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_http_version 1.1;
    proxy_set_header Connection "";
    proxy_buffering off;
    client_max_body_size 0;
    proxy_read_timeout 36000s;
    proxy_redirect off;
  }
}

server {
  server_name app2.local;

  location ~ {
    proxy_pass_header Authorization;
    proxy_pass http://localhost:3000;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_http_version 1.1;
    proxy_set_header Connection "";
    proxy_buffering off; 
    client_max_body_size 0;
    proxy_read_timeout 36000s;
    proxy_redirect off;
  }
}
Run Code Online (Sandbox Code Playgroud)

此外,这些主机名是组成的,需要/etc/hosts如下所示才能使它们工作:

127.0.0.1       app1.local
127.0.0.1       app2.local
Run Code Online (Sandbox Code Playgroud)

为了完整起见(在 Ubuntu Linux 上设置),这个文件存在 并被符号链接/etc/nginx/sites-available/two-applications.conf/etc/nginx/sites-enabled/two-applications.conf文件名和符号链接名称当然可以是任何东西。更新后,运行sudo service nginx reload将获取更改。

  • 对于您所描述的示例,听起来您根本不需要任何 nginx 配置。此线程中讨论的配置解决了一个不同的问题。您可能只需使用您的主机文件即可。但是,如果您想通过 nginx 运行所有内容,则需要设置 hosts 文件条目并更改 proxy_pass 行以使用 localhost 以外的其他内容,因为对于您的情况,您需要在此处列出另一台机器。 (2认同)