读取上游时,Nginx 缓存 mkdir 失败(2:没有此文件或目录)

读取上游时,Nginx 缓存 mkdir 失败(2:没有此文件或目录)

编辑回答

这是 selinux 导致的,临时解决方法是运行这个命令:sudo semanage permissive -a httpd_t

但是出于安全原因,你不应该这样做。我找到了一篇由 Danila Vershinin 撰写的关于 nginx selinux 配置的文章,如果你有和我一样的问题,你应该阅读它。

原始问题:

我在 nginx 服务器(centos 7)上有一个 wordpress + woocommerce 网站,我想让 nginx fastcgi 缓存工作,但它总是错过或通过,从未命中。

这是错误日志:

2018/11/11 00:00:00 [crit] 1900#0: *1 mkdir() "/etc/nginx/cache/0/53" failed (2: No such file or directory) while reading upstream, client: 111.111.111.111, server: www.example.com, request: "GET /page2/ HTTP/1.1", upstream: "fastcgi://unix:/run/php-fpm/www.sock:", host: "www.example.com", referrer: "https://www.example.com/page1/"

那么我该如何解决这个问题才能使缓存正常工作?谢谢!

附言:

缓存将存储在/etc/nginx/cache中,其权限为700(drwx------),用户和组为nginx:root

以下是相关的 nginx 配置:

fastcgi_cache_path /etc/nginx/cache levels=1:2 keys_zone=WORDPRESS:500m inactive=240m;
fastcgi_cache_key "$scheme$request_method$host$request_uri";

这是上游的配置:

upstream php-fpm {
    server unix:/run/php-fpm/www.sock;
}

以下是 /etc/php-fpm.d/www.conf 中的一些行:

user = nginx
group = nginx
listen = /run/php-fpm/www.sock
listen.owner = nobody
listen.group = nobody
listen.mode = 0660
listen.acl_users = nginx

答案1

我在这里回答我自己的问题。

罪魁祸首是 selinux。

基本上你需要让 nginx 遵守 selinux 对 nginx 的策略,该策略定义为 httpd_t。运行以下命令。

  • sudo semanage permissive -a httpd_t
  • sudo mkdir -p /var/lib/nginx/cache
  • sudo chown -R nginx /var/lib/nginx
  • sudo restorecon -Rv /var/lib/nginx
  • 转到你的 nginx conf,将缓存位置更改为 /var/lib/nginx/cache
  • sudo matchpathcon -V /var/lib/nginx/microcache
  • sudo semanage 宽容-d httpd_t

简单解释:

  • 第一个命令足以使缓存工作,但它并不安全,因为它允许 nginx 绕过 selinux。
  • 为什么是 /var/lib/nginx?该目录已被 selinux 允许。

相关内容