Nginx:在Ubuntu上,nginx的权限被拒绝。

90

我是新手系统管理员。在Ubuntu上安装nginx 通过puppet之后,我得到了以下输出:

[alert] could not open error log file: open() "/var/log/nginx/error.log" failed (13: Permission denied)

[warn] 1898#0: the "user" directive makes sense only if the master process runs with super-user privileges, ignored in /etc/nginx/nginx.conf:1

[emerg] 1898#0: open() "/var/log/nginx/access.log" failed (13: Permission denied)

我该如何摆脱所有这些信息?
我不想直接使用命令行(chown / chmod),并且每次创建新服务器时重复此过程。因此,我正在考虑在puppet清单中添加什么。
在这种情况下,最好的系统管理员实践是要更改/var/log/nginx的所有者/权限还是将日志存储在不同位置?如果chown / chmod是正确的方法,那么哪些特定权限能够确保最高级别的安全性?
我尝试了这个,但没有帮助:
  file { '/var/log/nginx':
    ensure  => directory,
    mode    => '0755',
    owner   => 'www-data',
    group   => 'www-data',
    recurse => true
  }

编辑:

vagrant@precise64:~$ ps aux | grep [n]ginx
root      1001  0.0  0.1  62908  1388 ?        Ss   08:47   0:00 nginx: master process /usr/sbin/nginx
www-data  1002  0.0  0.1  63260  1696 ?        S    08:47   0:00 nginx: worker process
www-data  1003  0.0  0.1  63260  1696 ?        S    08:47   0:00 nginx: worker process
www-data  1004  0.0  0.1  63260  1696 ?        S    08:47   0:00 nginx: worker process
www-data  1005  0.0  0.1  63260  1696 ?        S    08:47   0:00 nginx: worker process

你确定木偶代码已经应用了吗(例如使用 vagrant provision)? /etc/nginx/nginx.conf 使用 www-data 还是 nginx 来运行非主进程的 nginx? - Terry Wang
检查已运行的端口,如果 Nginx 端口 44380 如果它们被其他进程使用,则可能会导致类似的错误。使用命令 sudo netstat -tulpn 检查端口 80 或 443 是否被其他进程使用。 - Akhil S
12个回答

247

确保您以超级用户身份运行测试。

sudo nginx -t

否则测试将没有完成所需的所有权限。


这是否意味着只要 sudo nginx -t 正常工作且 Nginx 主进程具有 sudo 权限,就可以忽略 OP 提到的 3 个警告/提示? - user764754

47

在重启Nginx时,我遇到了类似的问题,并发现这是由于SeLinux引起的。请尝试在禁用SeLinux或使用下面的命令将其暂时设置为Permissive模式后再尝试:

setenforce 0

希望能对你有所帮助 :)


如果您对目录的权限设置正确并且非常确定,那么在selinux支持的发行版(如Redhat、Centos、Fedora等)中运行setenforce 0确实是一个非常有效的解决方法。 - jochem
如果你完全不关心安全,那么这是一个非常有效的答案... - miken32

40

如果我假设你的第二个代码是 Puppet 配置,那么我有一个逻辑解释,如果错误和日志文件之前已经创建好了,可以尝试这个方法。

sudo chown -R www-data:www-data /var/log/nginx;
sudo chmod -R 755 /var/log/nginx;

7
chmod 命令更改文件权限时,有一个潜在的安全问题 - 它会将所有日志文件设置为可执行文件。请尝试使用以下命令代替:sudo chmod -R u+X /var/log/nginx - Synchro
4
我绝不会这样做,因为这是一个安全漏洞。对于Apache也是同样的规则:日志必须由root拥有,而不是工作用户。 - scavenger

10

只是因为您没有访问该文件的权限,使用

chmod -R 755 /var/log/nginx;

或者您可以切换到sudo,然后执行该命令


1
你不希望除了root以外的任何人都能读取你的日志。 - Mike Doe
2
但是我想要以root身份运行nginx吗? - Daniel Patrick

9

如果您不想将 Nginx 作为 root 用户启动,可以按照以下步骤进行操作:

首先创建日志文件:

sudo touch /var/log/nginx/error.log

然后修复权限:

sudo chown -R www-data:www-data /var/log/nginx

sudo find /var/log/nginx -type f -exec chmod 666 {} \;

sudo find /var/log/nginx -type d -exec chmod 755 {} \;


5

允许查看日志文件的权限授予属于adm组的用户。

要在命令行中将用户添加到此组,请执行以下操作:

sudo usermod -aG adm <USER>

2
这种方法有什么缺点吗? - Ed Chapel
1
adm:adm组用于系统监控任务。该组的成员可以读取/var/log中的许多日志文件,并可以使用xconsole。从历史上看,/var/log曾经是/usr/adm(后来是/var/adm),因此得名该组。 - RenRen

2

在 Debian WSL(Windows Subsystem for Linux)上,我需要使用:

sudo chmod -R 775 /var/log/nginx

1

对我来说,我只是将selinux从强制模式更改为宽容模式,然后就能够启动nginx而没有任何错误。


禁用selinux会破坏selinux的目的。是的,这是一种快速实现目的的方法,但不一定是正确的方法。最好学习正确的使用selinux的方法。 - Farray
SELinux在生产环境中是上帝,在开发环境中则是魔鬼。 - noonex

0

发现一个好的描述该怎么做。

    # 支持以任意用户身份运行,该用户属于root组
    RUN chmod g+rwx /var/cache/nginx /var/run /var/log/nginx
    # 用户不允许监听特权端口
    RUN sed -i.bak 's/listen\(.*\)80;/listen 8081;/' /etc/nginx/conf.d/default.conf
    EXPOSE 8081
    # 将用户指令注释掉,因为OpenShift中的主进程已经以用户身份运行了
    RUN sed -i.bak 's/^user/#user/' /etc/nginx/nginx.conf

修复NGNIX无需root运行的所有问题。


-1

我只是替换了nginx二进制文件中的路径/var/log/nginx/error.log和其他路径为本地路径。

$ perl -pi \
    -e 's@/var/log/nginx/@_var_log_nginx/@g;' \
    -e 's@/var/lib/nginx/@_var_lib_nginx/@g;' \
    -e 's@/var/run/nginx.pid@_var_run/nginx.pid@g;' \
    -e 's@/run/nginx.pid@_run/nginx.pid@g;' \
    < /usr/sbin/nginx > nginx
$ chmod +x nginx
$ mkdir _var_log_nginx _var_lib_nginx _var_run _run
$ ./nginx -p . -c nginx.conf

它适用于测试。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接