为什么在nginx中打开父进程创建的文件时,子进程得到13(Permission denied)

gg58donl  于 2023-05-16  发布在  Nginx
关注(0)|答案(1)|浏览(131)

我试图写一个插件在nginx,我应该创建一个文件在main process然后child process将读取此文件。我已经在main process中设置了0766文件,但是当我尝试在child process中打开文件时,openstatvfs失败,errno是13,这意味着Permission denied
parentchild进程之间是否有任何特殊设置?我该怎么解决呢?
我的代码是这样的:

// in nginx main process I create the file
u_char* shared_addr = NULL; 
int map_my_file(const char* path)
{
    extern int errno;
    umask(0);
    int fd = open(path, O_RDWR | O_CREAT | O_EXCL, 0766);
    if (fd < 0)
    {
        ngx_log_stderr(0, "open file failed %s, %d", path, errno);
    }
    if (ftruncate(fd, 1024 *1024) < 0)
    {
        printf("ftruncate %d failed", fd);
    }
    shared_addr = (u_char*)mmap(NULL, 1024 * 1024, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
    close(fd);
}

// in nginx child process, I try to open the file 
    int cfd = 0;
    if ((cfd = open("./t.log", O_RDWR)) >= 0)
    {
        printf("child open success\n");
    } else {
        printf("failed %d\n", errno);
    }
// I got `failed 13`, means `Permission denied`

如果我把这些createopen代码分别拿出来,放在一个parent-child进程的例子中,它就可以正常工作。但它不能在nginx工作,总是告诉我13

ar5n3qh5

ar5n3qh51#

有两个原因导致这个错误
1.我没有在nginx.conf中设置user,因此没有人会根据这个来控制默认的工作进程,Nginx将在子进程初始化时设置user。

  1. child process需要对所有目录进行x访问,请参阅this
    检查以下内容:
chmod +x /home/
chmod +x /home/username
chmod +x /home/username/siteroot

相关问题