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

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

我正在尝试将 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;
}

但是我收到了这个错误并且无法继续......

@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

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

答案1

您的问题是您使用了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;
    }
}

在您的server块内。代理选项不能在级别上设置server,因为nginx 文档告诉。

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

答案2

这个帖子解决了我的问题,但我认为让其他人看到完整的配置会很有用。以下配置将对主机名 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;
  }
}

此外,这些主机名是虚构的,需要按/etc/hosts如下方式才能使其正常工作:

127.0.0.1       app1.local
127.0.0.1       app2.local

为了完整性(如在 Ubuntu Linux 上设置的那样),此文件位于并被/etc/nginx/sites-available/two-applications.conf符号链接到/etc/nginx/sites-enabled/two-applications.conf 文件名和符号链接名称当然可以是任何名称。更新后,运行sudo service nginx reload将获取更改。

相关内容