質問

だから、静的メディアと負荷分散のためのnginxと、djangoのWebサーバーとしての竜巻(4台のサーバーが実行されている)を使用した簡単なセットアップができました。私の問題は、remote_addrがdjangoに渡されないため、KeyErrorが発生することです:

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

nginx.confのおかげで、リモートアドレスはX-Real-IP(HTTP_X_REAL_IP)として送信されます:

    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 を追加するだけで、うまく機能するはずです。

試した:

  • Django 1.5.4
  • Nginx 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

役立つことを願っています!

同様の設定があります。 nginxをApacheの前に配置した後、ApacheログのIPは常に127.0.0.1であることに気付きました。 " libapache2-mod-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;
    ...
}

出典: ngginx仮想サーバー+ djangoのfcgi?

私にとっては、次のものを使用するとうまくいきました:

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

これはdjango 1.4(特にlocalshop)で動作します。

いいえ、不可能でremote_addrを渡すことはできません。私が知っている唯一の解決策は、X-Real-IPまたはX-Forwarded-Forを使用し、バックエンドがこれらを正しく処理することを確認することです。

編集:これはfastcgi_passに適用され、通常のnginx proxy_passには適用されません

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top