2

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

  1. Web 应用程序位于一个瘦集群上,配置文件存储在 /etc/thin 下。在 /etc/init.d/thin 中还有一个 init 脚本,因此只要我的服务器需要重新启动,它就会自动启动
  2. nginx 也以同样的方式执行(作为一个 init 脚本守护进程)
  3. 为了确保万一有人入侵了我的网络服务器,我不希望他们做一些太可怕的事情,所以不允许网络用户使用 sudo。
  4. Thin 和 nginx 都以网络用户身份运行以强制执行此类安全性

现在,当我需要进行部署时,我需要将文件安装在 /home/webuser/railsapps/helloworld 下,然后我需要 cap 脚本重新启动我的瘦身。我想保留网络用户拥有的所有文件,因此 cap 脚本主要用户以网络用户身份运行。现在当我想重新启动瘦守护程序时出现问题,因为 webuser 不能 sudo。

我正在考虑是否可以调用两个单独的会话- webuser 进行文件部署,然后调用一个特殊的 sudoer 来重新启动守护进程。谁能给我一个示例脚本?

4

5 回答 5

4

这可能不是您想要的,但您实际上可以在 sudoers 文件中执行以下操作:

someuser ALL=NOPASSWD: /etc/init.d/apache2

这让 someuser 运行 /etc/init.d/apache2

如果您尝试做其他事情:

$ sudo ls
[sudo] password for someuser: 
Sorry, user someuser is not allowed to execute '/bin/ls' as root on ...
于 2008-10-01T10:11:01.717 回答
1

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

于 2008-10-12T00:15:42.303 回答
0

如果您以网络用户身份运行 Thin,那么网络用户可以不结束进程吗?您可以在没有守护程序的情况下再次重新启动 Thin,只要您将 /etc/thin 中的所有内容传递给服务器就可以了。据我所知,守护进程只是一种绕过在启动时手动启动程序的便捷方式。

唯一会遇到困难的时候是您必须编辑 /etc/thin 的内容。假设您对网络用户的 thin.yml 位使用别名,这只会在您想要添加/删除程序时发生。发生这种情况时,可能值得手动添加/删除别名。

这一切都假设网络用户可以结束瘦进程开始。别的我不知道。上次对我来说是个问题是当我没有办法在本地机器上运行应用程序时,因为它的实现几乎与服务器的布局相关联。每次我编辑某些东西时,我都必须将其发送到 SVN,将终端中的选项卡切换到 ssh shell,将其从 SVN 拉出,将选项卡切换到另一个 ssh,然后重新启动守护程序,看看我是否破坏了它。这让我很沮丧,所以我在本地安装了 Thin,让应用程序读取配置文件,现在我只需每隔几天上传一次。

于 2009-07-19T03:06:27.963 回答
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

将 sudo 添加到bundle exec sudo thin start作品中。

于 2011-06-17T12:49:14.263 回答
0

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

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

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

于 2008-10-04T07:22:39.760 回答