我正在运行带有 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
}
}
}