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/somedir
nginx는 HTTP 301 리디렉션을와 같은 절대 URL로 보내려고합니다 http://frontend:8000/somedir/
.
nginx가을 사용하여 8000 포트 번호를 생략하도록 만들 수 있습니다 port_in_redirect off
.
그러나 http://
nginx가 생성하는 리디렉션의 시작 부분에서 구성표 를 수정할 수없는 것 같습니다 . 내가 할 nginx를 얻을 수있는 최선의 리디렉션 인 https://frontend/somedir
을 http://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>
Location:
nginx는 원래 프로토콜이 무엇인지 알지 못하므로 헤더의 프로토콜을 대체하도록 밸런서를 구성해야 합니다.
nginx wants to send an HTTP 301 redirect to an absolute URL
-nginx는 명시적인 재 작성 규칙이 없다면 그렇게하지 않습니다-전체 설정을 보여주세요.