gpt4 book ai didi

java - Nginx 代理 : How do I configure nginx so that Jersey 2 (JAX-RS 2) still can interact with additional URL parts in it properly?

转载 作者:行者123 更新时间:2023-11-30 10:19:11 25 4
gpt4 key购买 nike

我正在尝试解决这个问题,但不幸的是我无法弄明白。

我在尝试什么?

我正在尝试将一个位置重定向到 Jersey 2 (JAX-RS 2) Web 应用程序,它可以像往常一样与请求交互,但不同的是,其中包含 url 的其他部分。Jersey 2 的 Java 应用程序在 tomcat docker 镜像上运行。


让我尝试这样更好地解释它:

这就是我所有请求的工作方式:

[IP-address]:8888/myJersey2App/something/function

最近我还添加了 SSL,以便我的服务器与 https 交互。

假设我网站的 url 是:

http://my.example.com

所以请求现在应该是这样的:

https://my.example.com/myJersey2App/something/function

Nginx 配置:

events{
}
http{
server{
listen 80;
listen [::]:80;
server_name my.example.com;
return 301 https://$server_name$request_uri;
}

server {
listen 443 ssl http2;
server_name my.example.com;

###
# ssl configuration ...
###

location / {
proxy_pass http://localhost:8888;
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-Proto $scheme;
}
}
}

这行得通,因为 Jersey 2 仍然获取 /myJersey2App/something/function 与代码中的路径相同。

Web.xml配置:

<servlet-mapping>
<servlet-name>Jersey Web Application</servlet-name>
<url-pattern>/myJersey2App/*</url-pattern>
</servlet-mapping>

这是 Jersey 2 如何与请求交互的示例:

@Path("something")
public class JavaClass {
@GET
@Path("/function")
@Produces(MediaType.TEXT_PLAIN)
public Response myFunction() {
return Response.ok().entity("MyFunction!").build();
}

我想要什么?

现在,我必须启动多个 docker,使用相同的应用程序,但使用不同的端口 url。

这就是请求的方式:

在端口 7777 上运行:

https://my.example.com/docker1/myJersey2App/something/function

在端口 8888 上运行:

https://my.example.com/docker2/myJersey2App/something/function

在端口 9999 上运行:

https://my.example.com/docker3/myJersey2App/something/function

其实是一样的,不同的是dockerX在URL中。

我认为 Nginx 配置应该是这样的:

...
server {
listen 443 ssl http2;
server_name my.example.com;

###
# ssl configuration ...
###

location /docker1 {
proxy_pass http://localhost:7777;
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-Proto $scheme;
}

location /docker2 {
proxy_pass http://localhost:8888;
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-Proto $scheme;
}

location /docker3 {
proxy_pass http://localhost:9999;
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-Proto $scheme;
}
}
...

不幸的是,我的 Jersey2 应用程序将不再识别该 url,因为 dockerX 在 url 内,当然,因为 dockerX 没有在代码中提及(这不应该被提及!)


是否可以配置 Nginx,以便我的 Jersey 应用程序仍然可以识别它,即使 url 看起来像这样:

https://my.example.com/docker1/abc/def/ghi/myJersey2App/something/function

我的 Jersey 应用程序应该仍然认识到它只需要以 /myJersey2App/ 开头

我在想类似“用户仍然看到 dockerX URL,但在后台它被这样对待:

http://localhost:8888/myJersey2App/something/function

因此,用户会看到:

https://my.example.com/docker2/myJersey2App/something/function

但是背后是这样处理的:

http://localhost:8888/myJersey2App/something/function

是否可以配置 Nginx,使其像这样工作?

我希望你能帮我解决这个问题。

最佳答案

我自己想出来的。

nginx 配置应该是这样的:

...
location /docker1 {

rewrite /docker1/(.*) /$1 break;

proxy_pass http://localhost:7777;
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-Proto $scheme;
}

location /docker2 {

rewrite /docker2/(.*) /$1 break;

proxy_pass http://localhost:8888;
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-Proto $scheme;
}

location /docker3 {

rewrite /docker3/(.*) /$1 break;

proxy_pass http://localhost:9999;
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-Proto $scheme;
}
...

当你发出请求时,你仍然会看到 dockerX 部分,但在它后面被视为好像 dockerX 部分不存在,因为重写删除了这部分。并且 Jersey Java 应用程序可以正常工作,而无需更改实际的 Jersey 2 应用程序。

关于java - Nginx 代理 : How do I configure nginx so that Jersey 2 (JAX-RS 2) still can interact with additional URL parts in it properly?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48791759/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com