gpt4 book ai didi

django - Gunicorn、nginx(v 1.3.14)、django 和 gevent-socket.io,位于 dotcloud

转载 作者:行者123 更新时间:2023-12-03 01:41:27 26 4
gpt4 key购买 nike

我正在尝试在 dotcloud 上的 nginx(v 1.3.14)后面部署 Gunicorn + gevent。我对此有几个疑问。我的目标是适应 python-on-dotcloud例子。到目前为止,我还无法让 websockets 部分与此设置一起使用。换句话说,我必须手动刷新页面才能获取更新,而不是通过 socket.io。这对我来说都是新鲜事,所以这可能完全是菜鸟错误。这是related question .

以下是我对 python-on-dotcloud 示例所做的更改。

  1. 显然 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"

  2. 我将gunicorn设置为绑定(bind)到unix套接字,然后从nginx.conf设置proxy_pass,以使用proxy_pass http://appserver;将流量上游发送到gunicorn,其中我有定义的应用程序服务器。

  3. 我正在使用 gevent-socket.io 运行一个 django 应用程序,无需运行 nginx 即可正常工作。 (我只是将gunicorn绑定(bind)到dotcloud.yml中的0.0.0.0:$PORT_WWW)

我的问题是这些。

  1. 我是否在尝试解决一个非问题?

    a.我已经阅读了大量建议将 Gunicorn 放在 nginx 后面的文章。在前线的 dotcloud 负载均衡器的背景下,这仍然是真的吗?

    b.如果我预计不会受到 DoS 攻击,那么将 Gunicorn 放在 nginx 后面还重要吗?

  2. 是否可以像我尝试设置的那样通过 unix 套接字运行 websockets?

  3. unix 套接字会破坏 dotcloud 上的缩放吗?

  4. 如果我需要使用端口,该如何设置?我不认为我可以在同一个应用程序中分配两个 http 端口。如果我将其分成两个应用程序,那么我不确定如何将 PORT_WWW 环境变量从 Gunicorn 应用程序传递到 nginx 应用程序,以便它最终可用于 nginx 安装后脚本,从而在生成的 nginx.conf 中可用。

  5. 对于为什么这不能按原样工作有什么想法吗?

我在下面包含了三个配置文件。让我知道其他人是否会提供帮助。谢谢!

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

最佳答案

我在上面提出了 5 个相关问题,我将尝试在这里回答前 3 个问题。 (我对 dotcloud 的基础了解不够,无法回答最后两个问题)。我还预计大多数人发现这个问题主要集中在带有gunicorn和nginx的websocket上(较少关注dotcloud细节)。对于这些人,您可以跳转到此处的引用设置:gunicorn deployment scheme with nginx

  1. Am I trying to solve a non-problem?

    a. I've done a fair amount of reading where it's advised to put gunicorn behind nginx. In the context of dotcloud's load balancers on the front line, is this still true?

    b. If I don't expect that I'll be subject to a DoS attack, is it still important to put gunicorn behind nginx?

根据 Ken Cochrane 上面的评论,我相信 dotcloud 基础设施本身提供了 nginx 通常在 DIY 设置中提供的安全性。因此,在这种特殊情况下,这确实是“没问题的”。然而,一般来说,您确实希望在 nginx 后面使用 Gunicorn,并且您绝对可以使用该设置运行 websockets。

  1. Is it possible to run websockets through a unix socket as I have attempted to setup?

是的。这是 gunicorn deployment scheme with nginx 的一个很好的引用。 。对于 Websocket,请务必阅读整个部分并包含 proxy_buffering off;

  1. Will the unix sockets break scaling on dotcloud?

我的理解是套接字和端口应该同样工作。

关于django - Gunicorn、nginx(v 1.3.14)、django 和 gevent-socket.io,位于 dotcloud,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15297184/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com