前言
一般情况下每个虚拟主机就是一个网站,网站一般通过域名进行访问。最近在配置LNMP(Linux Nginx MariaDB Php-fpm)的时候遇到了1个问题:
访问网站首页始终提升File not found。
最终解决后总结一条就是: 网站根目录的权限问题。
起因
说说事情的起因。本人用的系统是Manjaro Linux系统。所以用一条命令装好LNMP环境: sudo pacman -S mariadb nginx php。刚开始,我把symfony项目放在我的家目录,也就是~/projects。然后我从symfony官方拷贝一份nginx的配置文件symfony.conf,放在了/etc/nginx/sites-available目录下,然后将root参数更改为/home/lrcn/projects/symfony/public,并更改了fastcgi_pass参数为unix:/run/php-fpm/php-fpm.sock。好,运行sudo nginx -t测试通过,然后重启nginx。
但问题来了,我在浏览器输入symfony.dev(添加1条hosts为127.0.0.1 symfony.dev)始终提示File not found。即使我将网站目录设置为777也不行!这个问题把我困扰了一天!真的是心都快爆炸了。最后我深呼吸一口气,然后思考这个问题。果然在找遍互联网资源后得到答案。
是这样解释的。PHP-FPM程序需要有一个用户和用户组来运行这个程序。这个用户和用户组对我的项目文件必须要有rx权限。有些目录还必须具有rwx权限,比如upload,log目录等等。Nginx程序同样需要一个用户,这个用户同样对于这个项目文件具有rx权限。
解决方法
由于我的nginx默认用户是http,所以我想把它改为nginx,并且把nginx加入www用户组。同时,我把php-fpm的用户改为www,用户组也改为www。
1)创建用户
sudo useradd -s /sbin/nologin www # 创建www用户,同时会自动创建www用户组sudo gpasswd -a nginx www # 把nginx用户加入到www用户组
2)修改配置文件
由于我这里只管文件权限相关的配置,其余配置自己还需要调整
# grep "^[^;]" /etc/php/php-fpm.d/www.conf# 修改的时候只管修改user, group, listen.owner, listen.group,其余的都是默认配置[www]user = wwwgroup = wwwlisten = /run/php-fpm/php-fpm.socklisten.owner = wwwlisten.group = wwwlisten.mode = 0660pm = dynamicpm.max_children = 5pm.start_servers = 2pm.min_spare_servers = 1pm.max_spare_servers = 3# /etc/nginx/nginx.conf# 在第一行写入,其余的不变user nginx www;
3)修改项目文件权限
这一步我发现了一个很诡异的问题,如果我将网站目录放到lrcn用户的家目录的话,www用户始终无法访问这个项目文件,即使我把~/projects设置为了chown www:www ~/projects -R,但都不管用,运行测试命令sudo -u www stat ~/projects/symfony依旧提示没有权限。我想,应该是/home/lrcn目录的拥有者为lrcn,即使我将它子目录projects改为了www:www, 也是不能访问的。这合情合理。所以,我又将项目目录放在了/var/www目录下,然后运行sudo -u www stat /var/www, 得到了正常的结果:
[lrcn@lrcn-pc nginx]$ sudo -u www stat /var/www[sudo] lrcn 的密码: 文件:/var/www 大小:4096 块:8 IO 块:4096 目录设备:801h/2049d Inode:3671064 硬链接:3权限:(2775/drwxrwsr-x) Uid:( 1000/ lrcn) Gid:( 1001/ lrcn)最近访问:2017-12-10 00:40:04.274947995 +0800最近更改:2017-12-10 00:41:34.772321160 +0800最近改动:2017-12-10 10:51:15.811999323 +0800创建时间:-