SSL 종료로드 밸런서 (haproxy) 뒤에서 잘못된 구성표를 사용하여 nginx try_files 리디렉션


8

SSL 종료를 수행하는로드 밸런서 뒤의 백엔드로 실행중인 nginx 1.6.2 서버가 있습니다. 백엔드 서버와의 모든 통신은 HTTP를 통해 이루어집니다.

무슨 일이 일어나고 있는지 다이어그램 :

          /--http---> frontend:80  --\
client --+                            +--http---> backend:8000
          \--https--> frontend:443 --/

                      LOAD BALANCER                BACKENDS

테스트 목적으로 현재 하나의 백엔드 만 있습니다. 로드 밸런서는 HAProxy 1.5를 실행하며 제어 할 수 있습니다.

백엔드 nginx 구성의 블록에 매우 일반적인 try_files지시문이 있습니다 server.

server {
    server_name frontend;
    ...
    try_files $uri $uri/ =404;
    ...
}

이제 기본적으로 슬래시없이 디렉토리에 액세스하면 예를 들어 https://frontend/somedirnginx는 HTTP 301 리디렉션을와 같은 절대 URL로 보내려고합니다 http://frontend:8000/somedir/.

nginx가을 사용하여 8000 포트 번호를 생략하도록 만들 수 있습니다 port_in_redirect off.

그러나 http://nginx가 생성하는 리디렉션의 시작 부분에서 구성표 를 수정할 수없는 것 같습니다 . 내가 할 nginx를 얻을 수있는 최선의 리디렉션 인 https://frontend/somedirhttp://frontend/somedir/효과적으로 제거 SSL!

로드 밸런서는 X-Forwarded-Proto헤더를 보내고 있지만 리디렉션을 만들 때 nginx가 헤더를 참조 할 방법이 없습니다. 실제로 nginx가이를 수행 할 수 없다는 2012 년 답변 이 있으며, 해결책은로드 밸런서를 nginx로 교체하는 것입니다. IMHO 이것은 과감한 스택 변경을 보증하기에는 너무 사소한 것입니다.

2012 년 이후 여기에서 변경된 것이 있습니까? HAProxy 수준에서 이러한 리디렉션을 다시 작성하고 싶지 않습니다. Location:응답 헤더에 대한 구성표를 구성표와 동일하게 항상 다시 쓰면 웹 응용 프로그램의 실제 의도적 HTTPS-HTTP 리디렉션이 "재 HTTPS" 로 표시 될 수 있습니다. 요청이 이루어졌습니다.

편집하다:

다음은 nginx가 절대 Location:URL을 생성 함을 보여주는 최소화 된 구성 입니다. 다시 쓰기가 없습니다.

user nobody nobody;
worker_processes auto;
worker_rlimit_nofile 4096;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;

events {
    worker_connections 1024;
    multi_accept on;
}

http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile on;
    tcp_nopush on;
    tcp_nodelay on;

    # TODO: Tune fastcgi_buffers/other buffers

    # Configure keepalive connections
    keepalive_timeout 15;
    keepalive_requests 1000;

    # Hide server version.
    server_tokens off;

    # Do not allow any directory indexes anywhere.
    # This is the default, but it is here for extra paranoia.
    autoindex off;

    # gzip text content.
    gzip on;
    gzip_vary on;
    gzip_disable "msie6";
    gzip_comp_level 2;
    gzip_min_length 1024;
    gzip_types  text/css
                text/plain
                text/xml
                application/json
                application/javascript;

    server {
        listen 8000 default_server;

        root /usr/share/nginx/html;
        index index.html index.htm;

        server_name localhost;

        location / {
            try_files $uri $uri/ =404;
        }
    }
}

curl을 사용하여 헤더를 보는 경우- testdir아래 에 디렉토리를 만들었습니다 /usr/share/nginx/html.

[myuser@dev nginx]$ curl -i http://localhost:8000/testdir
HTTP/1.1 301 Moved Permanently
Server: nginx
Date: Thu, 26 Mar 2015 14:35:49 GMT
Content-Type: text/html
Content-Length: 178
Location: http://localhost:8000/testdir/
Connection: keep-alive

<html>
<head><title>301 Moved Permanently</title></head>
<body bgcolor="white">
<center><h1>301 Moved Permanently</h1></center>
<hr><center>nginx</center>
</body>
</html>

nginx wants to send an HTTP 301 redirect to an absolute URL-nginx는 명시적인 재 작성 규칙이 없다면 그렇게하지 않습니다-전체 설정을 보여주세요.
AD7six

구성을 추가 하고이 문제를 설명하기 위해 정리했습니다. 명시 적 재 작성을 수행하지 않습니다.
mutron

1
Location:nginx는 원래 프로토콜이 무엇인지 알지 못하므로 헤더의 프로토콜을 대체하도록 밸런서를 구성해야 합니다.
Alexey Ten

2
@AlexeyTen 승인 할 수 있도록 답변으로 게시 하시겠습니까? nginx 에서도이 작업을 수행하는 방법을 찾지 못했기 때문에로드 밸런서의 변경이 실제로 유일한 방법 인 것처럼 보입니다.
mutron

1
이것은 여전히 ​​최신 nginX 릴리스의 버그입니다! 이미 버그 리포트가 있는지 아는 사람이 있습니까? 찾을 수 없습니다.
Roel van Duijnhoven

답변:



-1

다음 과 같이 요청에서 다시 쓰 http도록 로드 밸런서에 지시해야합니다 https.

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