لا يتم إرسال REMOTE_ADDR إلى Django باستخدام nginx & tornado

StackOverflow https://stackoverflow.com/questions/1627901

  •  06-07-2019
  •  | 
  •  

سؤال

لذلك حصلت على إعداد بسيط باستخدام nginx للوسائط الثابتة وموازنة التحميل والإعصار كخادم ويب لـ Django (4 خوادم قيد التشغيل).مشكلتي هي عدم انتقال Remote_addr إلى Django لذلك أتلقى خطأ KeyError:

article.ip = request.META['REMOTE_ADDR']

يتم إرسال العنوان البعيد عبر X-Real-IP (HTTP_X_REAL_IP) بفضل nginx.conf:

    location / {
        proxy_pass_header Server;
        proxy_set_header Host $http_host;
        proxy_redirect false;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Scheme $scheme;
        proxy_pass http://frontends;
    }

نظرًا لأن HTTP مُلحق مسبقًا بمفتاح META، فلا يمكنني فقط إجراء proxy_set_header Remote_addr $remote_addr.ما يمكنني فعله هو قراءة X-Real-IP إذا لم يتم العثور على مفتاح عنوان بعيد ولكنني أشعر بالفضول لمعرفة ما إذا كان هناك حل أكثر ذكاءً.

شكرًا!

هل كانت مفيدة؟

المحلول

جرب هذه:

location / {
    proxy_pass http://frontends;
    proxy_pass_header Server;
    proxy_redirect off;
    proxy_set_header Host $http_host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Scheme $scheme;
    proxy_set_header REMOTE_ADDR $remote_addr;
}

فقط اضف proxy_set_header REMOTE_ADDR وينبغي أن تعمل بشكل جيد.

حاولت مع:

  • جانغو 1.5.4
  • نجينكس 1.4.3
  • تورنادو 2.2.1

نصائح أخرى

وهنا هو كيف تحل هذه المشكلة. باستخدام هذه الوسيطة:

class SetRemoteAddrMiddleware(object):
    def process_request(self, request):
        if not request.META.has_key('REMOTE_ADDR'):
            try:
                request.META['REMOTE_ADDR'] = request.META['HTTP_X_REAL_IP']
            except:
                request.META['REMOTE_ADDR'] = '1.1.1.1' # This will place a valid IP in REMOTE_ADDR but this shouldn't happen

وعلى أمل أن يساعد!

ولدي الإعداد مماثلة. بعد وضع إنجن إكس أمام اباتشي، لاحظت أن IP في سجلات اباتشي كان دائما 127.0.0.1. تثبيت "libapache2 وزارة الدفاع-rpaf" بدا لإصلاحه. ليس لدي فكرة إذا كانت المشكلة هي ذات الصلة.

أضف "fastcgi_param remote_addr $ remote_addr ؛" إلى ملف nginx.conf:

    location / {
    # host and port to fastcgi server
    fastcgi_pass 127.0.0.1:8801;
    fastcgi_param PATH_INFO $fastcgi_script_name;
    fastcgi_param REQUEST_METHOD $request_method;
    fastcgi_param QUERY_STRING $query_string;
    fastcgi_param CONTENT_TYPE $content_type;
    fastcgi_param CONTENT_LENGTH $content_length;
    fastcgi_pass_header Authorization;
    fastcgi_intercept_errors off;
    ...
    # Add this line!
    fastcgi_param REMOTE_ADDR $remote_addr;
    ...
}

مصدر: كيفية عمل خوادم nginx الافتراضية + fcgi لـ django؟

وبالنسبة لي، وذلك باستخدام ما يلي عملوا:

server {
    listen 80;
    server_name foo.bar.com;
    location / {
        proxy_pass http://127.0.0.1:8000;
        proxy_set_header X-Forwarded-For $remote_addr;
    }
}

وهذا يعمل مع جانغو 1.4 (على وجه التحديد، localshop).

لا، انها لا ممكن لتمرير REMOTE_ADDR. وبالتالي فإن الحل الوحيد الذي أعرفه هو استخدام X-ريال مدريد-IP أو إعادة توجيهها X-لوتأكد من أن الخلفية يعالج هذه بشكل صحيح.

وتحرير: وهذا ينطبق على fastcgi_pass، وليس العادية إنجن إكس proxy_pass

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top