gunicorn,nginx(v 1.3.14),django和gevent-socket.io,在dotcloud

我试图在dotcloud上部署nginx(v 1.3.14)背后的gunicorn + gevent。 我有几个关于它的问题。 我正在调整python-on-dotcloud示例。 到目前为止,我还没有能够得到这个设置的websockets部分。 换句话说,我必须手动刷新我的页面来获取更新,而不是通过socket.io。 这对我来说都很新,所以可能是一个总的noob错误。 这是一个相关的问题 。

以下是我对python-on-dotcloud示例的更改。

  1. 显然nginx(自1.3.13版本以来)支持networking套接字 。 我更新了python-on-dotcloud示例中的builder脚本,指向这个开发版本: nginx_download_url="http://nginx.org/download/nginx-1.3.14.tar.gz"

  2. 我设置gunicorn绑定到unix套接字,然后设置proxy_pass从nginx.conf发送上行stream量到gunicorn proxy_pass http://appserver; 我已经定义了appserver。

  3. 我正在运行gent-socket.io的django应用程序,运行正常,没有运行nginx。 (我只是在dotcloud.yml中将gunicorn绑定到0.0.0.0:$PORT_WWW)

我的问题是这些。

  1. 我是否试图解决一个非问题?

    一个。 我已经做了相当数量的阅读,build议把gunicorn放在nginx后面。 在第一线的dotcloud负载均衡器的情况下,这仍然是真的吗?

    湾 如果我不指望我会受到DoS攻击,那么把gunicorn放在nginx后面还是很重要的吗?

  2. 是否有可能通过unix套接字运行websockets,因为我试图设置?

  3. unix套接字会在dotcloud上打破缩放吗?

  4. 如果我需要使用端口,那么如何设置呢? 我不认为我可以在同一个应用程序中分配两个http端口。 如果我将它分成两个应用程序,那么我不知道如何将来自gunicorn应用程序的PORT_WWW环境variables传递给nginx应用程序,这样它就可以在nginx安装后脚本中使用,从而在nginx.conf中生成。

  5. 任何想法,为什么这不工作是?

我已经在下面列出了三个configuration文件。 让我知道如果别人会帮助。 谢谢!

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 @PORT_WWW@ 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() 

我问了上面5个相关的问题,我会尽量回答前面的3个问题。 (我不知道足够的dotcloud基础来回答最后两个)。 我也希望大多数人能够发现这个问题,主要集中在使用gunicorn和nginx的websocket上(而不是在dotcloud的细节上)。 对于那些人来说,你可以跳转到这里的参考设置: 用nginx的gunicorn部署方案

  1. 我是否试图解决一个非问题?

    一个。 我已经做了相当数量的阅读,建议把gunicorn放在nginx后面。 在第一线的dotcloud负载均衡器的情况下,这仍然是真的吗?

    湾 如果我不指望我会受到DoS攻击,那么把gunicorn放在nginx后面还是很重要的吗?

从Ken Cochrane上面的评论中,我相信dotcloud基础架构本身提供了nginx通常在DIY设置中提供的安全性。 因此,在这个特殊情况下,这确实是一个“非问题”。 但是,一般来说,你需要在nginx后面使用gunicorn,而且你可以使用这个设置来运行websockets。

  1. 是否有可能通过unix套接字运行websockets,因为我试图设置?

是。 这里有一个关于nginx的gunicorn部署方案的很好的参考。 对于websocket,一定要阅读整个部分,并包括proxy_buffering off;

  1. unix套接字会在dotcloud上打破缩放吗?

我的理解是,套接字和端口应该都工作得很好。