Capistrano + thin + nginx用户不允许sudo howto?

时间:2008-10-01 10:06:12

标签: ruby-on-rails nginx capistrano thin

我有一个这样的场景,我想使用capistrano在rails应用程序上部署我的ruby:

  1. Web应用程序位于瘦群集上,配置文件存储在/ etc / thin下。初始脚本也在/etc/init.d/thin中,因此只要我的服务器需要重启,它就会自动启动
  2. 此外,nginx的执行方式相同(作为init脚本守护程序)
  3. 为了确保万一有人攻击我的网络服务器,我不希望他们做太可怕的事情,所以网络用户不允许sudo。
  4. Thin和nginx都作为webuser运行以强制执行此类安全性
  5. 现在当我需要进行部署时,我需要将文件安装在/ home / webuser / railsapps / helloworld下,然后我需要使用cap脚本重新启动我的瘦身。我想保留webuser拥有的所有文件,因此cap脚本主用户作为webuser运行。现在,当我想重新启动瘦守护进程时出现问题,因为webuser无法sudo。

    我在想是否可以调用两个单独的会话 - 用于文件部署的webuser,然后是一个特殊的sudoer来重启守护进程。任何人都可以给我一个示例脚本吗?

5 个答案:

答案 0 :(得分:4)

这可能不是你想要的,但你可以在你的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 ...

答案 1 :(得分:1)

为什么不在部署例程中使用sudo然后在RAILS_ROOT上使用-R?您可以告诉Capistrano在将版本别名为current之前更改所有权。

答案 2 :(得分:0)

另一种方法是将nginx作为普通用户运行,比如在端口8080上,然后使用IPTables将请求从端口80重定向到端口8080,从内存

iptables -A PREROUTING -t tcp -m tcp -p 80 -j DNAT --dport 8080

将所有发往端口80的数据包发送到端口8080,可以绑定为普通用户。

答案 3 :(得分:0)

如果您作为webuser运行Thin,那么webuser是否可以不结束该过程?你可以在没有守护进程的情况下重新启动Thin,只要你在/ etc / thin中传递服务器的一切就可以了。据我所知,该守护进程只是一种绕过手动启动程序的方便方法。

你必须编辑/ etc / thin的内容时,唯一一次你会被解开。假设您正在对webuser的thin.yml位使用别名,这只会在您想要添加/删除程序时发生。发生这种情况时,手动添加/删除别名可能是值得的。

这都假设webuser可以结束Thin进程开始。我不知道。上次这对我来说是一个问题,当时我没有办法在我的本地机器上运行应用程序,因为它的实现几乎与服务器的布局有关。每次我编辑的东西,我都必须将它发送到SVN,将终端中的标签切换到ssh shell,从SVN拉出它,将标签切换到另一个ssh并重新启动守护程序,看看我是否打破了它。它让我失望,所以我在本地安装了Thin,让应用程序读取配置文件,现在我只需要每隔几天上传一次。

答案 4 :(得分:0)

刚刚注意到你不允许用户sudo :-)这个答案会帮助其他人:

派对有点晚了,但我刚做完了:

namespace :deploy do
  desc "Start the Thin processes"
    task :start do
      run "cd #{current_path} && bundle exec sudo thin start -C /etc/thin/dankit.yml"
    end

    desc "Stop the Thin processes"
    task :stop do
      run "cd #{current_path} && bundle exec sudo thin stop -C /etc/thin/dankit.yml"
    end

    desc "Restart the Thin processes"
    task :restart do
      run "cd #{current_path} && bundle exec sudo thin restart -C /etc/thin/dankit.yml"
    end

end

bundle exec sudo thin start添加sudo。