从 nginx 代理到 Jetty

从 nginx 代理到 Jetty

我正在将请求从 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

如果我理解正确的话,您想使用locationnginx 中的一个块来代理多个域的请求。

在这种情况下,您可以按如下方式修改配置:

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 连接的来源。基于论坛帖子,您需要设置useForwardedForHeadertrue,并配置 nginx 以X-Forwarded-For使用以下配置设置标头:

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

相关内容