Computer >> कंप्यूटर >  >> प्रोग्रामिंग >> Ruby

कैसे HTTP शीर्षलेख nginx से आपके रूबी ऐप में पास हो जाते हैं

इन दिनों लगभग सभी वेब डेवलपमेंट फ्रेमवर्क के साथ किए जाते हैं। चाहे आप रेल, सिनात्रा, या लोटस का उपयोग करें, आपको वास्तव में यह सोचने की ज़रूरत नहीं है कि कुकीज और अन्य शीर्षलेख nginx या apache से, एप्लिकेशन सर्वर और आपके ऐप में कैसे जाते हैं। वे बस करते हैं।

हम इस यात्रा की थोड़ी और गहराई से जाँच करने जा रहे हैं। क्योंकि यह पता चला है कि हेडर की कहानी में वेब के इतिहास के बारे में बहुत सारी रोचक जानकारी होती है।

वैसे भी HTTP शीर्षलेख क्या हैं?

जब भी कोई वेब ब्राउज़र अनुरोध करता है, तो वह इन चीज़ों को भेजता है जिन्हें HTTP हेडर कहा जाता है। उनमें कुकीज़, उपयोगकर्ता एजेंट के बारे में जानकारी, कैशिंग जानकारी - वास्तव में बहुत उपयोगी सामग्री शामिल है।

आप अपने ब्राउज़र के विकास टूल में अनुरोध देखकर देख सकते हैं कि कौन से शीर्षलेख भेजे जा रहे हैं। यहाँ एक उदाहरण है। जैसा कि आप देख सकते हैं, हेडर कुछ भी जादुई नहीं हैं। वे एक निश्चित तरीके से केवल टेक्स्ट स्वरूपित होते हैं।

कैसे HTTP शीर्षलेख nginx से आपके रूबी ऐप में पास हो जाते हैं

आपके ऐप में हेडर कैसे नहीं भेजे जाते हैं

यदि आपने कभी रैक ऐप लिखा है, तो आपने शायद env . देखा होगा हैश, जिसमें ऐप के पर्यावरण चर शामिल हैं। यदि आप इसके अंदर एक नज़र डालें, तो आप देखेंगे कि सामान्य सिस्टम पर्यावरण चर के अतिरिक्त, इसमें सभी अनुरोध शीर्षलेख भी शामिल हैं।

# config.ru
run lambda { |env| [200, {"Content-Type" => "text/plain"}, [env.inspect]] }

# Outputs:
# { "HTTP_HOST"=>"localhost:9000", "HTTP_CONNECTION"=>"keep-alive", "HTTP_PRAGMA"=>"no-cache", "HTTP_CACHE_CONTROL"=>"no-cache", "HTTP_ACCEPT"=>"text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8", "HTTP_UPGRADE_INSECURE_REQUESTS"=>"1", "HTTP_USER_AGENT"=>"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.106 Safari/537.36", ... }

यह नहीं है कैसे nginx आपके ऐप में हेडर पास करता है। :)

एप्लिकेशन सर्वर

आजकल, अधिकांश रूबी वेब ऐप यूनिकॉर्न जैसे एप्लिकेशन सर्वर में चलते हैं। चूंकि ऐप सर्वर nginx द्वारा उत्पन्न नहीं होते हैं, इसलिए nginx अपने पर्यावरण चर सेट नहीं कर सकते हैं।

हेडर nginx से यूनिकॉर्न तक कैसे यात्रा करते हैं? सरल। जब nginx ऐप सर्वर को अनुरोध अग्रेषित करता है, तो यह संपूर्ण अनुरोध भेजता है - शीर्षलेख और सभी।

इसे प्रदर्शित करने के लिए, मैंने एक साधारण एप्लिकेशन सर्वर बनाया जो nginx द्वारा STDOUT को भेजने वाली हर चीज़ को डंप कर देता है।

require "socket"

# Create the socket and "save it" to the file system
server = UNIXServer.new('/tmp/socktest.sock')

# Wait until for a connection (by nginx)
socket = server.accept

# Read everything from the socket
while line = socket.readline
  puts line.inspect
end

socket.close

यदि आप यूनिकॉर्न के बजाय इस सर्वर से कनेक्ट करने के लिए nginx को कॉन्फ़िगर करते हैं, तो आप देखेंगे कि ऐप सर्वर को वास्तव में कौन सी जानकारी भेजी जा रही है:बस एक सामान्य HTTP अनुरोध। शीर्षलेख और सभी।

कैसे HTTP शीर्षलेख nginx से आपके रूबी ऐप में पास हो जाते हैं

<ब्लॉकक्वॉट>

एक साधारण अपस्ट्रीम ऐप सर्वर लिखने के तरीके के बारे में अधिक जानकारी के लिए, यूनिक्स सॉकेट पर मेरी पोस्ट देखें।

फिर पर्यावरण चर से परेशान क्यों हैं?

1993 में, एनएससीए ने "कॉमन गेटवे इंटरफेस" या संक्षेप में सीजीआई नामक किसी चीज़ के लिए एक स्पेक प्रकाशित किया।

कैसे HTTP शीर्षलेख nginx से आपके रूबी ऐप में पास हो जाते हैं

यह अपाचे जैसे सर्वरों के लिए गतिशील वेबपेज बनाने के लिए डिस्क पर मनमाने प्रोग्राम चलाने का एक तरीका था। एक उपयोगकर्ता एक पृष्ठ का अनुरोध करेगा, और अपाचे सचमुच खोल देगा और परिणाम उत्पन्न करने के लिए एक प्रोग्राम चलाएगा। चूंकि अपाचे ने सीधे ऐप्स को जन्म दिया, यह उनके पर्यावरण चर सेट कर सकता था।

CGI मानक निर्दिष्ट करता है कि HTTP हेडर को पर्यावरण चर के रूप में पारित किया जाना है। और मौजूदा पर्यावरण चर के साथ किसी भी नामकरण टकराव से बचने के लिए, यह निर्दिष्ट करता है कि "HTTP_" को नाम से जोड़ा जाना चाहिए।

तो आप पर्यावरण चर के एक समूह के साथ समाप्त हो जाते हैं जो इस तरह दिखते हैं:

 HTTP_ACCEPT="text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"
 HTTP_ACCEPT_CHARSET="ISO-8859-1,utf-8;q=0.7,*;q=0.7"
 HTTP_ACCEPT_ENCODING="gzip, deflate"
 HTTP_ACCEPT_LANGUAGE="en-us,en;q=0.5"
 HTTP_CONNECTION="keep-alive"
 HTTP_HOST="example.com"
 HTTP_USER_AGENT="Mozilla/5.0 (Windows NT 6.1; WOW64; rv:5.0) Gecko/20100101 Firefox/5.0"

आजकल शायद ही कोई नए विकास के लिए सीजीआई का उपयोग करता है, लेकिन एचटीटीपी हेडर को पर्यावरण चर के रूप में संग्रहीत देखना अभी भी बहुत आम है - भले ही वे कभी-कभी नकली पर्यावरण चर होते हैं।

ऐप सर्वर इसे कैसे नकली बनाते हैं

एप्लिकेशन सर्वर कच्चे HTTP अनुरोध से हेडर को पार्स करते हैं। तो वे पर्यावरण में कैसे आते हैं? खैर, ऐप सर्वर उन्हें वहां रखता है।

मैंने वेबब्रिक में थोड़ा खोदा और धूम्रपान करने वाली बंदूक को खोजने में सक्षम था:


      self.each{|key, val|
        next if /^content-type$/i =~ key
        next if /^content-length$/i =~ key
        name = "HTTP_" + key
        name.gsub!(/-/o, "_")
        name.upcase!
        meta[name] = val
      }

आखिरकार, इन "नकली" पर्यावरण चर को अन्य वास्तविक पर्यावरण चर के साथ विलय कर दिया जाता है और आपके रैक ऐप और रेल में पास कर दिया जाता है, जो उन्हें पर्यावरण हैश से वापस ले जाता है। :)

  1. अपने विंडोज 10 पीसी पर अपने फोन से सूचनाएं कैसे प्राप्त करें

    विंडोज 10 आपके डिवाइस पर नोटिफिकेशन को सिंक्रोनाइज़ कर सकता है, जिससे आपको अपने पीसी पर अपने फोन से टेक्स्ट मैसेज और ऐप अलर्ट के बारे में नोटिफिकेशन मिल सकता है। क्लाउड में सूचनाओं को अपडेट रखने के लिए सिस्टम Cortana पर निर्भर करता है। आप सुविधा को नियंत्रित कर सकते हैं और सिंक किए गए ऐप्स को बदल सक

  1. अपने macOS से सर्च माइन से कैसे छुटकारा पाएं

    तो, आप SearchMine मालवेयर से परेशान हैं? आप सही जगह पर आए है; यहां, हम बताते हैं कि मैक से इस खराब मैलवेयर को कैसे हटाया जाए और सफारी, क्रोम और फ़ायरफ़ॉक्स को रूजसर्चमाइन वेबसाइट पर रीडायरेक्ट होने से कैसे रोका जाए। किशोर हमेशा माता-पिता और बड़ों के साथ होते हैं। वे जो नहीं करने के लिए कहा जाता है,

  1. अपने कंप्यूटर से अपने iPhone पर अपने पसंदीदा गाने कैसे प्राप्त करें

    अपने कंप्यूटर से अपने पसंदीदा ट्रैक को अपने iPhone में स्थानांतरित करना थोड़ा मुश्किल हो सकता है लेकिन असंभव नहीं है। Android के विपरीत, आप केवल केबल से कनेक्ट करके संगीत और वीडियो को सीधे अपने iPhone में स्थानांतरित नहीं कर सकते। लेकिन इसका मतलब यह नहीं है कि आपको अपने iPhone पर वही संगीत खरीदना हो