2013-03-08 3 views
13

पर मैं डॉटक्लाउड पर nginx (v 1.3.14) के पीछे गनिकोर्न + गीवेंट को तैनात करने की कोशिश कर रहा हूं। मेरे पास इसके बारे में कुछ सवाल हैं। मैं python-on-dotcloud उदाहरण को अनुकूलित करने का लक्ष्य रख रहा हूं। अब तक, मैं इस सेटअप के साथ काम कर रहे websockets भाग प्राप्त करने में सक्षम नहीं है। दूसरे शब्दों में, मुझे socket.io के बजाय अपडेट प्राप्त करने के लिए मैन्युअल रूप से अपने पृष्ठों को रीफ्रेश करना होगा। यह मेरे लिए बिल्कुल नया है, इसलिए यह कुल नोब त्रुटि हो सकती है। यहां एक related question है।गनकोर्न, nginx (v 1.3.14), django, और gevent-socket.io, dotcloud

यहां परिवर्तन हैं जो मैंने पायथन-ऑन-डॉटक्लाउड उदाहरण में किए हैं।

  1. स्पष्ट रूप से nginx (since version 1.3.13) supports web sockets। मैं इस विकास संस्करण को इंगित करने के लिए अजगर-ऑन-dotcloud उदाहरण से बिल्डर स्क्रिप्ट अद्यतन: nginx_download_url="http://nginx.org/download/nginx-1.3.14.tar.gz"

  2. मैं एक यूनिक्स सॉकेट से आबद्ध होने gunicorn की स्थापना की और उसके बाद करने के लिए नदी के ऊपर यातायात भेजने के लिए nginx.conf से proxy_pass की स्थापना proxy_pass http://appserver; के साथ बंदूकधारी जहां मैंने ऐससेवर परिभाषित किया है।

  3. मैं gevent-socket.io के साथ एक django ऐप चला रहा हूं जो nginx के बिना ठीक काम करता है। (मैं सिर्फ dotcloud.yml में 0.0.0.0:$PORT_WWW को gunicorn बाँध)

मेरे सवालों इन कर रहे हैं।

  1. क्या मैं एक गैर-समस्या को हल करने की कोशिश कर रहा हूं?

    ए। मैंने पढ़ाई की एक उचित मात्रा की है जहां इसे सलाह दी जाती है कि उसे गिनिकोर्न को nginx के पीछे रखा जाए। फ्रंट लाइन पर डॉटक्लाउड के लोड बैलेंसर्स के संदर्भ में, क्या यह अभी भी सच है?

    बी। अगर मुझे उम्मीद नहीं है कि मैं एक डीओएस हमले के अधीन रहूंगा, तो क्या अभी भी nginx के पीछे बंदूक डालना महत्वपूर्ण है?

  2. क्या यूनिक्स सॉकेट के माध्यम से वेबकॉकेट चलाने के लिए संभव है क्योंकि मैंने सेटअप करने का प्रयास किया है?

  3. क्या यूनिक्स सॉकेट डॉटक्लाउड पर स्केलिंग को तोड़ देगा?

  4. यदि मुझे इसके बजाय बंदरगाहों का उपयोग करने की आवश्यकता है, तो इसे कैसे सेट करें? मुझे नहीं लगता कि मैं एक ही ऐप में दो http पोर्ट आवंटित कर सकता हूं। यदि मैं इसे दो ऐप्स में विभाजित करता हूं, तो मुझे यकीन नहीं है कि कैसे बंदरगाह ऐप से nginx ऐप में PORT_WWW पर्यावरण चर को पारित किया जाए ताकि यह nginx postinstall स्क्रिप्ट के लिए उपलब्ध हो और इस प्रकार परिणामी nginx.conf में।

  5. कोई विचार यह क्यों नहीं है कि यह क्यों काम नहीं कर रहा है?

मैंने नीचे तीन कॉन्फ़िगरेशन फ़ाइलें शामिल की हैं। अगर दूसरों की मदद मिलेगी तो मुझे बताएं। धन्यवाद!

dotcloud.yml

www: 
    type: custom 
    buildscript: python/builder 
    systempackages: 
     # needed for the Nginx rewrite module 
     - libpcre3-dev 
     # needed to support python versions 2.7, 3.1, 3.2. 
     - python3-all 
    ports: 
     www: http 
    processes: 
     nginx: nginx 
     app: /home/dotcloud/env/bin/gunicorn -c /home/dotcloud/gunicorn.conf -b unix:/tmp/gunicorn.sock wsgi:application 
     #app: /home/dotcloud/env/bin/gunicorn -c /home/dotcloud/gunicorn.conf -b 0.0.0.0:$PORT_WWW wsgi:application 
    config: 
     # python_version can have one of the following values (2.6, 2.7, 3.1, 3.2). 2.6 is the default if no value is entered. 
     python_version: 2.7 
data: 
    type: redis 
db: 
    type: postgresql 

nginx.conf.in (नियमित nginx के रूप में ही।conf, केवल PORT_WWW असली पोर्ट नंबर के लिए बदली करने के लिए) इंतज़ार कर के साथ

# template for nginx.conf file. 
# the file will be processed by the postinstall script 
# it will insert the correct value for PORT_WWW and then put this 
# file in /home/dotcloud/nginx/conf/nginx.conf when done. 

# nginx will be managed by supervisord when it starts so we don't need daemon mode 
daemon off; 

worker_processes 1; 

events { 
    worker_connections 1024; 
} 


http { 

include  mime.types; 
default_type application/octet-stream; 

sendfile  on; 
#tcp_nopush  on; 

keepalive_timeout 65; 

log_format combined-realip '$remote_addr ($http_x_real_ip) - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent"'; 
access_log /var/log/supervisor/nginx_access.log combined-realip; 
error_log /var/log/supervisor/nginx_error.log error; 

gzip on; 


    upstream appserver { 
     server unix:/tmp/gunicorn.sock; 
     # For a TCP configuration: 
     # server 192.168.0.7:8000 fail_timeout=0; 
    } 


    server { 
    # PORT_WWW value is added via postinstall script. 
    listen @[email protected] default; 

    server_name localhost; 

    root /home/dotcloud/current/; 

    location/{ 
     if (-f /home/dotcloud/current/maintenance) { 
      return 503; 
     } 
     proxy_pass http://appserver; 
     proxy_http_version 1.1; 
     proxy_set_header upgrade $http_upgrade; 
     proxy_set_header Connection "upgrade"; 

    } 

    error_page 404 @404; 
    error_page 500 @500; 
    error_page 502 @502; 
    error_page 503 @503; 
    error_page 504 @504; 

    location @404 { 
     rewrite^/static/404.html; 
    } 
    location @500 { 
     rewrite^/static/500.html; 
    } 
    location @502 { 
     rewrite^/static/502.html; 
    } 
    location @503 { 
     rewrite^/static/503.html; 
    } 
    location @504 { 
     rewrite^/static/504.html; 
    } 

    location /static { 
     alias /home/dotcloud/current/static; 
    } 

    location /robots.txt { 
     alias /home/dotcloud/current/static/robots.txt; 
    } 

    location /favicon.ico { 
     alias /home/dotcloud/current/static/favicon.ico; 
    } 

    } 
} 

gunicorn.conf

workers = 1 
worker_class = 'socketio.sgunicorn.GeventSocketIOWorker' 
pidfile = '/tmp/gunicorn.pid' 
debug = True 
loglevel = 'debug' 
errorlog = '/var/log/supervisor/gunicorn.log' 
django_settings='/home/dotcloud/settings.py' 

def post_fork(server, worker): 
    from psycogreen.gevent import patch_psycopg 
    patch_psycopg() 

# MySQL 
#def post_fork(server, worker): 
# import pymysql 
# pymysql.install_as_MySQLdb() 
+2

चीजों को आसान बनाने के लिए, मैं मिश्रण से nginx को तब तक हटा दूंगा जब तक आपको वास्तव में इसकी आवश्यकता न हो। Nginx वास्तव में आवश्यक नहीं है, dotCloud गेटवे एक ही उद्देश्य की सेवा करेगा। चीजों को और भी आसान बनाने के लिए, आप मूल पायथन-कार्यकर्ता के साथ एक ही काम कर सकते हैं, और आपको कस्टम सेवा का उपयोग करने की आवश्यकता नहीं होगी। आपको केवल बंदूक प्रक्रिया को चलाने की ज़रूरत है, और सुनिश्चित करें कि आप कस्टम सेवा के लिए एक ही तरह से http पोर्ट के लिए पूछें। –

+0

यही वह जवाब है जिसके लिए मैं उम्मीद कर रहा था! धन्यवाद, केन। -Tim – t1m0

+0

उल्लेख नहीं है कि websocketets nginx में संस्करण 1.4 के नीचे किसी भी चीज़ में पूरी तरह से समर्थित नहीं हैं, इसलिए यह आपकी समस्या हो सकती है। इसके अलावा आपकी कॉन्फ़िगरेशन अच्छी लगती है। –

उत्तर

1

मैं 5 से संबंधित प्रश्नों के ऊपर से पूछा, और मैं पहले 3 जवाब देने की कोशिश करेंगे यहाँ। (मुझे पिछले दो जवाब देने के लिए डॉटक्लाउड को कम करने के बारे में पता नहीं है)। मैं यह भी उम्मीद करता हूं कि ज्यादातर लोग इस प्रश्न को ढूंढने के लिए अधिकतर बंदूकें और नग्जिनक्स (और डॉटक्लाउड विवरणों पर कम) वाले वेबसाकेट पर केंद्रित हैं। उन लोगों के लिए, आप एक संदर्भ सेटअप यहाँ के लिए कूद कर सकते हैं: gunicorn deployment scheme with nginx

  1. Am मैं एक गैर समस्या को हल करने की कोशिश कर रहा?

    ए। मैंने पढ़ाई की एक उचित मात्रा की है जहां इसे nginx के पीछे बंदूक डालने की सलाह दी गई है। पर फ्रंट लाइन पर डॉटक्लाउड के लोड बैलेंसर्स के संदर्भ में, क्या यह अभी भी सच है?

    बी। अगर मुझे उम्मीद नहीं है कि मैं एक डीओएस हमले के अधीन रहूंगा, तो क्या यह अभी भी nginx के पीछे बंदूक रखने के लिए महत्वपूर्ण है?

ऊपर केन कोक्रेन की टिप्पणी से, मेरा मानना ​​है कि dotcloud बुनियादी ढांचे में ही सुरक्षा है कि nginx सामान्य रूप से एक DIY सेटअप में प्रदान करेगा प्रदान करता है। इसलिए, इस विशेष मामले में यह वास्तव में एक "गैर समस्या" था। हालांकि, सामान्य रूप से, आप nginx के पीछे बंदूकधारी चाहते हैं, और आप निश्चित रूप से उस सेटअप के साथ websockets चला सकते हैं।

  1. यह के रूप में मैं सेटअप करने के लिए प्रयास किया है एक यूनिक्स सॉकेट के माध्यम से WebSockets को चलाने के लिए संभव है?

हां। gunicorn deployment scheme with nginx पर एक अच्छा संदर्भ दिया गया है। WebSockets के लिए, कि पूरे खंड अवश्य पढ़ लें और शामिल proxy_buffering off;

  1. यूनिक्स सॉकेट dotcloud पर स्केलिंग तोड़ देगा?

मेरे समझ के साथ कि सॉकेट और बंदरगाहों दोनों समान रूप से अच्छी तरह से काम करना चाहिए।