2011-12-04 21 views
5

मैं साइट पर <img> टैग एम्बेड करके एक उच्च लोड वेब सांख्यिकी प्रणाली बना रहा हूं। बात मैं करना चाहता हूँ:मैं nginx को स्थिर प्रतिक्रिया कैसे वापस कर सकता हूं और ऐप को अनुरोध शीर्षलेख भेज सकता हूं?

  1. nginx कुछ मेजबान
  2. यह इस बार यह किसी भी तरह के अनुरोध के हेडर को हस्तांतरित करता पर फाइल सिस्टम
  3. से थोड़ा 1px स्थिर छवि को होस्ट करने के जवाब के रूप में देता है से एक छवि के लिए अनुरोध हो जाता है आवेदन

मैं रुबी के साथ काम कर रहा हूं और मैं हेडर प्राप्त करने के लिए एक शुद्ध-रैक ऐप बनाने जा रहा हूं और आगे की गणना के लिए उन्हें कतार में डाल रहा हूं।

समस्या जिसे मैं हल नहीं कर सकता, यह है कि मैं रैक ऐप में हेडर देने के लिए स्फिंक्स को कैसे कॉन्फ़िगर कर सकता हूं, और रैक एप्लिकेशन से प्रतिक्रिया के इंतजार किए बिना एक स्थिर छवि को उत्तर के रूप में वापस कर सकता हूं?

इसके अलावा, यदि रबी-समाधान अधिक आम है तो रैक की आवश्यकता नहीं है।

+1

यह वास्तव में अपने _specific_ प्रश्न का उत्तर नहीं है, लेकिन अगर आप डॉन ' एक और समाधान नहीं ढूंढता है, आप अनुरोधों को एक फ़ाइल में लॉगिंग करने पर विचार कर सकते हैं और फिर बाद में उस फ़ाइल को रूबी –

+0

ब्रैंडन के साथ पार्स कर सकते हैं, धन्यवाद, यह समाधान दिलचस्प है, लेकिन मुझे डर है, यह बुरी तरह स्केलेबल है। – sandrew

+0

आपको सर्वर से तत्काल प्रतिक्रिया की आवश्यकता क्यों है?मेरा मतलब है कि ग्राहक एक पारदर्शी 1x1px जीआईएफ छवि की प्रतीक्षा कर रहा है, इसलिए अंतिम उपयोगकर्ता अनुभव के लिए यह अनजान है ... – lwe

उत्तर

1

आप post_action साथ यह पूरा करने में सक्षम हो सकता (मैं, पूरी तरह से यकीन है कि यह काम करेगा नहीं कर रहा हूँ, लेकिन यह केवल एक चीज मैं के बारे में सोच सकते हैं)

server { 
    location/{ 
    post_action @post; 
    rewrite^/1px.gif break; 
    } 

    location @post { 
    # Pass the request to the backend. 
    proxy_pass http://backend$request_uri; 

    # Using $request_uri with the proxy_pass will preserve the original request, 
    # if you use (fastcgi|scgi|uwsgi)_pass, this would need to be changed. 
    # I believe the original headers will automatically be preserved. 
    } 
} 
+0

मैं पोस्ट_एक्शन के साथ ऐसा करता हूं। http://wiki.nginx.org/HttpEmptyGifModule एक 1x1 gif की सेवा करने के लिए तेज़ है। – greg

2

एक सरल विकल्प ग्राहक संबंध समाप्त करने के लिए है बैकएंड प्रक्रिया के साथ आगे बढ़ते समय ASAP।

server { 
    location /test { 
     # map 402 error to backend named location 
     error_page 402 = @backend; 

     # pass request to backend 
     return 402; 
    } 

    location @backend { 
     # close client connection after 1 second 
     # Not bothering with sending gif 
     send_timeout 1; 

     # Pass the request to the backend. 
     proxy_pass http://127.0.0.1:8080; 
    } 
} 

ऊपर विकल्प है, जबकि सरल, ग्राहक कोई त्रुटि संदेश मिल में परिणाम जब कनेक्शन हटा दिया गया है हो सकता है। Ngx.say निर्देश यह सुनिश्चित करेगा कि "200 ओके" हेडर भेजा जाएगा और क्योंकि यह एक एसिंक कॉल है, चीजों को पकड़ नहीं पाएगा। यह ngx_lua मॉड्यूल की जरूरत है।

server { 
    location /test { 
     content_by_lua ' 
      -- send a dot to the user and transfer request to backend 
      -- ngx.say is an async call so processing continues after without waiting 
      ngx.say(".") 
      res = ngx.location.capture("/backend") 

     '; 
    } 

    location /backend { 
     # named locations not allowed for ngx.location.capture 
     # needs "internal" if not to be public 
     internal; 

     # Pass the request to the backend. 
     proxy_pass http://127.0.0.1:8080; 
    } 

} 

एक और अधिक संक्षिप्त लुआ आधारित विकल्प:

server { 
    location /test { 
     rewrite_by_lua ' 
      -- send a dot to the user 
      ngx.say(".") 

      -- exit rewrite_by_lua and continue the normal event loop 
      ngx.exit(ngx.OK) 
     '; 
     proxy_pass http://127.0.0.1:8080; 
    } 
} 

निश्चित रूप से एक दिलचस्प चुनौती।

0

X-Accel-Redirect, http://wiki.nginx.org/XSendfile का उपयोग क्यों न करें, ताकि आप अपने रूबी ऐप पर अनुरोध अग्रेषित कर सकें और फिर केवल प्रतिक्रिया शीर्षलेख सेट करें और nginx फ़ाइल लौटाए।

अद्यतन, अच्छी तरह से एक 1x1px पारदर्शी GIF के लिए यह शायद एक चर में डाटा स्टोर और ग्राहक को सीधे वापस जाने के लिए आसान है फ़ाइल (ईमानदारी से यह है कि छोटे है), इसलिए मुझे लगता है कि एक्स-एक्सेल-पुनर्निर्देशन शायद एक overkill है इस मामले में।

2

post_action के बारे में यहाँ पढ़ रहे हैं और पढ़ने के बाद http://invalidlogic.com/2011/04/12/serving-static-content-via-post-from-nginx/ "Nginx से सेवित स्टेटिक सामग्री के माध्यम से पोस्ट" मैं इस का उपयोग कर पूरा किया है:

server { 
    # this is to serve a 200.txt static file 
    listen 8888; 
    root /usr/share/nginx/html/; 
} 
server { 
    listen 8999; 
    location/{ 
    rewrite^/200.txt break; 
    } 

    error_page 405 =200 @405; 
    location @405 { 
    # post_action, after this, do @post 
    post_action @post; 
    # this nginx serving a static file 200.txt 
    proxy_method GET; 
    proxy_pass http://127.0.0.1:8888; 
    } 

    location @post { 
    # this will go to an apache-backend server. 
    # it will take a long time to process this request 
    proxy_method POST; 
    proxy_pass http://127.0.0.1/$request_uri; 
    } 
} 
संबंधित मुद्दे

 संबंधित मुद्दे