Capistrano + Thin + Nginx与用户不允许sudo howto吗?
我有一个这样的场景,我想使用capistrano将我的ruby部署在rails应用程序上:
- Web应用程序位于精简群集上,配置文件存储在/ etc / thin下。 /etc/init.d/thin中也有一个初始化脚本,因此只要我的服务器需要重启,它就会自动启动
- 另外,nginx的执行方式也相同(作为init脚本守护程序)
- 为了确保万一有人入侵了我的Web服务器,我不希望他们做得太可怕了,因此不允许Web用户使用sudo。
- Thin和Nginx都以Web用户身份运行以加强安全性
现在,当我需要进行部署时,我需要将文件安装在/ home / webuser / railsapps / helloworld下,并且我需要cap脚本随后重新启动我的瘦客户机。我想让所有文件都归Web用户所有,因此Cap脚本主要用户正以Web用户身份运行。现在,当我想重新启动精简守护程序时出现了问题,因为webuser不能sudo。
我在考虑是否有可能调用两个单独的sessionswebuser进行文件部署,然后调用一个特殊的sudoer来重新启动守护程序。谁能给我一个示例脚本吗?
解决方案
这可能不是我们想要的,但实际上我们可以在sudoers文件中执行以下操作:
someuser ALL=NOPASSWD: /etc/init.d/apache2
让某些用户运行/etc/init.d/apache2
如果我们尝试做其他事情:
$ sudo ls [sudo] password for someuser: Sorry, user someuser is not allowed to execute '/bin/ls' as root on ...
替代方法是以普通用户身份运行nginx,例如在端口8080上运行,然后使用IPTables将请求从端口80从内存重定向到端口8080
iptables -A PREROUTING -t tcp -m tcp -p 80 -j DNAT --dport 8080
将发往端口80的所有数据包发送到端口8080,该端口可以作为普通用户绑定。
为什么不将sudo用于部署例程,然后在RAILS_ROOT上使用chown -R?我们可以告诉Capistrano在将版本别名为当前版本之前更改所有权。
如果我们以网络用户身份运行Thin,那么网络用户可以结束进程吗?我们可以在没有守护程序的情况下再次重新启动Thin,只要我们将/ etc / thin中的所有内容传递给服务器就可以了。据我所知,守护程序只是绕过引导时手动启动程序的一种便捷方法。
唯一不会被卡住的时间是必须编辑/ etc / thin的内容时。假设我们对Web用户的thin.yml位使用别名,则只有在我们要添加/删除程序时才会发生这种情况。发生这种情况时,值得手动添加/删除别名。
所有这些都假设Web用户可以结束Thin过程开始。我不知道上次对我来说是一个问题,当时我没有办法在本地计算机上运行该应用程序,因为该应用程序的实现与服务器的布局密切相关。每次编辑内容时,我都必须将其发送到SVN,将终端中的选项卡切换到ssh shell,将其从SVN中拉出,将选项卡切换到另一个ssh,然后重新启动守护程序,然后查看是否破坏了它。它让我失望了,所以我在本地安装了Thin,让应用程序可以读取配置文件,现在我只需要每隔几天上传一次即可。