我正在将请求从 nginx 代理到 Jetty,但 Jetty 收到的请求有问题。Jetty 请求显示请求 IP 地址是 127.0.0.1。但我想要真实的服务器 IP,而且我的网站有多个域,所以当请求从某个域名发送到我的服务器时,它也必须在 Jetty 请求中可用。
nginx配置:
server {
listen 80; ## listen for ipv4
listen [::]:80 default ipv6only=on; ## listen for ipv6
server_name localhost;
access_log /var/log/nginx/localhost.access.log;
location / {
proxy_pass http://127.0.0.1:8080;
proxy_set_header X-Real-IP $remote_addr;
}
}
Servlet 请求:
Dump Servlet
getMethod: GET
getContentLength: -1
getContentType: null
getRequestURI: /dump/info
getRequestURL: http://127.0.0.1:8080/dump/info
getContextPath:
getServletPath: /dump
getPathInfo: /info
getPathTranslated: /tmp/jetty-0.0.0.0-8080-test.war-_-any-/webapp/info
getQueryString: null
getProtocol: HTTP/1.0
getScheme: http
getServerName: 127.0.0.1
getServerPort: 8080
getLocalName: 127.0.0.1
getLocalAddr: 127.0.0.1
getLocalPort: 8080
getRemoteUser: null
getUserPrincipal: null
getRemoteAddr: 127.0.0.1
getRemoteHost: 127.0.0.1
getRemotePort: 50905
getRequestedSessionId: 6ubs42zhm5q61k5hm84ni3ib
isSecure(): false
isUserInRole(admin): false
getLocale: en_US
getLocales: en_US
getLocales: en
答案1
如果我理解正确的话,您想使用location
nginx 中的一个块来代理多个域的请求。
在这种情况下,您可以按如下方式修改配置:
location / {
proxy_pass http://127.0.0.1:8080;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $http_host;
}
将主机头从源请求复制到代理请求,并允许后端服务器使用虚拟主机。
答案2
您需要让 Jetty 查看 nginx 设置的标头来确定客户端 IP,而不是 IP 连接的来源。基于这论坛帖子,您需要设置useForwardedForHeader
为true
,并配置 nginx 以X-Forwarded-For
使用以下配置设置标头:
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;