“sudo service nginx start”失败但“sudo nginx”有效 - 不知道为什么

Pau*_*ick 7 nginx upstart ubuntu-12.04

我有一个接近新的服务器,并且在按预期启动 nginx 时遇到问题。我已经以基本相同的方式配置了另一台服务器,它在那里工作。我想这两者之间肯定存在一些环境差异,但我一直没能找到它。

简短版本:

Starts - sudo nginx
Fails - sudo service nginx start
Fails - sudo service nginx restart
works - sudo service nginx stop
Run Code Online (Sandbox Code Playgroud)

当命令失败时,他们实际上并没有说什么:

 * Restarting nginx nginx                                                [fail]
Run Code Online (Sandbox Code Playgroud)

日志文件中没有其他内容(nginx[访问或错误]、系统日志)或写入屏幕

更多细节:

都说配置文件没问题

sudo service nginx configtest
sudo nginx -t
Run Code Online (Sandbox Code Playgroud)
  • 我检查了 nginx.conf 的权限,它们没问题(与工作服务器相同)再次检查 www-data 是否可以访问日志文件等,确实如此

  • /etc/init.d/nginx 文件在两台服务器上是相同的,所使用的命令也是如此(见上文)

  • 日志文件确实存在

  • 用户/组 www-data 确实存在

  • Ubuntu 12.04 LTS

  • nginx 1.6

  • 在每个服务器上运行请求的 - sudo strace service nginx start 除了下面的第一部分之外,我在两个不同的服务器上看到的唯一其他区别是指针和 PID 之类的东西。我在每组的两行前面加上了 ***

==== 那个有效的

clone(child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7fd6076a09d0) = 24394
close(4)                                = 0
*** read(3, "/run/nginx.pid\n", 128)        = 15

(… snip till the bottom…)

*** rt_sigreturn(0x11)                      = 24396
dup2(11, 2)                             = 2
close(11)                               = 0
read(10, "", 8192)                      = 0
exit_group(0)                           = ?
Run Code Online (Sandbox Code Playgroud)

================ 失败者

clone(child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7f067e79d9d0) = 21761
close(4)                                = 0
*** read(3, "/run/nginx.pid\nserver_name\n", 128) = 27

(… snip till the bottom…)

*** rt_sigreturn(0x11)                      = 21763
dup2(11, 2)                             = 2
close(11)                               = 0
read(10, "", 8192)                      = 0
exit_group(0)                           = ?
Run Code Online (Sandbox Code Playgroud)

小智 9

我遇到了类似的情况,这是因为该端口已被另一个服务使用。

我是怎么发现的?

尝试跑步

sudo nginx
Run Code Online (Sandbox Code Playgroud)

而不是将其作为服务启动,它应该显示错误消息。


chi*_*cks 0

日志文件和父目录是否由 拥有或可读www-data?您想要提供服务的文件、目录和父目录是否属于 或 可以读取www-data

你可以试试strace。如果是这样运行:

sudo strace service nginx start

这将产生大量的输出。在接近尾声的地方,您可能会看到权限错误。将 strace 输出保存到文件中并通过该文件进行 grep 可能会更容易。

另一种选择是切换到www-data用户,看看在手动读取/写入日志文件或读取您想要服务的其他文件时是否出现任何错误。即使www-data外壳很差,你也可以这样做:

sudo su -s /bin/bash www-data

如果您whoami在该 shell 中运行,它应该显示www-data.