【问题标题】:Restart nginx without sudo?没有sudo重启nginx?
【发布时间】:2011-03-01 23:07:30
【问题描述】:

所以我希望能够在无需输入任何密码的情况下进行 cap:deploy。我已经设置了所有私钥,所以我可以很好地访问远程服务器,现在我在 ssh 上使用 svn,所以那里没有密码。

我有最后一个问题,我需要能够重新启动 nginx。现在我有 sudo /etc/init.d/nginx 重新加载。这是一个问题 b/c 它使用 capistrano 密码,我刚刚删除的那个 b/c 我正在使用密钥。关于如何在没有密码的情况下重新启动 nginx 的任何想法?

【问题讨论】:

  • 这类问题最好在serverfault.com 上解决。另外,查看courtesan.com/sudo/man/sudoers.html#nopasswd_and_passwd 了解如何使用 sudo 删除某些命令的密码。
  • 你确定需要重启 Nginx 吗?如果您使用Passenger 为Rails 等Rack 应用程序提供服务,在发布目录中运行touch tmp/restart.txt 应该让Passenger 知道它需要重新启动。

标签: nginx deployment capistrano


【解决方案1】:

我刚刚花了一个小时查看 sudoer 通配符之类的东西,试图解决这个确切的问题。事实上,你真正需要的只是一个重启 nginx 的根可执行脚本。

将此添加到 /etc/sudoers 文件中

username hostname ALL=NOPASSWD: /path/to/script

以root身份编写脚本

#! /bin/bash
/bin/kill -HUP `cat /var/run/nginx.pid`

使脚本可执行

测试。

sudo /path/to/script

【讨论】:

  • 那……太美了!多么了不起的解决方案!我已经使用 capistrano 两年了,并没有意识到这是可能的。
  • @nathan.f77 这正是我所需要的。
  • 如果有人入侵了运行应用程序的帐户,他们是否能够编辑此脚本并以 root 身份运行任意命令?
  • 您需要将脚本设置为可由包含应用用户的适当组执行,但不能由除 root 之外的任何人写入。可能也不希望它在世界上可执行。
  • @Leo - 我来晚了,但为什么你需要它由一个组而不是应用程序用户执行?
【解决方案2】:

有一个better answer on Stack Overflow不涉及编写自定义脚本:

最佳做法是使用/etc/sudoers.d/myuser

/etc/sudoers.d/ 文件夹可以包含多个文件,允许用户 使用 sudo 调用东西而不是 root。

该文件通常包含一个用户和用户执行的命令列表 无需指定密码即可运行。

说明:

在所有命令中,将 myuser 替换为您要用于在不使用 sudo 的情况下重新启动 nginx 的用户名。

  1. 为您的用户打开 sudoers 文件:

    $ sudo visudo -f /etc/sudoers.d/myuser
    
  2. 编辑器将打开。在那里粘贴以下行。这将允许该用户运行 nginx 启动、重启和停止:

    myusername ALL=(ALL) NOPASSWD: /usr/sbin/service nginx start,/usr/sbin/service nginx stop,/usr/sbin/service nginx restart
    
  3. 点击 ctrl+o 保存。它将询问您要保存的位置,只需按 enter 确认默认设置。然后使用 ctrl+x 退出编辑器。

现在您可以在没有密码的情况下重新启动(以及启动和停止)nginx。让我们试试吧。

  1. 打开新会话(否则,您可能根本不会被要求输入 sudo 密码,因为它没有超时):

    $ ssh myusername@myserver
    
  2. 停止 nginx

    $ sudo /usr/sbin/service nginx stop
    
  3. 通过检查您的网站或运行ps aux | grep nginx来确认nginx已停止@

  4. 启动 nginx

    $ sudo /usr/sbin/service nginx start
    
  5. 通过检查您的网站或运行ps aux | grep nginx确认 nginx 已启动

PS:请务必使用sudo /usr/sbin/service nginx start|restart|stop,而不是sudo service nginx start|restart|stop

【讨论】:

  • 很好的解决方案。看起来你可以省略/usr/sbin/。至少它可以在我没有的环境中工作。
  • sudo /usr/sbin/service nginx restart 为我工作。
【解决方案3】:

Rails_App/lib/capistrano/tasks/nginx.rake 中创建一个 rake 任务并粘贴以下代码。

namespace :nginx do
  %w(start stop restart reload).each do |command|
    desc "#{command.capitalize} Nginx"
    task command do
      on roles(:app) do
        execute :sudo, "service nginx #{command}"
      end
    end
  end
end

然后ssh到你的远程服务器并打开文件

  sudo vi /etc/sudoers

并粘贴这一行(%sudo ALL=(ALL:ALL) ALL 行之后)

  deploy ALL=(ALL:ALL) NOPASSWD: /usr/sbin/service nginx *

或者,就像你的情况,

  deploy ALL=(ALL:ALL) NOPASSWD: /etc/init.d/nginx *

这里我假设您的部署用户是deploy

您也可以在此处添加其他不需要输入密码的命令。例如

  deploy ALL=(ALL:ALL) NOPASSWD: /usr/sbin/service nginx *, /etc/init.d/mysqld, /etc/init.d/apache2

【讨论】:

    猜你喜欢
    • 2023-04-08
    • 1970-01-01
    • 2015-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-06
    • 2016-08-16
    • 1970-01-01
    相关资源
    最近更新 更多