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

时间:2013-03-08 15:13:48

标签: django nginx gunicorn dotcloud gevent-socketio

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

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

  1. 显然nginx (since version 1.3.13) supports web sockets。我从python-on-dotcloud示例更新了构建器脚本以指向此开发版本:nginx_download_url="http://nginx.org/download/nginx-1.3.14.tar.gz"

  2. 我设置了gunicorn绑定到unix套接字,然后从nginx.conf设置proxy_pass,将流量上行发送到带有proxy_pass http://appserver;的gunicorn,我在其中定义了appserver。

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

  4. 我的问题是这些。

    1. 我想解决一个没问题吗?

      一个。我已经做了相当多的阅读,建议将枪支放在nginx后面。在dotcloud的前线负载平衡器的背景下,这仍然是真的吗?

      湾如果我不期望我会受到DoS攻击,那么把枪支放在nginx后面仍然很重要吗?

    2. 我可以尝试设置通过unix套接字运行websockets吗?

    3. unix套接字是否会破坏dotcloud上的缩放?

    4. 如果我需要使用端口,请如何设置?我不认为我可以在同一个应用程序中分配两个http端口。如果我将它拆分为两个应用程序,那么我不确定如何将来自gunicorn应用程序的PORT_WWW环境变量传递到nginx应用程序,以便它最终可用于nginx postinstall脚本,从而最终可用于生成的nginx.conf。 / p>

    5. 关于为什么这不起作用的任何想法?

    6. 我在下面包含了三个配置文件。让我知道其他人是否会有所帮助。 谢谢!

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

1 个答案:

答案 0 :(得分:1)

我上面提到了5个相关问题,我将尝试回答前3个问题。 (我不太了解dotcloud支持回答最后两个)。我也期望大多数人发现这个问题主要集中在带有gunicorn和nginx的websockets(而不是dotcloud细节)。对于这些人,您可以在此处跳转到参考设置:gunicorn deployment scheme with nginx

  
      
  1. 我试图解决一个没问题吗?

         

    一个。我已经做了相当多的阅读,建议他们放置   nginx背后的枪声。在dotcloud的负载均衡器的背景下   前线,这仍然是真的吗?

         

    湾如果我不期望我会受到DoS攻击,那么它是否仍然存在   把枪炮放在nginx后面很重要吗?

  2.   

根据Ken Cochrane的评论,我相信dotcloud基础设施本身提供了nginx通常在DIY设置中提供的安全性。因此,在这种特殊情况下,这确实是一个非问题。"但是,一般来说,你确实需要在nginx后面使用gunicorn,你肯定可以使用该设置运行websockets。

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

是。这是gunicorn deployment scheme with nginx的一个很好的参考。对于websockets,请务必阅读整个部分并包含proxy_buffering off;

  
      
  1. unix套接字是否会破坏dotcloud上的缩放?
  2.   

我的理解是套接字和端口都应该同样有效。