programing

Apache 프록시 뒤에 내장된 Tomcat을 사용한 Spring Boot

iphone6s 2023. 2. 26. 09:18
반응형

Apache 프록시 뒤에 내장된 Tomcat을 사용한 Spring Boot

Apache SSL 프록시 뒤에 있는 전용 앱 서버에 내장된 Tomcat이 있는 Spring Boot(Spring MVC) 앱이 있습니다.

프록시 서버의 SSL 포트는 4433이며 앱 서버의 포트 8080으로 전송됩니다.

따라서 프록시 서버에 대한 URL은 다음과 같이 전송됩니다.

https://proxyserver:4433/appname   >>forward>>   http://appserver:8080/

하지 않고 할 때 가장 은 '프록시입니다.
스프링 시큐리티

http://appserver:8080/   >>redirect>>   http://appserver:8080/login

폼을 하려면 , 「」를 해 주세요.WebSecurityConfigurerAdapter 함께

  ...
  httpSecurity.formLogin().loginPage("/login") ...
  ...

없이도 .
따라서 Spring은 대신 다음과 같이 대응하는 프록시 URL로 리다이렉트해야 합니다.

http://appserver:8080/   >>redirect>>   https://proxyserver:4433/appname/login

아직 성공하지 못했습니다.

이 솔루션을 적용하려고 합니다.59.8 프런트 엔드 프록시 서버 뒤에서 Tomcat 사용

Apache에서 mod_filename(모드)를 설정하고, 예상되는 헤더를 송신하고 있는 것을 확인했습니다.

X-Forwarded-For: xxx.xxx.xxx.xxx
X-Forwarded-Host: proxyserver
X-Forwarded-Port: 4433
X-Forwarded-Proto: https

애플리케이션은 다음 파라미터로 시작됩니다.

export ARG1='-Dserver.tomcat.protocol-header=x-forwarded-proto' 
export ARG2='-Dserver.tomcat.remote-ip-header=x-forwarded-for'
java $ARG1 $ARG2 -jar webapp.jar

그래도 리다이렉트는 기능하지 않는다.

계속 .http://appserver:8080/login클라이언트는 사용할 수 없습니다.

이 시나리오가 작동하기 위해 우리가 해야 할 다른 일이 있나요?


갱신하다

또, 프록시 URL 의 「/appname」부분이 신경이 쓰이고 있습니다.앱 서버상의 어플리케이션은 「/」에 루트 되어 있습니다.프록시를 통과할 때 클라이언트에 반환되는 모든 URL에 "/appname"을 포함하도록 스프링에 지시하는 방법은 무엇입니까?

요전에도 같은 문제가 있었습니다.Spring Boot 1.3 디버깅 후 다음 해결 방법을 찾았습니다.

1. Apache 프록시에 헤더를 설정해야 합니다.

<VirtualHost *:443>
    ServerName www.myapp.org
    ProxyPass / http://127.0.0.1:8080/
    RequestHeader set X-Forwarded-Proto https
    RequestHeader set X-Forwarded-Port 443
    ProxyPreserveHost On
    ... (SSL directives omitted for readability)
</VirtualHost>

2. Spring Boot 앱에 이러한 헤더를 사용하도록 지시해야 합니다.따라서 application.properties(또는 Spring Boots가 속성을 인식하는 다른 장소)에 다음 행을 입력합니다.

server.use-forward-headers=true

이 두 가지 작업을 올바르게 수행하면 응용 프로그램이 전송하는 모든 리다이렉트는 http://debug.0.1:8080/[path]로 이동하지 않고 자동으로 https://www.myapp.com/[path]로 이동합니다.

업데이트 1 토픽에 관한 메뉴얼은,적어도 속성을 인식하려면 읽어야 합니다.server.tomcat.internal-proxies신뢰할 수 있는 프록시 서버의 IP 주소 범위를 정의합니다.

업데이트 2021 문서가 여기로 이동되었습니다.Spring Boot 설정은 조금 다릅니다.

정상으로 , 「」는 되지 않는 것 .RemoteIpValve「」. 「」의 .RemoteIpValve에는 (보안 체크로서) 프록시 IP 주소의 패턴 일치가 포함되어 있어 유효한 프록시로부터의 것으로 생각되는 요구만을 변경합니다.으로 Spring Boot " " " " " " " " " " " " " " IP " " " " " " 등의 기존 됩니다.10.*.*.* ★★★★★★★★★★★★★★★★★」192.168.*.*프록시 중 하나가 아닌 경우 명시적으로 구성해야 합니다.

server.tomcat.internal-proxies=172\\.17\\.\\d{1,3}\\.\\d{1,3}|127\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}

(프로퍼티 파일 형식을 사용하여 백슬래시를 이중 이스케이프해야 합니다).

있는지 알 수요.RemoteIpValve설설 if 를 설정하면

logging.level.org.apache.catalina.valves.RemoteIpValve=DEBUG

브레이크 포인트를 설정할 수도 있습니다.

이 문제의 일반적인 해결책은 필요한 개서를 프록시가 처리하도록 하는 것입니다.예를 들어 Apache에서는 rewrite_moduleheaders_module을 사용하여 헤더를 수정할 수 있습니다.또 다른 예로 Nginx는 업스트림서버 설정 후 이 케이스 및 기타 유사한 케이스를 자동으로 처리합니다.

코멘트에 대한 응답:

remote_ip_header 및 protocol_header 스프링 부트 구성 값은 어떻게 됩니까?

스프링 부츠는 잠시 잊읍시다.임베디드 서블릿컨테이너인 Tomcat에는 RemoteIpValve라고 불리는 밸브가 있습니다.이 밸브는 Apache remotip_module 포트입니다.이 밸브의 주요 목적은 "허가 및 로깅"을 위해 "요구를 시작한 사용자 에이전트"를 "원래 사용자 에이전트"로 취급하는 것입니다.이 밸브를 사용하려면 밸브를 구성해야 합니다.

밸브에 대한 자세한 내용은 여기를 참조하십시오.

Spring Boot에서는 server.tomcat.remote_ip_header 및 server.tomcat.protocol_header 속성을 통해 application.protocol_header 속성을 통해 이 밸브를 쉽게 구성할 수 있습니다.

Haproxy를 로드 밸런서로 사용하는 경우와 동일한 경우가 있었는데, 이는 저에게 매우 걱정스러운 일이었습니다. IP가 에 있다는 것입니다.request.getRemoteAddr() in in "X-Forwarded-For"

frontend www
  bind *:80
  bind *:443 ssl crt crt_path
  redirect scheme https if !{ ssl_fc }
  mode http
  default_backend servers

backend servers
  mode http
  balance roundrobin
  option forwardfor
  server S1 host1:port1 check
  server S2 host2:port2 check
  http-request set-header X-Forwarded-Port %[dst_port]
  http-request add-header X-Forwarded-Proto https if { ssl_fc }

application.properties:

 server.use-forward-headers=true

이와 관련하여 구성할 수 있는 속성이 몇 가지 있습니다. application.yaml§:

server:
  forward-headers-strategy: native
  tomcat:
    use-relative-redirects: true
    protocol-header: x-forwarded-proto
    remote-ip-header: x-forwarded-for

★★server.forward-headers-strategy: native된 '비호감'의입니다.server.use-forward-headers:true

설정해 보셨습니까?

  server.context-path=/appname

스프링 부츠로요?

https://proxyserver:4433/appname>>forward>http://appserver:8080/appname과 같은 개서 규칙을 설정합니다.

그런 다음 응용 프로그램 컨텍스트를 "appname" server.disp-path=/appname으로 설정합니다.

따라서 로컬에서 http://appserver:8080/appname을 사용하여 실행할 수 있으며 리버스 프록시를 통해 https://proxyserver:4433/appname을 통해 액세스할 수 있습니다.

JBOSS를 사용하고 있기 때문에 jboss의 standalone.xm에서 변경된 내용은 다음과 같습니다.

<http-listener name="default" socket-binding="http" redirect-socket="https" proxy-address-forwarding="true" enable-http2="true"/>

Tomcat은 프록시 전달 주소를 준수하도록 Tomcat(syslog-address-forwarding="true")에 알리기 위해 유사한 구성을 가집니다.

server.use-forward-headers=true나한테는 통하지 않아, 이상한 문제를 겪었어X-Forwarded-For헤더가 에 입력되지 않았습니다.HttpServletRequest일관되게

결국 사용되었습니다.ForwardedHeaderFilter: https://stackoverflow.com/a/51500554/986942.

또한 로드 밸런서(프록시)가 다음 헤더를 올바르게 제공하는지 확인합니다.

proxy_set_header Host $host;
proxy_set_header X-Forwarded-Proto https;

언급URL : https://stackoverflow.com/questions/25455969/spring-boot-with-embedded-tomcat-behind-apache-proxy

반응형