এসএসএল টার্মিনেশন লোড ব্যালেন্সার (হ্যাপ্রোক্সি) এর পিছনে যখন এনগিনেক্স ট্রাই_ফায়ালগুলি ভুল স্কিম ব্যবহার করে পুনঃনির্দেশ করে


8

আমার একটি এনগিনেক্স ১.6.২ সার্ভারটি লোড ব্যালান্সারের পিছনে ব্যাকেন্ড হিসাবে চলছে যা এসএসএল সমাপ্তি করে। ব্যাকএন্ড সার্ভারগুলিতে সমস্ত যোগাযোগ HTTP- র উপরে চলে over

কি চলছে এর চিত্র:

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

                      LOAD BALANCER                BACKENDS

পরীক্ষার উদ্দেশ্যে এই মুহূর্তে আমার কাছে কেবল একটি ব্যাকএন্ড রয়েছে। লোড ব্যালেন্সার HAProxy 1.5 চালায়, যার আমার কিছুটা নিয়ন্ত্রণ রয়েছে।

try_filesআমার serverব্লকটিতে ব্যাকএন্ড এনগিনেক্স কনফিগারেশনে একটি চমত্কার সাধারণ নির্দেশনা রয়েছে :

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

এখন, ডিফল্টরূপে, যখন আমি কোনও পিছনে স্ল্যাশ ছাড়াই কোনও ডিরেক্টরিতে অ্যাক্সেস করি, যেমন https://frontend/somedir, এনজিনেক্স একটি HTTP 301 পুনর্নির্দেশের মতো একটি নিখুঁত URL এ পাঠাতে চায় http://frontend:8000/somedir/

আমি nginx 8000 পোর্ট নম্বর ব্যবহার করে বাদ দিতে পারি port_in_redirect off

তবে আমি মনে করি না http://যে পুনর্নির্দেশের nginx উত্পাদিত হচ্ছে শুরুতে স্কিমটি সংশোধন করতে পারি । এনজিঙ্ক্সের জন্য আমি যেটা করতে পারি তা হ'ল কার্যকরভাবে এসএসএলকে সরিয়ে https://frontend/somedirদেওয়া থেকে পুনর্নির্দেশ করা http://frontend/somedir/!

লোড ব্যালেন্সার একটি X-Forwarded-Protoশিরোনাম প্রেরণ করছে তবে আমি nginx এর পুনর্নির্দেশের কারুকাজ করার সময় এটির সাথে পরামর্শ করার কোনও উপায় দেখতে পাচ্ছি না; প্রকৃতপক্ষে একটি 2012 এর উত্তর আছে যা বলছে এনজিনেক্স সরাসরি এই কাজটি করতে পারে না, এবং সমাধানটি হ'ল লোড ব্যালেন্সারকে এনজিনেক্সের সাথে প্রতিস্থাপন করা। আইএমএইচএও এই ধরনের কঠোর স্ট্যাক পরিবর্তনের জন্য ওয়ারেন্ট দেওয়ার পক্ষে খুব তুচ্ছ বিষয়।

২০১২ সাল থেকে এখানে কি কিছু পরিবর্তন হয়েছে? আমি এইচআইপিআরসি স্তরে এই পুনঃনির্দেশগুলি সত্যই আবার লিখতে চাই না: ওয়েব অ্যাপ্লিকেশন থেকে এইচটিটিপিএস-এ পুনঃনির্দেশগুলি সত্যিকারের ইচ্ছাকৃত এইচটিটিপিএস "পুনরায় এইচটিটিপিএসড" পেতে পারে যদি আমি কেবল সর্বদা Location:প্রতিক্রিয়া শিরোনামের জন্য এই স্কিমটি পুনরায় লিখি তবে অনুরোধটি দিয়ে করা হয়েছিল।

সম্পাদনা করুন:

এখানে একটি মিনিমাইজ করা কনফিগারেশন দেখানো হচ্ছে এনজিনেক্স পরম Location:ইউআরএল উত্পাদন করে । মনে রাখবেন কোনও পুনর্লিখন নেই।

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;
        }
    }
}

এবং যদি আপনি শিরোনামগুলি দেখতে কার্ল ব্যবহার করেন - নোট আমি 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

আমি কনফিগারটি যুক্ত করেছি, কেবল এই সমস্যাটি চিত্রিত করার জন্য ছাঁটা হয়েছে। আমি কোনও স্পষ্টতই পুনর্লিখন করি না।
মিট্রন

1
আপনার ভারসাম্যকারীকে Location:শিরোনামে প্রোটোকল প্রতিস্থাপনের জন্য কনফিগার করা উচিত কারণ এনজিনেক্সের আসল প্রোটোকলটি কী ছিল সে সম্পর্কে কোনও ধারণা নেই।
অ্যালেক্সি টেন

2
@ অ্যালেক্সেইটেন আপনি কি উত্তর হিসাবে পোস্ট করতে চান যাতে আমি এটি অনুমোদন করতে পারি? আমি এনজিনেক্সে এটি করার কোনও উপায় খুঁজে পাইনি, সুতরাং লোড ব্যালান্সারের কোনও পরিবর্তন আসলেই একমাত্র উপায় বলে মনে হয়।
মিট্রন

1
এটি এখনও সর্বশেষতম এনগিনএক্স রিলিজ সহ একটি বাগ! ইতিমধ্যে বাগ রিপোর্ট আছে কি কেউ জানেন? একটিও খুঁজে পেল না।
রোল ভ্যান ডুইজনহোভেন

উত্তর:



-1

আপনি পুনর্লিখন লোড ব্যালেন্সার বলতে চাই httpথেকে httpsতাই মত অনুরোধ মধ্যে:

proxy_redirect http:// $scheme://;
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.