2011-06-21 11 views
5

我有一个基于Django和Python 2.6构建的新网站,我已经部署到云中(buzzword兼容并且Amazon micro EC2实例是免费的!)。
这里是我的详细注释:https://docs.google.com/document/d/1qcZ_SqxNcFlGKNyp-CXqcFxXXsKs26Avv3mytXGCedA/edit?hl=en_USDjango无缝部署到单个服务器

由于这是一个新的网站(和想要用最新最好的发挥)我用的Nginx和Gunicorn对监事的顶部。
使用YUM/easy_install从中继安装的所有软件。
我的数据库是Sqlite(现在 - 不知道下一步该去哪里,但这不是问题)。还在待办事项列表中:virtualenv + pip。
到目前为止这么好。
我的代码在SVN中。我写了一个简单的fabfile来部署 - 检查最新的代码并通过Supervisor重新启动Gunicorn。我将我的DNS名称挂接到弹性IP。
它的工作原理。

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

有没有办法做到这一点,而无需添加另一台服务器(价格是关键)?

我很想有一个分期系统(在不同的端口上?)以及分期和生产之间的无缝切换。在同一台(免费)服务器上。通过织物。
我该怎么做?这两个网站运行相同的Nginx吗?我可以升级舞台而不伤害制作吗? fabfile是什么样的?目录树是什么样的?

谢谢!

Tal。

相关:

+0

对于任何人阅读“EC2 Micro是免费的”:它不是真的(至少不再是)。首750小时免费,约为20美元。结账其他[ASW免费优惠](http://aws.amazon.com/free/).. – Stefano

回答

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; 
    } 
} 
+0

如何配置Nginx来做到这一点?这里是我的Nginx配置:http://pastebin.com/xdYxPeS2我可以让两个Gunicorns并行运行,监听不同的端口(分段/制作)并仍然按照您所描述的方式切换吗? –

+0

添加了nginx示例配置。是的,你可以让他们同时在不同的端口上运行。做到这一点的最佳方式是使用supervisord或其他流程管理器。 –

+0

这确实让我有2个gunicorns,每个都有不同的SW,并且让Nginx管理切换,因为我用 Supervisorctl杀死了正在运行的Gun​​icorn。但是,如何测试运行新软件的备份服务器?它与外界没有联系。 Nginx在这个配置中是不是唯一的端口80? –

1

听起来像是你需要弄清楚如何告诉gunicorn到gracefully restart。看起来你所要做的就是发出一个HUP给gunicorn进程,何时通知重新加载应用程序。如链接所述,gunicorn docs解释如何做到这一点。

+0

Gunicorn“优雅地”优雅地重启?是否所有网站用户都继续进行,好像什么都没有发生?当Nginx发送作业到Gunicorn端口并且没有人在听(短时间)时,这是如何工作的?此外,这并没有解决源代码升级 - 新的Gunicorn实例如何知道运行新代码? –

+0

通常,“优雅重启”是指在重新启动时不会丢失任何请求。我读过一些有关独角兽的资料,而且枪口是它的一个端口。我相信在您发出SIGHUP时正在处理的请求会在您的新代码被启动时完成处理。而且,独角兽的设计只有当工作人员“准备就绪”时,工作进程才从请求队列中拉出。此博客文章提到它:https://github.com/blog/517-unicorn ...此链接也描述了优雅重新启动功能:http://tomash.wrug.eu/2010/01/30/the- awesomeness-of-unicorn.html – pcting

+0

我想补充的另一件事与Ken的回应有些相关......我会在所有上游的gunicorn服务器上执行滚动重启,以便您的gunicorn服务器不会因未处理的请求和加载而过载新工人。 – pcting