另一个 nginx 反向代理问题

Another nginx reverse proxy issue

我正在组装一个 nginx 反向代理。这是一个有效的 nginx conf 文件片段:

upstream my_upstream_server {
  server 10.20.30.40:12345;
}

server {
  server_name ssl-enabled.example.com;

  listen 443 ssl;
  ssl_certificate     /etc/ssl/server.crt;
  ssl_certificate_key /etc/ssl/server.key;
  ssl_protocols       TLSv1 TLSv1.1 TLSv1.2;
  ssl_ciphers         HIGH:!aNULL:!MD5;


  location / {
      proxy_pass         http://my_upstream_server/;
      proxy_redirect     off;
      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_set_header   X-Forwarded-Host $server_name;
  }

这使我们能够在不更改其任何配置文件的情况下为来自 my_upstream_server 的请求提供服务,并且以讨价还价的方式通过 ssl 为它们提供服务。到目前为止一切顺利。

不过,我真正想做的是对其进行配置,而不是 https://ssl-enabled.example.com/, we can direct users to https://ssl-enabled.example.com/upstream/. (I want to do this so we can have multiple virtual hosts running, each proxying a different service that we want to ssl-enable.) I've tried changing the location line from location / to location /upstream/; when I do that, the index page of the application (https://ssl-enabled.example.com/upstream/) 呈现良好,但它下面的页面会生成 404 错误。这是一个例子:

This <a href="/some/link.html">link</a> is broken

Nginx 尝试服务 /some/link.html 而不是 /upstream/some/link.html,这是行不通的。

我试图创建一个将请求发送到 /upstream$1 的重写,但是对于主页(nginx 现在认为是 https://.../upstream/)它进入了一个无限循环,尝试服务 /upstream/upstream/upstream/...,当然失败了。

我怀疑我遗漏了一些既重要又简单的东西,但到目前为止我还没有弄清楚它可能是什么。该文档可能会提供线索,但如果确实如此,我就看不到了。非常感谢 nginx 专家的任何帮助。谢谢。

下面的配置应该在不进入循环的情况下执行与您提到的类似的重定向:

upstream my_upstream_server {
    server 10.20.30.40:12345;
}

server {
    server_name ssl-enabled.example.com;

    listen 443 ssl;
    ssl_certificate      /etc/ssl/server.crt;
    ssl_certificate_key /etc/ssl/server.key;
    ssl_protocols            TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers              HIGH:!aNULL:!MD5;

    location /upstream {
        proxy_pass          http://my_upstream_server/;
        proxy_redirect      off;
        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_set_header    X-Forwarded-Host $server_name;
    }

    location / {
        return 301 https://ssl-enabled.example.com/upstream$request_uri;
    }
} 

基本上是两个位置块。

一个用于以 "upstream" 开头的请求,将被处理,另一个用于不以 "upstream" 开头的请求,将被重定向。

Alexey 关于/更易于使用的说法是正确的,大约在他发表评论时,我开始意识到,既然我可以为 example.com 创建 DNS 条目,而不是试图引导人们去https://server.example.com/upstream/ it would be much easier to just create a DNS entry for https://upstream.example.com/

这就是我所做的,看起来代码完全符合我的要求。感谢 Alexey 和 Dayo 的回复。