2015-11-09 8 views
7

के साथ टूटा_हेडर मैं अपने nginx कॉन्फ़िगरेशन में proxy_protocol सेट अप करने का प्रयास कर रहा हूं।Nginx: proxy_protocol और ELB

broken header: "��/�� 
                  '���\DW�Vc�A{���� 
                       �@��kj98���=5���[email protected]�</A 
    " while reading PROXY protocol, client: 172.31.12.223, server: 0.0.0.0:443 
: मेरे सर्वर एक एडब्ल्यूएस लोड संतुलन (ईएलबी) के पीछे बैठता है, और मैं दोनों पोर्ट 80 और 443

हालांकि

के लिए उस पर प्रॉक्सी प्रोटोकॉल सक्षम किया है, यह मैं क्या मिलता है जब मैं अपने सर्वर में धूम मचा दी

यह nginx त्रुटि लॉग से एक सीधी प्रतिलिपि पेस्ट है - जीता चरित्र और सब कुछ।

server { 
    listen 80 proxy_protocol; 
    set_real_ip_from 172.31.0.0/20; # Coming from ELB 
    real_ip_header proxy_protocol; 
    return 301 https://$http_host$request_uri; 
} 

server { 
    listen  443 ssl proxy_protocol; 
    server_name *.....com 
    ssl_certificate  /etc/ssl/<....>; 
    ssl_certificate_key /etc/ssl/<....?; 
    ssl_prefer_server_ciphers On; 
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2; 
    ssl_ciphers ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:ECDH+3DES:DH+3DES:RSA+AESGCM:RSA+AES:RSA+3DES:!DSS:!aNULL:!eNULL:!EXPORT:!DES:!MD5:!PSK:!RC4; 
    ssl_session_cache shared:SSL:10m; 
    add_header X-Frame-Options DENY; 
    add_header X-Content-Type-Options nosniff; 
    ssl_stapling on; 
    ssl_stapling_verify on; 


    ... 

मैं नहीं इस मुद्दे के बारे में ऑनलाइन किसी भी मदद मिल सकती है:

यहाँ मेरी nginx config से एक स्निप है। अन्य लोगों ने हेडर मुद्दों को तोड़ दिया है, लेकिन खराब शीर्षकों के साथ त्रुटि हमेशा पठनीय होती है - ऐसा नहीं लगता कि वे एन्कोड किए गए हैं जैसे कि वे मेरे लिए हैं।

कोई भी विचार?

+0

ऐसा लगता है कि यह 443 पर है। यह पोर्ट 80 पर कैसे करता है? इसके अलावा, ईटीबी एचटीटीपीएस (टीसीपी नहीं) मोड में है? –

+0

पोर्ट 80 को पहले ब्लॉक द्वारा संभाला जाता है - यह सिर्फ https पर रीडायरेक्ट करता है। यह टीसीपी/एसएसएल मोड में है इसलिए websockets काम करते हैं। –

+0

वही समस्या। क्या आप मौके से कुबेरनेट का उपयोग कर रहे हैं? मैं इसे कुबर्नेट्स क्लस्टर में जाने के लिए सेट करने की कोशिश कर रहा हूं और सोचा था कि शायद 'क्यूब-प्रॉक्सी' के साथ कुछ करना है। – iameli

उत्तर

8

दो सुझाव:

  1. सत्यापित करें कि आपका ईएलबी श्रोता प्रोटोकॉल, नहीं HTTP के रूप में टीसीपी उपयोग करने के लिए कॉन्फ़िगर किया गया है। मैं निम्नलिखित की तरह एक पौंड config कि proxy_protocol साथ Nginx लिए मार्ग है कॉन्फ़िगर किया:

    { 
        "LoadBalancerName": "my-lb", 
        "Listeners": [ 
        { 
         "Protocol": "TCP", 
         "LoadBalancerPort": 80, 
         "InstanceProtocol": "TCP", 
         "InstancePort": 80 
        } 
        ], 
        "AvailabilityZones": [ 
        "us-east-1a", 
        "us-east-1b", 
        "us-east-1d", 
        "us-east-1e" 
        ], 
        "SecurityGroups": [ 
        "sg-mysg" 
        ] 
    } 
    
  2. आपने कहा है कि आप ईएलबी में प्रॉक्सी प्रोटोकॉल सक्षम किया है, इसलिए मैं आपको AWS setup steps का पालन किया है यह सोचते हैं रहा हूँ। यदि ऐसा है तो ईएलबी PROXY TCP4 198.51.100.22 203.0.113.7 35646 80\r\n जैसी कुछ पंक्ति के साथ HTTP अनुरोध को सही ढंग से क्राफ्ट करना चाहिए। हालांकि अगर HTTP अनुरोध PROXY ... लाइन के साथ Nginx में नहीं आ रहा है तो यह आपके द्वारा देखी जा रही समस्या का कारण बन सकता है। आप पुन: पेश कर सकते हैं कि यदि आप सीधे ब्राउज़र में EC2 DNS नाम दबाते हैं, या आप EC2 इंस्टेंस में ssh करते हैं और curl localhost जैसे कुछ प्रयास करते हैं, तो आपको Nginx लॉग में एक समान टूटी हुई हेडर त्रुटि दिखाई देनी चाहिए।

पता लगाने के लिए कि क्या यह साथ काम करता है एक सही ढंग से गठन HTTP अनुरोध आप टेलनेट का उपयोग कर सकते हैं:

$ telnet localhost 80 
    PROXY TCP4 198.51.100.22 203.0.113.7 35646 80 
    GET /index.html HTTP/1.1 
    Host: your-nginx-config-server_name 
    Connection: Keep-Alive 

तो जाँच Nginx लॉग और अगर आप एक ही टूट हेडर त्रुटि है देखते हैं। यदि नहीं तो ईएलबी संभावित रूप से प्रारूपित PROXY अनुरोध नहीं भेज रहा है, और मैं सुझाव देता हूं कि यह एक नया एलबी के साथ ईएलबी प्रॉक्सी प्रोटोकॉल कॉन्फ़िगरेशन को फिर से कर रहा है, यह सत्यापित करने के लिए कि यह सही तरीके से सेट है।

0

स्टीफन Karger के समाधान ऊपर, आप प्रॉक्सी का समर्थन करने के अपने ईएलबी कॉन्फ़िगर करने के लिए सुनिश्चित करें कि समायोजित करना चाहिए सही है। यहां एडब्ल्यूएस दस्तावेज़ों को ठीक करने के लिए यहां दिया गया है: http://docs.aws.amazon.com/ElasticLoadBalancing/latest/DeveloperGuide/enable-proxy-protocol.html। दस्तावेज़ पहले थोड़ा मुश्किल हैं, इसलिए यदि आप चाहते हैं कि आप Enable Proxy Protocol Using the AWS CLI अनुभाग के तहत चरण 3 और 4 पर जा सकें। प्रॉक्सी चैनलिंग सक्षम करने के लिए वे एकमात्र आवश्यक कदम हैं। इसके अतिरिक्त, के रूप में स्टीफन यह भी सुझाव दिया है, तो आप सुनिश्चित करें कि आपके ईएलबी http या https के बजाय TCP उपयोग कर रहा है, इन दोनों को ईएलबी के प्रॉक्सी कार्यान्वयन के साथ ठीक से व्यवहार नहीं होगा के रूप में करना चाहिए। मेरा सुझाव है कि अपने सॉकेट चैनल को 80 और 443 जैसे सामान्य बंदरगाहों से दूर ले जाएं, बस आप उन मानकीकृत कनेक्शन को अपने डिफ़ॉल्ट व्यवहार से बनाए रख सकते हैं। बेशक, यह कॉल पूरी तरह से निर्भर है कि आपका ऐप स्टैक कैसा दिखता है।

यदि यह मदद करता है, तो आप ऐसा तरह अपने WebSocket कनेक्शन डिबग करने के लिए npm पैकेज wscat उपयोग कर सकते हैं: कनेक्शन स्थानीय में काम करता है

$ npm install -g wscat 
$ wscat --connect 127.0.0.1 

हैं, तो यह सुनिश्चित करें कि आपके लोड संतुलन के लिए है। हालांकि, अगर ऐसा नहीं होता है, तो आपके सॉकेट होस्ट के साथ लगभग निश्चित रूप से समस्या होती है।

इसके अतिरिक्त, nmap जैसे टूल खुले बंदरगाहों की खोज में आपकी सहायता करेंगे। डिबगिंग के लिए एक अच्छी चेकलिस्ट:

npm install -g wscat 
# can you connect to it from within the server? 
ssh [email protected] 
wscat -c 127.0.0.1:80 
# can you connect to it from outside the server? 
exit 
wscat -c 69.69.69.69:80 
# if not, is your socket port open for business? 
nmap 69.69.69.69:80 

आप खुले बंदरगाहों को खोजने के लिए अपने सर्वर के भीतर से एनएमएपी का भी उपयोग कर सकते हैं। उबंटू पर एनएमएपी स्थापित करने के लिए, बस sudo apt-get install nmap। ओएसएक्स पर, brew install nmap

यहां एक कार्यशील कॉन्फ़िगरेशन है जो मेरे पास है, हालांकि यह इस समय एसएसएल समर्थन प्रदान नहीं करता है। इस विन्यास में, मैं पोर्ट 80 मेरी रेल अनुप्रयोग, बंदरगाह 81 मेरी Elb के माध्यम से एक गर्तिका कनेक्शन खिला, और बंदरगाह खिला 82 आंतरिक सॉकेट कनेक्शन के लिए खुला रहता है। उम्मीद है कि यह किसी की मदद करता है !! तैनात करने के लिए रेल, यूनिकॉर्न और फेय का उपयोग करने वाले किसी भी व्यक्ति को यह सहायक मिलना चाहिए। :) हैकिंग खुश!

# sets up deployed ruby on rails server 
upstream unicorn { 
    server unix:/path/to/unicorn/unicorn.sock fail_timeout=0; 
} 

# sets up Faye socket 
upstream rack_upstream { 
    server 127.0.0.1:9292; 
} 

# sets port 80 to proxy to rails app 
server { 
    listen 80 default_server; 
    keepalive_timeout 300; 
    client_max_body_size 4G; 
    root /path/to/rails/public; 
    try_files $uri/index.html $uri.html $uri @unicorn; 

    location @unicorn { 
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
    proxy_set_header Host $http_host; 
    proxy_set_header X-Forwarded_Proto $scheme; 
    proxy_redirect off; 
    proxy_pass http://unicorn; 
    proxy_read_timeout 300s; 
    proxy_send_timeout 300s; 
    } 

    error_page 500 502 503 504 /500.html; 
    location = /500.html { 
    root /path/to/rails/public; 
    } 
} 

# open 81 to load balancers (external socket connection) 
server { 
    listen 81 proxy_protocol; 
    server_name _; 
    charset UTF-8; 
    location/{ 
    proxy_pass http://rack_upstream; 
    proxy_redirect off; 
    proxy_set_header Upgrade $http_upgrade; 
    proxy_set_header Connection "upgrade"; 
    } 
} 

# open 82 to internal network (internal socket connections) 
server { 
    listen 82; 
    server_name _; 
    charset UTF-8; 
    location/{ 
    proxy_pass http://rack_upstream; 
    proxy_redirect off; 
    proxy_set_header Upgrade $http_upgrade; 
    proxy_set_header Connection "upgrade"; 
    } 
} 
0

मैं इस त्रुटि थी और इस टिकट में आए:

जो अंततः मुझे पता लगाना है कि मैं अपने nginx.conf फ़ाइल में एक अनावश्यक proxy_protocol घोषणा की थी के लिए नेतृत्व किया। मैंने उसे हटा दिया और सब कुछ फिर से काम कर रहा था।

विचित्र रूप से पर्याप्त है, सब कुछ nginx संस्करण 1.8.0 के साथ ठीक काम करता है, लेकिन जब मैंने nginx संस्करण 1.8.1 में अपग्रेड किया, तो जब मैंने त्रुटि को देखना शुरू किया।