我试图写一个插件在nginx
,我应该创建一个文件在main process
然后child process
将读取此文件。我已经在main process
中设置了0766
文件,但是当我尝试在child process
中打开文件时,open
和statvfs
失败,errno
是13,这意味着Permission denied
。parent
和child
进程之间是否有任何特殊设置?我该怎么解决呢?
我的代码是这样的:
// 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`
如果我把这些create
和open
代码分别拿出来,放在一个parent-child
进程的例子中,它就可以正常工作。但它不能在nginx
工作,总是告诉我13
。
1条答案
按热度按时间ar5n3qh51#
有两个原因导致这个错误
1.我没有在
nginx.conf
中设置user
,因此没有人会根据这个来控制默认的工作进程,Nginx
将在子进程初始化时设置user。child process
需要对所有目录进行x
访问,请参阅this。检查以下内容: