Nginx 无法访问上游 .sock 文件和公共文件夹

Nginx 无法访问上游 .sock 文件和公共文件夹

给定:DigitalOcean 上的全新 Archlinux VPS 盒。我创建了一个用户“app”,并且有一个/home/app/webapp.sock由 systemd 启动的二进制文件创建的文件:

[Unit]
Description=Web application server
After=network.target

[Service]
Type=forking
User=app
PIDFile=/home/app/webapp.pid
ExecStart=/home/app/.gem/ruby/2.0.0/bin/thin -d --user app -e production --chdir /home/app/app --socket /home/app/webapp.sock --pid /home/app/webapp.pid --log /home/app/log/webapp.log start
ExecReload=/bin/kill -HUP $MAINPID
ExecStop=/bin/kill -QUIT $MAINPID

[Install]
WantedBy=multi-user.target

不想以 http 用户身份运行此应用程序,因为在某个时间点,我可能会决定以不同的用户身份在该机器上运行另一个 Web 服务器,仅向 http 用户公开其 .sock 文件。众所周知,Rails 存在安全漏洞,因此我想避免“应用程序”用户从其主文件夹及其自己的数据中获取任何信息。

我有一个 sudo 用户“sudoer”,但无法读取 pid 文件:

[sudoer@host ~]$ cat /home/app/webapp.pid
cat: /home/app/webapp.pid: Permission denied
[sudoer@host ~]$ sudo su - app
[app@host ~]$ ls -l webapp.pid
-rw-r--r-- 1 app app 5 Dec  7 19:33 webapp.pid

它对‘其他’具有‘r’权限,为什么‘sudoer’不能‘cat’它?

我认为这也是以下 nginx 错误的原因。静态文件:

2013/12/07 18:58:05 [error] 18114#0: *2 open() "/home/app/app/public/favicon.ico" failed (13: Permission denied), client: 183.89.50.151, server: host.com, request: "GET /favicon.ico HTTP/1.1", host: "host.com"

动态内容:

2013/12/07 20:49:00 [crit] 21581#0: *1 connect() to unix:/home/app/webapp.sock failed (13: Permission denied) while connecting to upstream, client: 183.89.50.151, server: host.com, request: "GET /favicon.ico HTTP/1.1", upstream: "http://unix:/home/app/webapp.sock:/favicon.ico", host: "host.com"

摘自 nginx 配置:

upstream webapp {
  server unix:/home/app/webapp.sock fail_timeout=0;
}
server {
  listen 80;
  root /home/app/app/public;

这是增强的安全性吗?SELinux?CGroups?我做错了什么?

答案1

您必须检查权限,不仅是套接字(文件),还包括所有父目录的权限。如果任何如果他们拒绝访问,您的请求将会失败。

例如:

# ls -ld /home/app
drwx------. 8 root root 4096 Dec 7 21:33 /home/app

答案2

放入你的 sock 文件/var/run,并在创建 sock 文件时检查它属于哪个用户和组。对于你的情况,用户应该是“app”

相关内容