Подтвердить что ты не робот

Gunicorn, nginx (v 1.3.14), django и gevent-socket.io, на dotcloud

Я пытаюсь развернуть gunicorn + gevent за nginx (v 1.3.14) на dotcloud. У меня есть несколько вопросов. Я пытаюсь адаптировать пример python-on-dotcloud. До сих пор мне не удалось получить часть веб-камер, работающую с этой настройкой. Другими словами, я должен обновлять свои страницы вручную, чтобы получать обновления, а не через socket.io. Для меня это совсем не ново, поэтому это может быть полная ошибка noob. Вот вопрос .

Вот изменения, которые я сделал для примера python-on-dotcloud.

  • По-видимому nginx (начиная с версии 1.3.13) поддерживает веб-сокеты. Я обновил конструктор script из примера python-on-dotcloud, чтобы указать на эту версию разработки: nginx_download_url="http://nginx.org/download/nginx-1.3.14.tar.gz"

  • Я установил gunicorn для привязки к сокету unix, а затем настроил proxy_pass из nginx.conf, чтобы отправить трафик вверх по потоку к стрельбе с помощью proxy_pass http://appserver;, где я определил сервер приложений.

  • Я запускаю приложение django с gevent-socket.io, которое отлично работает без запуска nginx. (Я просто связываю gunicorn с 0.0.0.0:$PORT_WWW в dotcloud.yml)

мои вопросы таковы.

  • Я пытаюсь решить проблему без проблем?

    а. Я проделал довольно много чтения, где он посоветовал поставить пушку из-за nginx. В контексте балансировщика нагрузки dotcloud на передней линии это все еще верно?

    б. Если я не ожидаю, что я подвергнуся атаке DoS, все-таки важно поставить пушку из-за nginx?

  • Можно ли запускать websockets через unix-сокет, как я пытался настроить?

  • Разблокирует ли unix-сокеты масштабирование на dotcloud?

  • Если мне нужно использовать порты вместо этого, как это установить? Я не думаю, что могу выделить два порта http в одном приложении. Если я разделил его на два приложения, то я не уверен, как передать переменную среды PORT_WWW из приложения gunicorn в приложение nginx, чтобы он оказался доступным для nginx postinstall script и, следовательно, в результате 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()
4b9b3361

Ответ 1

Я задал 5 связанных вопросов выше, и я постараюсь ответить на первые 3 здесь. (Я не знаю достаточного количества точек, чтобы ответить на два последних вопроса). Я также ожидаю, что большинство людей, которые находят эти вопросы, сосредоточены главным образом на веб-сайтах с пулеметом и nginx (и меньше на точечных подробностях). Для этих людей вы можете перейти к эталонной настройке здесь: схема развертывания пушки с nginx

  • Я пытаюсь решить проблему без проблем?

    а. Я достаточно читал, где он советовал стрельба позади nginx. В контексте балансировщика нагрузки dotcloud линия фронта, это все еще верно?

    б. Если я не ожидаю, что я подвергнуся атаке DoS, все равно важно поставить пушкик за nginx?

Из комментария Кена Кокрена выше, я считаю, что инфраструктура dotcloud сама по себе обеспечивает безопасность, которую nginx обычно предоставляет в настройке DIY. Поэтому в этом частном случае это действительно было "не проблема". Однако, в общем, вы хотите, чтобы gunicorn за nginx, и вы можете определенно запустить websockets с этой настройкой.

  1. Можно ли запускать websockets через unix-сокет, как я пытался настроить?

Да. Вот хорошая ссылка на схему развертывания пушки с nginx. Для веб-сайтов обязательно прочитайте весь этот раздел и включите proxy_buffering off;

  1. Разблокируют ли unix-сокеты масштабирование в dotcloud?

Я понимаю, что сокеты и порты должны работать одинаково хорошо.