没有sudo重启nginx?

时间:2010-06-10 01:20:39

标签: nginx deployment capistrano

所以我希望能够限制:部署而无需输入任何密码。我已经设置了所有私钥,所以我可以很好地到达远程服务器,现在我在ssh上使用svn,所以没有密码。

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

3 个答案:

答案 0 :(得分:42)

我花了一个小时看着sudoer通配符等试图解决这个确切的问题。事实上,你真正需要的是一个重启nginx的root可执行脚本。

将其添加到/ etc / sudoers文件

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

以root身份编写脚本

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

使脚本可执行

测试。

sudo /path/to/script

答案 1 :(得分:10)

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 进行保存。它将询问您要保存的位置,只需按输入即可确认默认值。然后使用 ctrl + x 退出编辑器。

  4. 现在您可以在没有密码的情况下重启(并启动和停止)nginx。我们来试试吧。

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

      $ ssh myusername@myserver
      
    2. 停止nginx

      $ sudo /usr/sbin/service nginx stop
      
    3. 通过查看您的网站或运行ps aux | grep nginx

    4. 确认nginx已停止
    5. 启动nginx

      $ sudo /usr/sbin/service nginx start
      
    6. 通过查看您的网站或运行ps aux | grep nginx

    7. 确认nginx已启动

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

答案 2 :(得分:0)

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