
Request.RemoteAddr
표준을 사용하여 요청 IP 주소를 확인하는 간단한 go 서비스가 있습니다.넷/http 패키지.
이 go 서비스는 다음과 같은 간단한 위치 구성을 사용하여 nginx 뒤에 배포됩니다.
location /api {
proxy_pass http://localhost:8080;
}
분명히 애플리케이션이 프록시 뒤에 배포되면 Request.RemoteAddr
이제 로컬 호스트/서버 주소(예: ::1
) 를 반환합니다.
나는 다음과 같이 정의할 수 있다는 것을 알고 있습니다.
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
하지만 그렇게 하려면 go 서비스에서도 수정이 필요합니다(해당 헤더가 클라이언트에 의해 수정될 수 있기 때문에 서비스가 독립 실행형 서버로 배포되는 경우 몇 가지 추가 보안 검사도 필요합니다).
요청 원격 주소를 go 서비스에 전달하여 에서 반환할 수 있는 방법이 있습니까 Request.RemoteAddr
?
참고 사항: 예를 들어 이 경우 fastcgi를 사용하는 PHP에서는 다음과 같은 작업을 수행할 수 있습니다.
fastcgi_param REMOTE_ADDR $remote_address;
답변1
웹 서버에 대한 올바른 구성 변경을 제안했습니다. 이러한 헤더는 언어에 관계없이 실제 IP 주소가 일반적으로 웹 서버에서 앱 서버로 전달되는 방식입니다. server
또는 차단 에 추가해야 합니다 location
.
그런 다음 Go에서 이 데이터를 수신하려면 다음과 같은 미들웨어를 사용할 수 있습니다.프록시헤더gorilla/handlers에서 해당 헤더 중 하나의 IP 주소를 Request.RemoteAddr
. 다른 접근 방식을 사용할 수도 있지만 프로그래밍 관련 질문은 스택 오버플로에서 질문해야 합니다.
답변2
관련 Go 라이브러리는 오픈 소스이기 때문에 아니오, 쉽게 사용자 정의할 가능성이 없다는 것을 확인하는 것은 매우 간단했습니다 Request.RemoteAddr
.
nginx를 제거하고 example.com/api 대신 api.example.com(프록시되지 않은 별도의 공용 IP 주소) 아래에 go 서비스를 넣을 수 있습니다.