5

我有一个基于 Django 和 Python 2.6 构建的新网站,我已将其部署到云端(符合流行语且 Amazon micro EC2 实例是免费的!)。
这是我的详细说明:https ://docs.google.com/document/d/1qcZ_SqxNcFlGKNyp-CXqcFxXXsKs26Avv3mytXGCedA/edit?hl=en_US

由于这是一个新站点(并且想使用最新最好的),我在 Supervisor 之上使用了 Nginx 和 Gunicorn。
使用 YUM / easy_install 从主干安装的所有软件。
我的数据库是 Sqlite(目前 - 不确定下一步该去哪里,但这不是问题)。也在待办事项列表上:virtualenv + pip。
到现在为止还挺好。
我在 SVN 中的代码。我写了一个简单的 fabfile 来部署 - 检查最新的代码并通过 Supervisor 重新启动 Gunicorn。我将我的 DNS 名称与一个弹性 IP 挂钩。
有用。

我的问题是,如何在不中断服务的情况下更新网站?当我运行我的小更新脚本时,该站点的用户会得到 404s / 500s。

有没有办法在不添加另一台服务器的情况下做到这一点(价格是关键)?

我很想拥有一个登台系统(在不同的端口上?)以及登台和生产之间的无缝切换。在同一(免费)服务器上。通过织物。
我怎么做?运行两个站点的 Nginx 是否相同?我可以在不影响生产的情况下升级暂存吗?fabfile 会是什么样子?目录树会是什么样子?

谢谢!

塔尔。

有关的:

4

2 回答 2

3

Nginx 允许您为反向代理设置故障转移,您可以将一个 gunicorn 实例作为主要实例,只要该版本正在运行,它就永远不会查看故障转移。

如果您将站点配置为使新版本位于故障转移实例中,您只需编写 fab 文件以使用站点的新版本更新故障实例,然后在准备就绪时关闭主实例。Nginx 将无缝地故障转移到第二个实例,并且您正在新版本上运行,无需停机。

然后,您可以更新主要版本,然后重新打开它,您的主要版本现在已经上线。此时,您可以保持故障转移实例运行以防万一,或者将其关闭。

有些事情要考虑。您必须小心数据库,如果您使用的是 sqllite,请确保两个 gunicorn 实例都可以访问 sqllite 文件。

如果您有一个普通的数据库,这不是问题,您只需要确保在切换到新版本之前应用了新版本所需的任何数据库迁移。

如果它们是向后兼容的更改,那么这没什么大不了的。如果它们不向后兼容,那么要小心,您可以在切换到新版本之前破坏旧版本的站点。

为了让事情变得更容易,我会在不同的虚拟环境中运行这些版本。

如果您使用 supervisord 来控制 gunicorn,那么您可以使用 supervisorctl 命令重新加载/重新启动您要部署的任何实例,而不会影响另一个实例。

希望有帮助

这是 nginx 配置的示例(不是完整的配置文件,删除了不重要的部分)

这假设主要 gunicorn 实例在端口 9005 上运行,另一个在端口 9006 上运行

upstream service-backend {
    server localhost:9005;        # primary
    server localhost:9006 backup; # only used when primary is down
}

server {
    listen 80;
    root /opt/htdocs;
    server_name localhost;

    access_log /var/logs/nginx/access.log;
    error_log  /var/logs/nginx/error.log;

    location / {
        proxy_pass http://service-backend;
    }
}
于 2011-06-21T10:37:41.967 回答
1

听起来您需要弄清楚如何告诉 gunicorn优雅地重新启动。似乎您所要做的就是在通知重新加载应用程序时向 gunicorn 进程发出 HUP。如链接中所述,gunicorn docs解释了如何做到这一点。

于 2011-06-21T08:06:49.313 回答