编辑回答:
这是 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 允许。