我有两个正在运行的 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/