Errno 13 Permission denied using Gunicorn

Errno 13 Permission denied using Gunicorn

我是 运行 Digital Ocean 上的 django,有 gunicornnginx。 Gunicorn 用于为静态文件提供 django 和 nginx。

通过网站上传文件后,我无法保存到 /home 目录中的文件夹。我得到 [Errno 13] Permission denied.

请问,如何使 Web 服务器能够对 /home 下任意位置的任意文件夹进行读写访问?

这完全取决于您的应用程序是 运行 的用户。

如果您检查 ps aux | grep gunicorn Gunicorn 服务器是哪个用户 运行 您的应用,那么您可以相应地更改 chmodchown 权限。

ls -lash 将向您显示当前仅拥有该文件夹的用户以及您尝试写入的文件夹的权限:

4.0K drwxrwx--- 4 username username 4.0K Dec 9 14:11 uploads

然后您可以使用它来检查任何问题。

一些关于更改所有权和权限的文档

http://linux.die.net/man/1/chmod

http://linux.die.net/man/1/chown

我建议 非常小心 确定磁盘上的哪些位置允许 Web 服务器访问 read/write。这可能会产生巨大的安全隐患。

好吧,我在这个问题上工作了一个多星期,终于能够搞清楚。 请点击 digital ocean 中的链接,但他们没有指出重要问题,其中包括

  1. 连接到上游时没有实时上游
  2. *4 connect() to unix:/myproject.sock 连接到上游时失败(13:权限被拒绝)
  3. gunicorn OSError: [Errno 1] 不允许操作
  4. *1 connect() to unix:/tmp/myproject.sock failed (2: No such file or directory)

这些问题基本上是 Nginx 和 Gunicorn 之间连接的权限问题。 为简单起见,我建议 为您创建的每个 file/project/python 程序提供相同的 nginx 权限

要解决所有问题,请遵循以下方法: 第一件事是:

  1. 以root用户登录系统
  2. 创建 /home/nginx 目录。
  3. 完成此操作后,按照 website 直到 创建新贵脚本。
  4. 运行 chown -R nginx:nginx /home/nginx
  5. 对于 upstart 脚本,在最后一行做以下更改: 执行 gunicorn --workers 3 --bind unix:myproject.sock -u nginx -g nginx wsgi 不要添加 -m 权限,因为它会弄乱套接字。从 Gunicorn 的文档来看,当 -m 是默认值时,python 将找出最佳权限
  6. 启动upstart脚本
  7. 现在只需转到 /etc/nginx/nginx.conf 文件。 转到服务器模块并附加:

    位置/{ 包括 proxy_params; proxy_pass http<>:<>//unix:/home/nginx/myproject.sock; } 删除<> 从这里开始不要关注digitalocean文章

    1. 现在重启 nginx 服务器,一切顺利。

更改 /home 的所有者

查看实际所有者 $ ls -l /

f1  f2  f3  f4  f5  f6      f6      f8  f9              f10
-   rwx r-x r-x 1   root    root    209 Mar 30 17:41    /home

https://www.garron.me/en/go2linux/ls-file-permissions.html
f2 文件或目录的所有者权限
f3 对文件或目录的组权限
f4 其他人对文件或目录的权限
f6 拥有文件或目录的用户

递归更改文件夹所有者sudo chown -R ubuntu /home/用非根用户替换ubuntu

良好做法

  • 使用子目录 home/ubuntu 作为服务器目录,ubuntu 文件夹拥有 ubuntu 用户作为所有者。
  • 将用户所有者权限设置为全部。您的组和其他用户只读 sudo chmod -R 744 /home/ubuntu/

在我的例子中,产生类似错误的原因非常简单,我只需要检查控制 Gunicorn 的用户和控制 NGINX 的用户,他们有不同的权限。

我更改了包含我的图像的文件的所有权

chown -R www-data: /myproject/media/mainsite/images

相应地更改路径并重新启动服务器。在我的例子中它是 apache2 所以

sudo service apache2 restart