पर मैं डॉटक्लाउड पर nginx (v 1.3.14) के पीछे गनिकोर्न + गीवेंट को तैनात करने की कोशिश कर रहा हूं। मेरे पास इसके बारे में कुछ सवाल हैं। मैं python-on-dotcloud उदाहरण को अनुकूलित करने का लक्ष्य रख रहा हूं। अब तक, मैं इस सेटअप के साथ काम कर रहे websockets भाग प्राप्त करने में सक्षम नहीं है। दूसरे शब्दों में, मुझे socket.io के बजाय अपडेट प्राप्त करने के लिए मैन्युअल रूप से अपने पृष्ठों को रीफ्रेश करना होगा। यह मेरे लिए बिल्कुल नया है, इसलिए यह कुल नोब त्रुटि हो सकती है। यहां एक related question है।गनकोर्न, nginx (v 1.3.14), django, और gevent-socket.io, dotcloud
यहां परिवर्तन हैं जो मैंने पायथन-ऑन-डॉटक्लाउड उदाहरण में किए हैं।
स्पष्ट रूप से nginx (since version 1.3.13) supports web sockets। मैं इस विकास संस्करण को इंगित करने के लिए अजगर-ऑन-dotcloud उदाहरण से बिल्डर स्क्रिप्ट अद्यतन:
nginx_download_url="http://nginx.org/download/nginx-1.3.14.tar.gz"
मैं एक यूनिक्स सॉकेट से आबद्ध होने gunicorn की स्थापना की और उसके बाद करने के लिए नदी के ऊपर यातायात भेजने के लिए nginx.conf से proxy_pass की स्थापना
proxy_pass http://appserver;
के साथ बंदूकधारी जहां मैंने ऐससेवर परिभाषित किया है।मैं gevent-socket.io के साथ एक django ऐप चला रहा हूं जो nginx के बिना ठीक काम करता है। (मैं सिर्फ dotcloud.yml में 0.0.0.0:$PORT_WWW को gunicorn बाँध)
मेरे सवालों इन कर रहे हैं।
क्या मैं एक गैर-समस्या को हल करने की कोशिश कर रहा हूं?
ए। मैंने पढ़ाई की एक उचित मात्रा की है जहां इसे सलाह दी जाती है कि उसे गिनिकोर्न को nginx के पीछे रखा जाए। फ्रंट लाइन पर डॉटक्लाउड के लोड बैलेंसर्स के संदर्भ में, क्या यह अभी भी सच है?
बी। अगर मुझे उम्मीद नहीं है कि मैं एक डीओएस हमले के अधीन रहूंगा, तो क्या अभी भी nginx के पीछे बंदूक डालना महत्वपूर्ण है?
क्या यूनिक्स सॉकेट के माध्यम से वेबकॉकेट चलाने के लिए संभव है क्योंकि मैंने सेटअप करने का प्रयास किया है?
क्या यूनिक्स सॉकेट डॉटक्लाउड पर स्केलिंग को तोड़ देगा?
यदि मुझे इसके बजाय बंदरगाहों का उपयोग करने की आवश्यकता है, तो इसे कैसे सेट करें? मुझे नहीं लगता कि मैं एक ही ऐप में दो http पोर्ट आवंटित कर सकता हूं। यदि मैं इसे दो ऐप्स में विभाजित करता हूं, तो मुझे यकीन नहीं है कि कैसे बंदरगाह ऐप से nginx ऐप में PORT_WWW पर्यावरण चर को पारित किया जाए ताकि यह nginx postinstall स्क्रिप्ट के लिए उपलब्ध हो और इस प्रकार परिणामी nginx.conf में।
कोई विचार यह क्यों नहीं है कि यह क्यों काम नहीं कर रहा है?
मैंने नीचे तीन कॉन्फ़िगरेशन फ़ाइलें शामिल की हैं। अगर दूसरों की मदद मिलेगी तो मुझे बताएं। धन्यवाद!
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()
चीजों को आसान बनाने के लिए, मैं मिश्रण से nginx को तब तक हटा दूंगा जब तक आपको वास्तव में इसकी आवश्यकता न हो। Nginx वास्तव में आवश्यक नहीं है, dotCloud गेटवे एक ही उद्देश्य की सेवा करेगा। चीजों को और भी आसान बनाने के लिए, आप मूल पायथन-कार्यकर्ता के साथ एक ही काम कर सकते हैं, और आपको कस्टम सेवा का उपयोग करने की आवश्यकता नहीं होगी। आपको केवल बंदूक प्रक्रिया को चलाने की ज़रूरत है, और सुनिश्चित करें कि आप कस्टम सेवा के लिए एक ही तरह से http पोर्ट के लिए पूछें। –
यही वह जवाब है जिसके लिए मैं उम्मीद कर रहा था! धन्यवाद, केन। -Tim – t1m0
उल्लेख नहीं है कि websocketets nginx में संस्करण 1.4 के नीचे किसी भी चीज़ में पूरी तरह से समर्थित नहीं हैं, इसलिए यह आपकी समस्या हो सकती है। इसके अलावा आपकी कॉन्फ़िगरेशन अच्छी लगती है। –