我正在尝试在dotcloud上部署nginx(v 1.3.14)后面的gunicorn + gevent。我有几个问题。我的目标是调整python-on-dotcloud示例。到目前为止,我还没有能够使用此设置使用websockets部分。换句话说,我必须手动刷新页面以获取更新,而不是通过socket.io。这对我来说都很新鲜,所以它可能是一个总的noob错误。这是related question。
以下是我对python-on-dotcloud示例所做的更改。
显然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"
我设置了gunicorn绑定到unix套接字,然后从nginx.conf设置proxy_pass,将流量上行发送到带有proxy_pass http://appserver;
的gunicorn,我在其中定义了appserver。
我正在使用gevent-socket.io运行django应用程序,在没有nginx运行的情况下工作正常。 (我只是将gunicorn绑定到dotcloud.yml中的0.0.0.0:$PORT_WWW)
我的问题是这些。
我想解决一个没问题吗?
一个。我已经做了相当多的阅读,建议将枪支放在nginx后面。在dotcloud的前线负载平衡器的背景下,这仍然是真的吗?
湾如果我不期望我会受到DoS攻击,那么把枪支放在nginx后面仍然很重要吗?
我可以尝试设置通过unix套接字运行websockets吗?
unix套接字是否会破坏dotcloud上的缩放?
如果我需要使用端口,请如何设置?我不认为我可以在同一个应用程序中分配两个http端口。如果我将它拆分为两个应用程序,那么我不确定如何将来自gunicorn应用程序的PORT_WWW环境变量传递到nginx应用程序,以便它最终可用于nginx postinstall脚本,从而最终可用于生成的nginx.conf。 / p>
关于为什么这不起作用的任何想法?
我在下面包含了三个配置文件。让我知道其他人是否会有所帮助。 谢谢!
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()
答案 0 :(得分:1)
我上面提到了5个相关问题,我将尝试回答前3个问题。 (我不太了解dotcloud支持回答最后两个)。我也期望大多数人发现这个问题主要集中在带有gunicorn和nginx的websockets(而不是dotcloud细节)。对于这些人,您可以在此处跳转到参考设置:gunicorn deployment scheme with nginx
- 醇>
我试图解决一个没问题吗?
一个。我已经做了相当多的阅读,建议他们放置 nginx背后的枪声。在dotcloud的负载均衡器的背景下 前线,这仍然是真的吗?
湾如果我不期望我会受到DoS攻击,那么它是否仍然存在 把枪炮放在nginx后面很重要吗?
根据Ken Cochrane的评论,我相信dotcloud基础设施本身提供了nginx通常在DIY设置中提供的安全性。因此,在这种特殊情况下,这确实是一个非问题。"但是,一般来说,你确实需要在nginx后面使用gunicorn,你肯定可以使用该设置运行websockets。
- 是否可以通过unix套接字运行websockets,因为我试图设置?
醇>
是。这是gunicorn deployment scheme with nginx的一个很好的参考。对于websockets,请务必阅读整个部分并包含proxy_buffering off;
- unix套接字是否会破坏dotcloud上的缩放?
醇>
我的理解是套接字和端口都应该同样有效。