dotcloudのnginx(v 1.3.14)の背後にgunicorn+geventをデプロイしようとしています。それについていくつか質問があります。私はpython-on-dotcloudの例を適応させることを目指しています。これまでのところ、このセットアップでWebSocket部分を機能させることはできませんでした。つまり、socket.ioを介してではなく、手動でページを更新して更新を取得する必要があります。これはすべて私にとってはかなり新しいので、まったくのnoobエラーである可能性があります。これが関連する質問です。
python-on-dotcloudの例に加えた変更は次のとおりです。
どうやらnginx(バージョン1.3.13以降)はWebソケットをサポートしています。この開発バージョンを指すように、python-on-dotcloudの例からビルダースクリプトを更新しました。
nginx_download_url="http://nginx.org/download/nginx-1.3.14.tar.gz"
UNIXソケットにバインドするようにgunicornを設定してから、nginx.confからproxy_passを設定して、
proxy_pass http://appserver;
appserverを定義した場所でトラフィックをgunicornにアップストリームで送信します。nginxを実行しなくても正常に動作するgevent-socket.ioを使用してdjangoアプリを実行しています。(私はgunicornをdotcloud.ymlの0.0.0.0:$ PORT_WWWにバインドするだけです)
私の質問はこれらです。
私は問題のないものを解決しようとしていますか?
a。gunicornをnginxの後ろに置くことをお勧めするところで、かなりの量の読書をしました。最前線にあるdotcloudのロードバランサーのコンテキストでは、これはまだ本当ですか?
b。DoS攻撃を受けるとは思わない場合でも、gunicornをnginxの背後に配置することは重要ですか?
セットアップを試みたときに、UNIXソケットを介してWebSocketを実行することは可能ですか?
UNIXソケットはdotcloudのスケーリングを壊しますか?
代わりにポートを使用する必要がある場合、どのように設定しますか?同じアプリで2つのhttpポートを割り当てることはできないと思います。それを2つのアプリに分割した場合、PORT_WWW環境変数をgunicornアプリからnginxアプリに渡して、最終的にnginxポストインストールスクリプトで使用できるようにし、結果としてnginx.confで使用できるようにする方法がわかりません。
なぜこれがそのまま機能しないのかについてのアイデアはありますか?
以下に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()