java - 通过链接的 docker 容器将正确的 ip 从 nginx 传递到 jetty

标签 java servlets nginx docker jetty

我有两个正在运行的 docker 容器,一个是 nginx,它接受 http 和 https 请求并将它们传递给另一个是 jetty 容器。 自从我切换到 docker 后,我注意到一个问题。我无法获得正确的请求IP。 jetty 应用程序检查请求 IP 以确保请求来自特定服务器。在 Servlet 中,我使用以下代码来获取 IP:

protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    ...
    String remoteIpAddress = request.getRemoteAddr();
    ...
}

但是我随后得到了 IP 172.17.0.x,这似乎是来自 docker 的某个 IP,而不是来自请求者的预期 IP。

我的 Docker 镜像使用以下参数运行:

docker run -d --read-only --name=jetty -v /tmp -v /run/jetty jetty:9
docker run -d --read-only --name=nginx --link jetty:jetty -v /var/run -p 80:80 -p 443:443 nginx

重要的部分是 --link 参数,我在其中将 jetty 的网络链接到 nginx。

在 nginx 配置中,我定义了一个到 jetty 的代理传递:

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

location / {
    proxy_pass http://jetty:8080;
}

我的问题是:如何从请求中获取正确的 IP,而不是 127.17.0.x?

最佳答案

对于使用默认 Docker Jetty image 的人来说,接受的答案似乎相当奇怪,我们不应该像这样手动更改或取消注释。

以下是获取对我有用的 Docker 镜像的方法:

FROM jetty:9.4-jre11
COPY checkout/my-app/target/v.war /var/lib/jetty/webapps/v.war
RUN java -jar /usr/local/jetty/start.jar --create-startd --add-to-start=http-forwarded

文件/usr/local/jetty/etc/jetty-http-forwarded.xml,它将org.eclipse.jetty.server.ForwardedRequestCustomizer添加到配置,将自动添加到 jetty.start 中。

关于java - 通过链接的 docker 容器将正确的 ip 从 nginx 传递到 jetty,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34729849/

相关文章:

Java Signature 无法跨平台验证

java - 模拟抛出空指针异常。新来的模拟

java - Servlet 中的 iText PDF

java - 在 ZK 中获取 Servlet 输出流

java - Firebase 数据库值未保存

java - 在使用 Vector 之前我必须对其执行 setSize() 吗?

java - 如何向业务逻辑发送请求参数

NGINX:在 access_log 中混淆密码

ssl - NGINX:基于具有不同端口的本地主机上多个应用程序路径的 ssl 代理

node.js - 使用 Express 显示图像,而不是下载它