2012-02-21 15 views
5

私はいくつかの場所でrequest.environ['REMOTE_ADDR']を使用するピラミッドアプリケーションを持っています。nginxプロキシの背後にあるピラミッドサーバでクライアントの実際のIPを取得する方法

アプリケーションは、ポート6543でPythonペーストを使用し、ポート80でリッスンしているnginxサーバーは、ペーストサーバーに要求を転送しています。可変request.environ [「REMOTE_ADDR」]は常に今127.0.0.1に等しいピラミッドアプリケーションで

server { 

    listen 80; ## listen for ipv4 
    listen [::]:80 default ipv6only=on; ## listen for ipv6 

    server_name localhost; 

    access_log /var/log/nginx/localhost.access.log; 

    location/{ 

     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_set_header  X-Forwarded-Proto $scheme; 
     proxy_pass http://127.0.0.1:6543; 

    } 

nginxの構成はピラミッド料理に触発されています。 私はこの問題を解決するためのいくつかの戦略を見ていますが、それを行うための推奨方法があるかどうかはわかりません。

if 'HTTP_X_REAL_IP' in event.request.environ: event.request.environ['REMOTE_ADDR'] = event.request.environ['HTTP_X_REAL_IP']

  • WSGIミドルウェアを使用します。

    • は、必要であれば[ 'REMOTE_ADDR']をrequest.environ置き換えNewRequest加入者を追加します。ここでは

      は私が検討しているものですピラミッド層を打つ前にrequest.environを変更する。

    • 何か他のもの

    あなたはピラミッドのアプリケーションをデプロイするために使用しない戦略

    ? 2つのnginxプロキシがあるとどうなりますか? (最初はLANに対応し、もう1つはインターネットに直接接続されたマシンです)。 nginxの中

  • 答えて

    6

    ですパイプラインをuse = egg:PasteDeploy#prefix経由で実行すると、X-Forwarded-ForREMOTE_ADDRに自動的に変換されます。リバースプロキシの他のプロパティにも適しています。たとえば、X-Forwarded-Protowsgi.url_schemeに変換して、ユーザーがhttpsで訪問した場合に生成されるURLもhttpsであることを確認します。

    http://pythonpaste.org/deploy/class-paste.deploy.config.PrefixMiddleware.html

    +0

    Cookbookで提案されているようにPrefixMiddlewareで最初に試しましたが、動作しませんでした。私は挑発的にそれをもう一度試す必要があります。 – ascobol

    +0

    私は[パイプライン:メイン]セクションを挿入するのを忘れたことが分かりました。すべてうまくいく – ascobol

    -2

    :PHPで

    location/{ 
        proxy_pass http://yourapp; 
         proxy_redirect  off; 
         proxy_set_header Host    $host; 
         proxy_set_header X-Real-IP  $remote_addr; 
         proxy_set_header X-Forwarded-For $remote_addr; 
         } 
    

    私が行います。Pythonで、おそらく

     if($_SERVER["HTTP_X_FORWARDED_FOR"]){ 
         $ip = $_SERVER["HTTP_X_FORWARDED_FOR"]; 
        }else{ 
         $ip = $_SERVER["REMOTE_ADDR"]; 
         } 
    

    が似て

    あなたのWSGIで paste.deploy.config.PrefixMiddlewareを使用する場合は、$ IPがあなたの本当のIP

    2

    私はnginxの後ろgeventサーバーを使用して、私はクライアントのIPアドレスを取得するためにrequest.client_addrを使用しています。

    1

    あなたは、イベントハンドラを追加し、WSGIのpiplineを持っていない、またはpasteを使用しない場合:

    config.add_subscriber(reverseProxyProtocolCorrection,'pyramid.events.NewRequest') 
    

    イベントハンドラは次のように読むことができます:

    def reverseProxyProtocolCorrection(event): 
        event.request.scheme = 'https' if event.request.headers['X-Forwarded-Proto']=='https' else 'http' 
        event.request.remote_addr=parseXForward(event.request.headers['X-Forwarded-For'],event.request.remote_addr) 
    

    と作りますプロキシがヘッダーを設定していることを確認してください

    関連する問題