응답 헤더 위치의 nginx proxy_pass 다시 쓰기


11

이 nginx 인스턴스의 목표는 GitLab 및 OpenWRT Luci가 리버스 프록시를 통해 리디렉션되도록하는 것입니다. 이미이 문제에 대응하는 것으로 보이는 기본 URL이있는 다른 여러 웹 사이트에서 작동하고 있습니다.

  • 이 예제의 GitLab은 포트 9000의 로컬 서버에 있습니다.
  • nginx 웹 사이트는 포트 8080에 있습니다.
  • OpenWRT는 똑같은 문제가 있지만 / cgi-bin / luci /

예제 위치에 대한 관련 nginx 구성은 다음과 같습니다.

location /gitlab/ {
    proxy_pass http://127.0.0.1:9000/;
    proxy_redirect default;
}
  • 결과는 슬래시가 있거나없는 것과 같습니다.

이 위치에 적용되는 일부 헤더 프록시 구성 옵션이 있습니다.

# Timeout if the real server is dead
proxy_next_upstream error timeout invalid_header http_500 http_502 http_503;

# Basic Proxy Config
proxy_set_header    Host $host:$server_port;
proxy_set_header    Origin $scheme://$host:$server_port;    
proxy_set_header    Connection $http_connection;
proxy_set_header    Cookie $http_cookie;
proxy_set_header    Upgrade $http_upgrade;
proxy_set_header    X-Forwarded-Protocol $scheme;
proxy_set_header    X-Scheme $scheme;
proxy_set_header    X-Real-IP $remote_addr;
proxy_set_header    X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header    X-Forwarded-Ssl on;
proxy_set_header    X-Frame-Options SAMEORIGIN;

# Advanced Proxy Config
send_timeout            5m;
proxy_read_timeout      300;
proxy_send_timeout      300;
proxy_connect_timeout   300;

proxy_buffers 32 4k;
proxy_buffer_size           4k;
proxy_busy_buffers_size     64k;
proxy_temp_file_write_size  64k;

proxy_http_version 1.1;
proxy_cache_bypass $cookie_session;
proxy_no_cache $cookie_session;]
  • #proxy_set_header Host를 주석 처리하면 대신 브라우저가 https://127.0.0.1:9000/users/sign_in

탐색 할 때 https://website.com:8080/gitlab/;

GET /gitlab/ HTTP/1.1
Host: website.com:8080

응답이 /users/sign_in대신에 잘못 되돌아갑니다./gitlab/users/sign_in

HTTP/1.1 302 Found
Cache-Control: no-cache
Connection: keep-alive
Content-Type: text/html; charset=utf-8
Location: https://website.com:8080/users/sign_in

https : // website : 8080 / gitlab / users / sign_in 으로 수동으로 탐색 하면 페이지가로드되지만 위와 동일한 문제가 발생할 때까지 자산이 없습니다.

GitLab 자산 실패

nginx docs를 읽으면 기본 프록시 동작 이이 시나리오를 처리해야하지만 실패한 것으로 보입니다.

로그가별로 표시되지 않는 것 같습니다.

왜 이런 일이 발생하는지 진단하는 데 도움이되는 추가 단계는 무엇입니까?

답변:


3

proxy_pass대상에 후행 슬래시를 추가하십시오 .

업데이트 : OP가 호스트가 수락하는 것을 정확하게하지 못했습니다 https. 스키마가 추가 헤더가있는 백엔드 서버로 전달 되면 https 대신 업스트림 응답으로 헤더를 다시 작성할 때 proxy_redirect default;nginx 가 기본적으로 http 스키마 를 예상하도록 지시 하므로 문제가 발생합니다 Location.

따라서 이것은보다 일반적인 형태로 명시 적으로 변경해야했습니다 (후행 슬래시는 여전히 필요합니다).

location /gitlab/ {
    proxy_pass http://127.0.0.1:9000/;
    proxy_redirect $scheme://$host:$server_port/ /gitlab/;
}

안녕하세요 Xavier, 답변 주셔서 감사합니다. 운이 없다. 그것은 내가 시도한 것 중 하나이지만 (proxy_pass 문서와 일치) 변경되지 않습니다 :(
Jake Edwards

다른 conf에있는 proxy_set_header에 대한 정보를 추가했습니다. 호스트 행을 제거하면 상황이 변경됩니다. 127.0.0.1:9000/users/sign_in으로
Jake Edwards

좋아, 문제는 http를 예상 scheme하는 proxy_redirect default동작을 가진 (https)입니다 . 호스트 헤더를 주석 처리하기 전에 구성을 그대로두고 proxy_redirect내용을로 변경하십시오 $scheme://$host:$server_port/ /gitlab/;. 테스트 할 때 브라우저 캐시 된 헤더에 닿지 않도록하십시오 (cli 도구 또는 개인용 탐색 사용).
Xavier Lucas

좋아, 멋지다. 이제 올바른 URL로 향한다. (적어도 GitLab은 OpenWRT가 여전히 / cgi-bin / luci로 간다.) 그러나 자산 / 이미지 / 등이없는 경우 : : 8080 / gitlab / assets / application-5ec1aeb4604cbfbeff836f956308b0ed.js 대신 : : 8080 / assets / application-5ec1aeb4604cbfbeff836f956308b0ed.js
Jake Edwards

1
@ShadowXVII Assets 링크는 응용 프로그램에서 생성되므로 여기에서 변경해야합니다. Nginx는 페이지 내용이 아닌 앱에서 발행 한 리디렉션 만 다시 작성합니다.
Xavier Lucas 1

0

@XavierLucas의 말에 따르면 뒷받침이 링크를 처리해야합니다. gitlab 문서는 상대 URL 아래 Install GitLab 이라는 제목 아래에 가이드를 제공합니다 . 최근에 gitlab과 nginx가 설치된 아치 리눅스 서버를 설정하는 동안이 문제가 발생했으며 올바른 상대 경로를 갖도록 모든 자산을 다시 컴파일하여 문제를 해결했습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.