2013-05-23 43 views
7

Tôi đang chạy một dự án django sử dụng gevent-socketio.gevent-socketio nginx uwsgi không hoạt động cùng nhau trên máy chủ phát triển

Đối với một số lý do trên máy chủ phát triển của tôi, tất cả các yêu cầu WebSockets tôi được trả lại một thông điệp 101 pending mà socketio sẽ bắt đầu đi xe đạp qua tất cả các giao thức khác mà dẫn đến một tình trạng pending.

Các lỗi trong nhật ký uwsgi của tôi là:

2013/05/23 16:09:08 [error] 14485#0: *85 upstream timed out (110: Connection timed out) while reading upstream, client: x.x.x.x, server: dev.proj.co, request: "GET /socket.io/1/xhr-polling/116404981619?t=1369325348489 HTTP/1.1", upstream: "http://127.0.0.1:4042/socket.io/1/xhr-polling/116404981619?t=1369325348489", host: "dev.proj.co", referrer: "http://dev.proj.co/map/bycon/" 

tại địa phương, tôi không có vấn đề này. Tôi bắt đầu máy chủ sử dụng python run.py

run.py về môi trường địa phương của tôi

#!/usr/bin/env python 
import os 
import sys 

from gevent import monkey 
monkey.patch_all() 

import django.core.handlers.wsgi 
from socketio.server import SocketIOServer 

import os 

PORT = 8000 

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "proj.settings") 
application = django.core.handlers.wsgi.WSGIHandler() 
PROJECT_DIR   = os.path.realpath(os.path.dirname(__file__)) 
sys.path.insert(0, PROJECT_DIR) 
sys.path.insert(0, os.path.join(PROJECT_DIR, "chat")) 

if __name__ == '__main__': 
    SocketIOServer(('', PORT), application, resource="socket.io").serve_forever() 

On phát triển máy chủ của tôi, nơi mà các lỗi đang xảy ra, tôi có các cài đặt sau:

nginx.conf

worker_processes auto; 

events { 
    worker_connections 1024; 
} 

http { 
    include  mime.types; 
    default_type application/octet-stream; 
    sendfile  on; 
    keepalive_timeout 65; 

    gzip on; 
    upstream django { 
     server 127.0.0.1:4042; 
    } 


    server { 
     listen  80; 
     server_name dev.proj.co; 
     charset utf-8; 

     access_log /var/log/nginx/myproj_dev.access.log; 
     error_log /var/log/nginx/myproj_dev.error.log; 

     location /media/ { 
      alias /var/www/dev/myproj/releases/myproj_public/media/; 
      error_page 404 = /404; 
      expires 30d; 
     } 

     location /static/ { 
      alias /var/www/dev/myproj/releases/myproj_public/static/; 
      error_page 404 = /404; 
      expires 30d; 
     } 
     location/{ 
      proxy_pass http://127.0.0.1:4042; 
      proxy_http_version 1.1; 
      proxy_set_header Upgrade $http_upgrade; 
      proxy_set_header Connection "upgrade"; 
     } 
    } 
} 
.210

uwsgi_dev.ini

[uwsgi] 

if-env = PROJECT_HOME 
print = Your path is %(_)/current 
chdir = %(_)/current 
touch-reload = %(_)/current/myproj/uwsgi_dev.ini 
daemonize = %(_)/myproj_uwsgi/myproj.log 
endif = 

if-env = VIRTUAL_ENV 
print = Your virtualenv is %(_) 
virtualenv = %(_) 
endif = 

gevent = 100 
processes = 4 
module = myproj.wsgi_dev 
env = DJANGO_SETTINGS_MODULE=myproj.settings.dev 
master = True 
vacuum = True 
max-requests = 5000 
logdate = True 

# newrelic requirements 
enable-threads = True 
single-interpreter = True 

wsgi_dev.py

import os 

from gevent import monkey 
monkey.patch_all() 

from socketio.server import SocketIOServer 
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "myproj.settings") 
from django.core.wsgi import get_wsgi_application 
application = get_wsgi_application() 

PORT = 4042 
SocketIOServer(("127.0.0.1", PORT), application, \ 
     resource="socket.io").serve_forever() 

thông tin khác:

I'm using uwsgi 1.9.6, gevent-websocket 0.3.6, greenlet 0.4.0 and the dev version of gevent(-e git://github.com/surfly/[email protected]#egg=gevent-dev) and gevent-socketetio (-e git://github.com/abourget/[email protected]#egg=gevent_socketio-dev) 

[[email protected] ~]# nginx -v 
nginx version: nginx/1.4.1 
+0

Bạn có thể có thể thử chạy nó với một quá trình và xem nếu vấn đề vẫn còn? Tôi cũng gặp rắc rối với gevent-socketio với nhiều công nhân sử dụng gunicorn, không chắc chắn nếu nó có liên quan https://github.com/abourget/gevent-socketio/issues/132?source=cc. Ngoài ra sử dụng uwsgi với gevent dường như rất lỗi ... https://github.com/abourget/gevent-socketio/issues/81?source=cc –

+0

@BernhardVallant Cảm ơn bạn đã bình luận. Liên kết gunicorn khá hữu ích.Tôi không có nhiều thời gian để gỡ lỗi này ngay bây giờ nhưng khi tôi làm, tôi sẽ cố gắng nhớ để cập nhật bài đăng này. – super9

+1

@ super9 Tôi biết đây là một câu hỏi cũ, nhưng tôi tự hỏi nếu bạn đã bao giờ giải quyết những gì đã cho bạn lỗi? Tôi đang gặp phải sự cố tương tự hiện tại. Đã cập nhật – jbll

Trả lời

1

Đối với WebSockets hỗ trợ bạn cần phiên bản mới nhất của nginx (1.4.x) . Nếu bạn sử dụng phiên bản cũ hơn, bạn sẽ không thể để bắt đầu kênh WebSocket

+0

. sử dụng 1.4.1 – super9

0

Các SocketIOServer sẽ không bao giờ chạy như bạn đang chạy các tập tin django WSGI như một module để __name__ không __main__

Thêm vào đó logic là sai như SocketIOServer sẽ tiếp quản uWSGI chặn yorur django ứng dụng.

tôi đề nghị bạn để chạy SocketIOServer từ một kịch bản riêng biệt sử dụng --attach-daemon của uWSGI

(và rõ ràng đặt uWSGi trên một cổng khác)

+0

Cảm ơn bạn đã phản hồi @roberto. Tôi nghĩ câu hỏi của tôi đã làm bạn bối rối. Tôi đã sửa đổi để làm cho nó rõ ràng hơn. Tôi chỉ đang sử dụng tệp 'run.py' (ngược lại với ./manage.py runserver) cục bộ và nó hoạt động tốt. Vấn đề là cài đặt trên máy chủ phát triển của tôi. – super9

0

đề Disable trong UWSGI.

Bạn có vấn đề "Toàn cầu Interpretator Lock"

enable-đề = True < - tôi nghĩ rằng vấn đề ở đây, hãy thử False