nginx 反向代理至 Synology DSM,无 URL 基础

nginx 反向代理至 Synology DSM,无 URL 基础

我正在运行带有 DSM 5.x 的 Synology NAS。我终于从另一台服务器获得了一个具有以下配置的可运行的 nginx 反向代理。

如果可能的话,我并不需要所有位置。DSM Web 界面使用下面的每个 URL 片段作为其界面的一部分。没有 URL 库,也没有添加 URL 库的选项。

我的问题是 - 在 nginx 中使用 proxy_pass 或 proxy_redirect 或 rewrite (或其他东西) 是否可能不必单独列出所有单独的位置? (几天来,我尝试了几十种组合,除了下面的组合之外,什么都没能奏效。)

nginx.conf

http {
    upstream dsm {
        server 1.1.1.1:5000;
    }
    server {
        location /dsm/ {
            include proxy_headers;
            proxy_pass http://dsm/;
        }
        location /scripts/ {
            include proxy_headers;
            proxy_pass http://dsm;
        }
        location /synoSDSjslib/ {
            include proxy_headers;
            proxy_pass http://dsm;
        }
        location /webapi/ {
            include proxy_headers;
            proxy_pass http://dsm;
        }
        location /webdefault/ {
            include proxy_headers;
            proxy_pass http://dsm;
        }
        location /webfm/ {
            include proxy_headers;
            proxy_pass http://dsm;
        }
        location /webman/ {
            include proxy_headers;
            proxy_pass http://dsm;
        }
    }
}

代理标头

proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Real-IP $remote_addr;

编辑:让我澄清一下——我确实遗漏了一些细节。我想要一个具有多个基本 URL 的单个地址和端口,可以到达多个 DSM,而不会发生冲突/碰撞/合谋,例如 /scripts 和 /webapi 等基本 URL。我知道多个地址和端口是可能的。如果可能的话,我正在寻找一种使用 -L 本地转发、转发单个端口的方式,以便我可以使用一个 ssh 转发端口到达多个 DSM。我现在拥有的解决方案确实有效,但仅适用于一个 DSM。如果我添加第二个,它们就会发生冲突。

答案1

位置块没有任何相似之处,因此将它们与正则表达式结合起来有点耗时且复杂。

相反,我们可以将所有请求路由到 DSM。

有三种方法可以拥有多个 DSM 服务器而不会发生冲突。

方法一:虚拟主机

您需要配置您的 DNS 以将您选择的虚拟主机指向 NGINX 服务器。

http {
    #DSM 1 Standard DSM setup
    upstream dsm1 {
        server 1.1.1.1:5000;
    }
    #DSM 2 - DSM has different Port, same IP Address
    upstream dsm2 {
        server 1.1.1.1:6000;
    }
    #DSM 3 - DSM has different IP Address
    upstream dsm3 {
        server 2.1.1.1:5000;
    }
    #DSM 1 Standard DSM setup
    server {
        listen       80;
        server_name dsm1.mydomain.com;
        location / {
            include proxy_headers;
            proxy_pass http://dsm1/;
    }
    #DSM 2 - DSM has different Port, same IP Address
    server {
        listen       80;
        server_name dsm2.mydomain.com;
        location / {
            include proxy_headers;
            proxy_pass http://dsm2/;
    }
    #DSM 3 - DSM has different IP Address
    server {
        listen       80;
        server_name dsm3.mydomain.com;
        location / {
            include proxy_headers;
            proxy_pass http://dsm3/;
    }

方法#2,不同的 NGINX 端口

每个服务器都可以通过 NGINX 服务器上自己的端口进行访问

http {
    #DSM 1 Standard DSM setup
    upstream dsm1 {
        server 1.1.1.1:5000;
    }
    #DSM 2 - DSM has different Port, same IP Address
    upstream dsm2 {
        server 1.1.1.1:6000;
    }
    #DSM 3 - DSM has different IP Address
    upstream dsm3 {
        server 2.1.1.1:5000;
    }
    #DSM 1 Standard DSM setup
    server {
        listen       80;
        location / {
            include proxy_headers;
            proxy_pass http://dsm1/;
    }
    #DSM 2 This DSM server is available on another port (8081). Access using http://nginx_ip:8081
    server {
        listen       81;
        location / {
            include proxy_headers;
            proxy_pass http://dsm1/;
    }
}

方法 3:重写

每个服务器都可以通过 NGINX 服务器上的子 URL 访问。可能无法正常工作,具体取决于 DSM 网页配置,以及它是否具有相对 URL 而非绝对 URL。

http {
    #DSM 1
    upstream dsm1 {
      server 1.1.1.1:5000
    }
    #DSM 2
    upstream dsm2 {
      server: 1.1.1.2:5000
    }
    server {
      listen 80;
      location /dsm1/(?<dsmurl>.*) {
        include proxy_headers;
        proxy_pass http://dsm1/$dsmurl
      }
      location /dsm2/(?<dsmurl>.*) {
        include proxy_headers;
        proxy_pass http://dsm2/$dsmurl
      }
     }
}

相关内容