nginx: 백엔드 https, Proxy_pass는 IP를 표시합니다.

nginx: 백엔드 https, Proxy_pass는 IP를 표시합니다.

포트 80(http)에서 수신 대기하는 역방향 프록시로 nginx를 사용하고 있습니다. 요청을 백엔드 http 및 https 서버로 전달하기 위해 Proxy_pass를 사용하고 있습니다. 내 http 서버에서는 모든 것이 잘 작동하지만 nginx 역방향 프록시를 통해 https 서버에 연결하려고 하면 https 서버의 IP가 클라이언트의 웹 브라우저에 표시됩니다. https 백엔드 서버의 IP 대신 nginx 서버의 uri가 표시되기를 원합니다(다시 한번 말하지만, 이것은 http 서버에서는 잘 작동하지만 https 서버에서는 작동하지 않습니다). 보다포럼에 있는 이 게시물

내 구성 파일은 다음과 같습니다.

server {
    listen 80;
    server_name domain1.com;
    access_log off;

    root /var/www;

if ($request_method !~ ^(GET|HEAD|POST)$ ) {
return 444;
}

location / {
    proxy_pass http://ipOfHttpServer:port/;
}
}

server {
    listen 80;
    server_name domain2.com;
    access_log off;

    root /var/www;

if ($request_method !~ ^(GET|HEAD|POST)$ ) {
return 444;
}

location / {
    proxy_pass http://ipOfHttpsServer:port/;
    proxy_set_header X_FORWARDED_PROTO https;
    #proxy_set_header Host $http_host;
}
}

"proxy_set_header Host $http_host" 지시문과 "proxy_set_header Host $host"를 시도하면 웹 페이지에 접근할 수 없습니다(페이지를 찾을 수 없음). 그런데 댓글을 달면 https 서버의 IP가 브라우저에 표시됩니다(이건 좋지 않습니다).

누구든지 아이디어가 있나요?

내 다른 구성 파일은 다음과 같습니다.

proxy_redirect          off;
proxy_set_header        Host            $host;
proxy_set_header        X-Real-IP       $remote_addr;
proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
#proxy_hide_header       X-Powered-By;
proxy_intercept_errors on;
proxy_buffering on;

proxy_cache_key "$scheme://$host$request_uri";
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=cache:10m inactive=7d max_size=700m;


user www-data;
worker_processes  2;
error_log  /var/log/nginx/error.log;
pid        /var/run/nginx.pid;
events {
    worker_connections  1024;
}
http {
 include                        /etc/nginx/mime.types;
 default_type                   application/octet-stream;
 access_log                     /var/log/nginx/access.log;
 server_names_hash_bucket_size  64;
 sendfile                       off;
 tcp_nopush                     on;
 #keepalive_timeout             0;
 keepalive_timeout              65;
 tcp_nodelay                    on;
 gzip                           on;
 gzip_comp_level                5;
 gzip_http_version              1.0;
 gzip_min_length                0;
 gzip_types                     text/plain text/html text/css image/x-icon application/x-javascript;
 gzip_vary                      on;
 include                        /etc/nginx/conf.d/*.conf;
 include                        /etc/nginx/sites-enabled/*;
}

당신의 도움을 주셔서 감사합니다 !


나는 귀하의 조언과 예를 따르고 캐시 지시어를 외부 서버 블록으로 이동하고 위치 블록 내부의 프록시 지시어를 이동했습니다. 여전히 똑같은 문제가 있습니다. proxy_set_header Host $host;작성하면 nginx를 통해 https 웹 사이트에 연결할 수 없습니다.

댓글을 달면 nginx를 통해 https 서버에 연결할 수 있지만, Proxy_pass 지시문과 Proxy_redirect off에도 불구하고 https 서버의 LAN IP 주소가 주소 표시줄에 표시됩니다. 그러나 http 서버에서는 여전히 작동합니다(http 서버 IP 대신 nginx의 IP가 표시됨).

한 가지 더 정확하게 말하자면, 로 이동하자마자 https 웹 페이지에 연결되지 않습니다 http://addressOfMyNginx/. 이전에는 인증서가 인증되지 않아 경고 페이지가 있었습니다. 이 페이지에서는 여전히 have http://addressOfMyNginx/주소 표시줄에 있습니다. 하지만 "어쨌든 웹사이트로 계속 이동" 링크를 따라가면 https 웹사이트로 리디렉션되고 https 서버의 IP 주소가 표시됩니다.

디버그 로그를 읽은 후 다음을 발견했습니다.

2012/07/30 17:24:13 [debug] 4412#0: *75 http proxy header:
"GET / HTTP/1.0^M
Host: nameOfMMyNginxServer^M
X-Real-IP: xxx.xxx.xxx.xxx^M
X-Forwarded-For: xxx.xxx.xxx.xxx^M
Connection: close^M
Accept: text/html, application/xhtml+xml, */*^M
Accept-Language: fr-FR^M
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)^M
Accept-Encoding: gzip, deflate^M
Cookie: a_cookie_which_has_nothing_to_do_with_my_nginx_and_mybackend_server^M

여기서 xxx.xxx.xxx.xxx는 nginx 또는 내 백엔드 서버와 아무 관련이 없는 서버의 공개 주소입니다(앞서 언급한 쿠키와도 관련이 없습니다).

이 쿠키와 관련이 있을 수 있는 서버를 테스트한 이후로 브라우저의 캐시와 nginx의 캐시를 다시 로드/다시 시작하고 지웠습니다. 하지만 xxx.xxx.xxx.xxx는 이 모든 것과 전혀 관련이 없습니다.


지난 게시물에 익명 계정으로 글을 올렸고, 브라우저 캐시도 삭제했기 때문에 댓글을 달 수 없습니다. 그래서 SF는 더 이상 나를 Vulpo로 인식하지 않았습니다... (그때 계정을 만들었습니다).

답변1

proxy_redirect off트릭을 수행해야합니다. proxy_pass백엔드에 SSL을 사용하려면 SSL을 사용하도록 변경해야 한다고 생각합니다 . 보안을 강화하고 빠른 연결을 유지하려면 Unix 소켓이 훨씬 낫습니다.


내가 추천하는 nginx.conf:

# /etc/nginx/nginx.conf

user www-data;
worker_processes 2; # Do you really have two CPU cores?
events {
  multi_accept        on;
  worker_connections  768;
  use                 epoll;
}
http {
  charset                         utf-8;
  client_body_timeout             65;
  client_header_timeout           65;
  client_max_body_size            10m;
  default_type                    application/octet-stream;
  index                           index.html index.php /index.php;
  keepalive_timeout               20;
  reset_timedout_connection       on;
  send_timeout                    65;
  sendfile                        on;
  server_names_hash_bucket_size   64;
  tcp_nodelay                     off;
  tcp_nopush                      on;
  gzip              on;
  gzip_buffers      32 4k;
  gzip_comp_level   2;
  gzip_disable      "msie6";
  gzip_http_version 1.1;
  gzip_min_length   1100;
  gzip_proxied      any;
  gzip_static       on;
  gzip_types
    #text/html is always compressed by HttpGzipModule
    text/css
    text/plain
    application/javascript
    application/x-javascript
    application/json
    application/x-json
    application/rss+xml
    application/xml
    application/vnd.ms-fontobject
    font/truetype
    font/opentype
    image/x-icon
    image/svg+xml;
  gzip_vary         on;
  include                        mime.types;
  include                        conf.d/*.conf;
  include                        sites-enabled/*;
}

내가 권장하는 가상 호스트 구성은 다음과 같습니다.

# /etc/nginx/sites-available/default.conf

proxy_cache_key "$scheme://$host$request_uri";
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=cache:10m inactive=7d max_size=700m;

server {
  listen 80;
  server_name example.com;
  access_log off;
  root /var/www;

  # Consider using a map for this! If is bad!
  if ($request_method !~ ^(GET|HEAD|POST)$ ) {
    return 444;
  }

  location / {
    proxy_redirect off;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwared-For $proxy_add_x_forwarded_for;
    proxy_intercept_errors on;
    proxy_buffering on;
    proxy_pass http://127.0.0.1:port$request_uri;
  }
}

더 고급 내용을 보려면 GitHub에서 내 nginx 구성을 살펴보세요(아직 완료되지 않았으므로 먼저 더 많은 설명을 작성해야 함).https://github.com/Fleshgrinder/nginx

관련 정보