我有一个基于Django和Python 2.6构建的新网站,我已将其部署到云端(符合流行语和Amazon micro EC2实例是免费的!).
以下是我的详细说明:https://docs.google.com/document/d/1qcZ_SqxNcFlGKNyp-CXqcFxXXsKs26Avv3mytXGCedA/edit?hl=en_US
由于这是一个新网站(并且想要玩最新最好的网站),我在主管之上使用了Nginx和Gunicorn.
使用YUM / easy_install从主干安装的所有软件.
我的数据库是sqlite(现在 – 不确定下一步该去哪,但这不是问题).同样在待办事项清单上:virtualenv pip.
到现在为止还挺好.
我的代码在SVN中.我写了一个简单的fabfile来部署 – 检查出最新的代码并通过Supervisor重新启动Gunicorn.我将我的DNS名称挂钩到弹性IP.
有用.
我的问题是,如何在不中断服务的情况下更新网站?当我运行我的小更新脚本时,该站点的用户获得404s / 500s.
有没有办法在不添加其他服务器的情况下执行此操作(价格是关键)?
我希望有一个临时系统(在不同的端口上?)和在分段和生产之间的无缝切换.在同一个(免费)服务器上.通过面料.
我怎么做?运行两个网站的Nginx是一样的吗?我可以在不损害生产的情况下升级分段吗? fabfile会是什么样子?目录树会是什么样子?
谢谢!
塔尔.
有关:
如果您配置站点以使新版本位于故障转移实例中,则只需编写fab文件以使用新版本的站点更新故障实例,然后在准备好后关闭主实例. Nginx将无缝故障转移到第二个实例,而bam您运行的新版本没有停机时间.
然后,您可以更新主版本,然后重新打开它,您的主版本现已上线.此时,您可以保持故障转移实例运行以防万一,或将其关闭.
有些事情需要考虑.您必须小心数据库,如果您使用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;
}
}