2009-10-26 20 views
9

Bu yüzden nginx ile statik medya ve django için web sunucusu olarak yük dengeleme ve tornado ile basit bir kurulum yaptım (4 sunucu çalışıyor). Uzaktan adres X-Gerçek IP (HTTP_X_REAL_IP) nginx.conf sayesinde olarak gönderilen oluyorREMOTE_ADDR nginx & tornado kullanarak Django'ya gönderilmiyor

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

: Benim sorunum REMOTE_ADDR yüzden bir KeyError alıyorum django aktarılır almıyor: HTTP gibi

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

sadece proxy_set_header REMOTE_ADDR $ REMOTE_ADDR yapamaz META tuşu başına eklenir. Yapabileceğim şey, uzak bir addr anahtarının bulunmaması durumunda X-Real-IP'yi okumaktır, ancak daha akıllı bir çözüm varsa merak ediyorum.

Teşekkürler!

+0

Hiçbir doğru çözüm, ama döndü bir Django ortakatmanını ekledi:

ile çalıştı HTTP_X_REAL_IP REMOTE_ADDR'ye. – Nixarn

+0

Bu ifadeler size yardımcı olacaktır: proxy_redirect off; proxy_set_header X-Real-IP $ remote_addr; \t \t proxy_set_header X-Forwarded-For $ proxy_add_x_forwarded_for; \t \t proxy_set_header X-Scheme $ scheme; – glarrain

cevap

11

bu bir deneyin:

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

Sadece proxy_set_header REMOTE_ADDR eklemek ve iyi iş olmalıdır. 1.5.4

  • Nginx 1.4.3

    • Django
    • Tornado 2.2.1
  • +0

    göre bu: https: Arka uçtaki-nginx conf içine //easyengine.io/tutorials/nginx/forwarding-visitors-real-ip/ : konum ~ \ .php $ { fastcgi_param REMOTE_ADDR $ http_x_real_ip; # ... diğer kurallar } – Amini

    5

    Benzer bir kurulumum var. Nginx'i apache'nin önüne yerleştirdikten sonra apache loglarındaki IP'nin her zaman 127.0.0.1 olduğunu fark ettim. "Libapache2-mod-rpaf" nin yüklenmesi, düzeltmek için görünüyordu. Problemin ilişkiliyse hiçbir fikrim yok.

    +0

    Ah teşekkürler, ama bu proje için apache kullanmıyorum. – Nixarn

    +0

    oops, elbette, bu konuda üzgünüm – asciitaxi

    +0

    Cevabınız için teşekkürler. BTW: Bu, aynı zamanda gerçek uzak IP'yi de içeren $ _SERVER ['REMOTE_ADDR'] 'ye dayanan PHP yazılımlarına da yardımcı oluyor. – Leif

    0

    Hayır, remote_addr adresinden geçmek not possible değil. Bu yüzden bildiğim tek çözüm, X-Real-IP veya X-Forwarded-For kullanmak ve arka ucun bunları doğru bir şekilde işlediğinden emin olmaktır.

    Düzenleme: Bu

    +0

    Mümkün değil mi? @ Juande'in çözümü benim için gayet iyi çalışıyor. –

    +0

    Bir fastcgi işleyicisine, evet. Ama soru bir nginx vekiliydi. – windyjonas

    +1

    Whoops, daha yakın okumalıydım - "proxy_pass", "fastcgi_pass" değil. Görünüşe göre cevabınızı düzenlemediğiniz sürece redeme başlayamıyorum. :/Eğer düzenleyecekseniz, yerine yenisini yapmaktan mutluluk duyarım. –

    14

    Burada problemi nasıl çözdüğünü değil düzenli nginx proxy_pass, fastcgi_pass için de geçerlidir. Bu aracı kullanarak: Bu yardımcı olur umarım!

    +2

    Tek sorun şu ki, hatayı sessizce bırakırsanız, yanlış yazılmış web sunucusunu çok daha sonra keşfedeceksiniz (potansiyel olarak kaybedilen bilgiler veya oturum açamayan kullanıcılar). Benim önerim başarısızlık veya en azından hatayı günlüğe kaydetmek olurdu. –

    +2

    Neredeyse her zaman, CPython 2.x'te istisna türü olmadan denemek/istisnasız yapmak istemezsiniz, çünkü SystemExit, KeyboardInterrupt ve GeneratorExit'i de yakalayacaktır - bunlar tek başına ya da Nadir durumlarda, onları ayrı ayrı yakalayın. Özellikle bu durumda, KeyError yakalamalısınız. Ancak daha sonra tüm bu kodu daha da kolaylaştırabilirsiniz: 'request.META.setdefault ('REMOTE_ADDR', request.META.get ('HTTP_X_REAL_IP', '1.1.1.1')) – temoto

    +0

    Güzel çözüm ancak aklınızda bulundurun.() Python 3.x'te kaldırılmıştır. Kullanın: istek değilse.META.get ('REMOTE_ADDR', Yok): – Robert

    5

    Ekle "fastcgi_param REMOTE_ADDR $ remote_addr;" nginx.conf dosyasına:

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

    Kaynak: çalışmış aşağıdaki kullanarak Benim için how to nginx virtual servers + fcgi for django?

    +0

    Bu, fastcgi_pass için harika çalışıyor (teşekkürler!), Ancak OP'nin kurulumu olan 'proxy_pass' için çalışmaz (bkz. @windyjonas 'cevabı. –

    +1

    Nasıl hakkında - 'fastcgi_param REMOTE_ADDR $ http_x_real_ip;'? X-Real-IP nginx için mevcutsa, fastcgi_param olarak geçmek için kullanılabilir. Bu, uygulama kaynak kodlarında değişiklik yapma ihtiyacını ortadan kaldıracaktır. – rahul286

    2

    :

    Bu django 1.4 (özellikle localshop) ile çalışır
    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; 
        } 
    } 
    

    .