Nginx 通过 Cloudflare 反向代理到 Jetty 应用服务器

Nginx reverse proxy to Jetty app server via Cloudflare

我有一个使用 Cloudflare 来保护和代理网站的网站。

我在我的原始 nginx 网络服务器上使用 Cloudflare SSL 证书,以便所有请求都通过 HTTPS 处理,这会根据需要工作。

我已经在托管我的 Nginx 网络服务器的同一台物理服务器上设置了一个 Node.js 服务器和一个基于 Jetty 的应用程序服务器 运行 Xwiki。

我通过我的 nginx.conf 文件设置了 nginx 反向代理,以便在请求相应的 URL 时 nginx 指向相应的 'application' 服务器,例如

https://SITE-ROOT/node

这个反向代理到我的 node.js 服务器 运行 在本地主机上的端口 3001 使用我的 nginx.conf 文件中的以下位置设置...

location /node {
            proxy_pass         http://192.168.1.69:3001;
            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;
            }

这根据需要工作,node.js 页面通过 HTTPS 通过我的网站 pubic URL 和 CloudFlares 服务提供。

当我尝试对在 Jetty (Java) 应用程序服务器上运行的 Xwiki 站点执行相同操作时,该站点位于本地主机的端口 8080 上,例如

https://SITE-ROOT/xwiki

location /xwiki/ {
            proxy_pass         http://192.168.1.69:8080/xwiki;
            proxy_redirect     off;
            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;
            }

我收到以下错误:

DNS points to prohibited IP

Unfortunately, it is resolving to an IP address that 
is creating a conflict within Cloudflare's system.

我不明白为什么会这样,因为我预计节点反向代理请求也会发生同样的事情。

我能想到的唯一区别是 Xwiki 运行 在与 nginx 和节点服务位于同一主机上的 Jetty 应用程序服务器中,这意味着 nginx 和 Jetty 不是't/can当谈到反向代理时,不要像 nginx 和 node 那样握手...

如果我把我网站的真实 IP 地址和 Xwiki 端口号放在我的 nginx.conf 文件的代理重定向部分,例如

https://SITE-ROOT/xwiki

location /xwiki/ {
            proxy_pass         http://EXTERNAL-REAL-IP:8080/xwiki;
            proxy_redirect     off;
            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;
            }

这与 Xwiki 默认页面加载一样有效,但 URL 更改为我服务器的真实外部 IP,并且不使用 SSL。我知道这是因为 Jetty 服务器通过端口 8080 并通过 nginx 一起为页面提供服务。

所以我的实际问题是,如何使用 Nginx 反向代理让基于 Jetty 的 Xwiki 服务加载到我的 Cloudflare 代理网站中的某个位置,或者你能帮我理解我哪里出了问题......

我怀疑我还需要在 Jetty 服务器上安装我的 nginx 服务器上安装的 SSL 证书,以便 nginx 将 Jetty 服务器视为本地资源 - 但我对此非常不确定...

正如我在最初的问题中提到的,我期待 xwiki redirect/proxy 以与节点重定向相同的方式工作...

我挠头想知道为什么这不起作用所以我玩了...

我发现他们处理请求的方式可能有问题war所以我删除了下面的行

proxy_set_header   X-Forwarded-Host $server_name;

并将其替换为:

proxy_set_header        X-Forwarded-Proto https;

这样 Nginx 就会处理 SSL 站点的事情

location /test {
            proxy_pass              EXTERNAL-REAL-IP:8080/;
            proxy_set_header        X-Real-IP $remote_addr;
            proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header        X-Forwarded-Proto https;
            proxy_set_header        Host $http_host;
                        }

我按照上面的方法在我的 nginx 配置文件中创建了一个新的 'test' 位置,并将其指向 Jetty 运行正在使用的外部 IP 和 8080 端口......然后繁荣,我在 https://SITE-NAME/test `url 上收到一个 Jetty 错误页面,说找不到 'test' 位置,这意味着 nginx 反向代理正在按需要工作...

虽然如果我重命名为 nginx.conf 文件中的位置设置,我可能不需要这样做,但我通过阅读 Jetty 文档发现我可以更改 URL基于 war 的应用程序将在 Jetty 上 运行 通过重命名 Jetty 主页的 webapp 目录中的 war 文件。

我将 war 文件名从 xwiki 更改为测试并重新启动 Jetty 并在我的浏览器中加载我的 https://SITE-NAME/test...

嘿,我的网站现在在我的 https://SITE-NAME/test url...

上使用 HTTPS 通过 nginx 为来自 Jetty 的代理 Xwiki 应用程序提供服务

我已经更改了 war 文件的名称和 nginx 文件中的位置,以指向类似 https://SITE-NAME/test 的内容,它非常有用!

然后我更改了 nginx.conf 中的 https://EXTERNAL-REAL-IP/test 位置以使用 nginx LAN IP,以便 Nginx 可以在本地代理并且这仍然可以根据需要工作 - 所以,总而言之,快乐的日子.. .