13

dotcloudのnginx(v 1.3.14)の背後にgunicorn+geventをデプロイしようとしています。それについていくつか質問があります。私はpython-on-dotcloudの例を適応させることを目指しています。これまでのところ、このセットアップでWebSocket部分を機能させることはできませんでした。つまり、socket.ioを介してではなく、手動でページを更新して更新を取得する必要があります。これはすべて私にとってはかなり新しいので、まったくのnoobエラーである可能性があります。これが関連する質問です。

python-on-dotcloudの例に加えた変更は次のとおりです。

  1. どうやらnginx(バージョン1.3.13以降)はWebソケットをサポートしています。この開発バージョンを指すように、python-on-dotcloudの例からビルダースクリプトを更新しました。nginx_download_url="http://nginx.org/download/nginx-1.3.14.tar.gz"

  2. UNIXソケットにバインドするようにgunicornを設定してから、nginx.confからproxy_passを設定して、proxy_pass http://appserver;appserverを定義した場所でトラフィックをgunicornにアップストリームで送信します。

  3. nginxを実行しなくても正常に動作するgevent-socket.ioを使用してdjangoアプリを実行しています。(私はgunicornをdotcloud.ymlの0.0.0.0:$ PORT_WWWにバインドするだけです)

私の質問はこれらです。

  1. 私は問題のないものを解決しようとしていますか?

    a。gunicornをnginxの後ろに置くことをお勧めするところで、かなりの量の読書をしました。最前線にあるdotcloudのロードバランサーのコンテキストでは、これはまだ本当ですか?

    b。DoS攻撃を受けるとは思わない場合でも、gunicornをnginxの背後に配置することは重要ですか?

  2. セットアップを試みたときに、UNIXソケットを介してWebSocketを実行することは可能ですか?

  3. UNIXソケットはdotcloudのスケーリングを壊しますか?

  4. 代わりにポートを使用する必要がある場合、どのように設定しますか?同じアプリで2つのhttpポートを割り当てることはできないと思います。それを2つのアプリに分割した場合、PORT_WWW環境変数をgunicornアプリからnginxアプリに渡して、最終的にnginxポストインストールスクリプトで使用できるようにし、結果としてnginx.confで使用できるようにする方法がわかりません。

  5. なぜこれがそのまま機能しないのかについてのアイデアはありますか?

以下に3つの設定ファイルを含めました。他の人が助けてくれるかどうか教えてください。ありがとう!

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

1 に答える 1

1

上記の 5 つの関連する質問をしたので、ここで最初の 3 つに答えようと思います。(最後の2つに答えるには、ドットクラウドの基盤について十分に知りません)。また、この質問を見つけたほとんどの人は、主に gunicorn と nginx を使用した websocket に焦点を当てていると思います (dotcloud の詳細にはあまり関心がありません)。それらの人々のために、あなたはここで参照設定にジャンプすることができます: nginx を使用した gunicorn 展開スキーム

  1. 問題ではないことを解決しようとしていますか?

    a. gunicorn を nginx の背後に配置することをお勧めします。最前線での dotcloud のロード バランサーのコンテキストでは、これはまだ真実ですか?

    b. DoS 攻撃の対象になるとは思わない場合でも、gunicorn を nginx の背後に配置することは重要ですか?

上記の Ken Cochrane のコメントから、dotcloud インフラストラクチャ自体が、nginx が DIY セットアップで通常提供する安全性を提供すると考えています。したがって、この特別なケースでは、これは確かに「問題ありません」でした。ただし、一般的には、nginx の背後に gunicorn が必要であり、そのセットアップで websocket を確実に実行できます。

  1. セットアップを試みたので、UNIX ソケットを介して Websocket を実行することは可能ですか?

はい。これは、 nginx を使用したガンコーン展開スキームに関する良いリファレンスです。Websocket については、必ずそのセクション全体を読み、以下を含めてください。proxy_buffering off;

  1. UNIX ソケットは dotcloud のスケーリングを壊しますか?

私の理解では、ソケットとポートはどちらも同じように機能するはずです。

于 2015-11-12T13:42:19.140 に答える