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()
Ответы
Ответ 1
Я задал 5 связанных вопросов выше, и я постараюсь ответить на первые 3 здесь. (Я не знаю достаточного количества точек, чтобы ответить на два последних вопроса). Я также ожидаю, что большинство людей, которые находят эти вопросы, сосредоточены главным образом на веб-сайтах с пулеметом и nginx (и меньше на точечных подробностях). Для этих людей вы можете перейти к эталонной настройке здесь: схема развертывания пушки с nginx
-
Я пытаюсь решить проблему без проблем?
а. Я достаточно читал, где он советовал стрельба позади nginx. В контексте балансировщика нагрузки dotcloud линия фронта, это все еще верно?
б. Если я не ожидаю, что я подвергнуся атаке DoS, все равно важно поставить пушкик за nginx?
Из комментария Кена Кокрена выше, я считаю, что инфраструктура dotcloud сама по себе обеспечивает безопасность, которую nginx обычно предоставляет в настройке DIY. Поэтому в этом частном случае это действительно было "не проблема". Однако, в общем, вы хотите, чтобы gunicorn за nginx, и вы можете определенно запустить websockets с этой настройкой.
- Можно ли запускать websockets через unix-сокет, как я пытался настроить?
Да. Вот хорошая ссылка на схему развертывания пушки с nginx. Для веб-сайтов обязательно прочитайте весь этот раздел и включите proxy_buffering off;
- Разблокируют ли unix-сокеты масштабирование в dotcloud?
Я понимаю, что сокеты и порты должны работать одинаково хорошо.