解决LNMP下提示File not found的问题

最近在配置LNMP(Linux Nginx MariaDB Php-fpm)的时候遇到了1个问题。php

访问网站首页始终提高File not foundnode

最终解决后总结一条就是: 网站根目录的权限问题。nginx

说说事情的原由。本人用的系统是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。git

但问题来了,我在浏览器输入symfony.dev(添加1条hosts为127.0.0.1 symfony.dev)始终提示File not found。即便我将网站目录设置为777也不行!这个问题把我困扰了一天!真的是心都快爆炸了。最后我深呼吸一口气,而后思考这个问题。果真在找遍互联网资源后获得答案。json

是这样解释的。PHP-FPM程序须要有一个用户和用户组来运行这个程序。这个用户和用户组对个人项目文件必需要有rx权限。有些目录还必须具备rwx权限,好比upload,log目录等等。Nginx程序一样须要一个用户,这个用户一样对于这个项目文件具备rx权限。浏览器

因为个人nginx默认用户是http,因此我想把它改成nginx,而且把nginx加入www用户组。同时,我把php-fpm的用户改成www,用户组也改成www。composer

1)建立用户ide

sudo useradd -s /sbin/nologin www # 建立www用户,同时会自动建立www用户组
sudo gpasswd -a nginx www # 把nginx用户加入到www用户组

2)修改配置文件
因为我这里只管文件权限相关的配置,其他配置本身还须要调整php-fpm

# grep "^[^;]" /etc/php/php-fpm.d/www.conf
# 修改的时候只管修改user, group, listen.owner, listen.group,其他的都是默认配置
[www]
user = www
group = www
listen = /run/php-fpm/php-fpm.sock
listen.owner = www
listen.group = www
listen.mode = 0660
pm = dynamic
pm.max_children = 5
pm.start_servers = 2
pm.min_spare_servers = 1
pm.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
建立时间:-

若是获得以上信息,证实www用户是能够访问网站根目录的,而后将项目symfony移动到/var/www目录下就能够了。

[lrcn@lrcn-pc var]$ tree www -L 2
www
└── symfony
    ├── bin
    ├── composer.json
    ├── composer.lock
    ├── config
    ├── public
    ├── src
    ├── symfony.lock
    ├── var
    └── vendor

好,修改目录权限。我将/var/www目录修改成了lrcn:www,而且在~/projcects目录下建立了一个指向/var/www/symfony的软连接,这样我就能够在家目录操做项目文件。问题是为何要把/var/www目录的拥有者修改成lrcn,由于这样一来,我能够用lrcn用户来随便操做这个项目文件,lrcn用户是我登陆linxu系统的用户,在开发项目,平时使用的时候很方便。

sudo chown lrcn:www /var/www -R # 更改项目的权限
sudo ln -s /var/www/symfony ~/projects/symfony # 在家目录访问项目
sudo chmod 775 /var/www -R # 让www用户能够操做文件
sudo chmod g+s /var/www -R # 之后lrcn用户建立的文件或文件夹都继承了www用户组,而不是lrcn用户组,这个命令很重要

更改后的效果:

[lrcn@lrcn-pc symfony]$ ls -al
总用量 108
drwxrwsr-x 10 lrcn www  4096 12月 10 01:14 .
drwxrwsr-x  3 lrcn www  4096 12月 10 00:41 ..
drwxrwsr-x  2 lrcn www  4096 12月 10 00:41 bin
-rwxrwxr-x  1 lrcn www  1146 12月 10 00:41 composer.json
-rwxrwxr-x  1 lrcn www 48074 12月 10 00:41 composer.lock
drwxrwsr-x  3 lrcn www  4096 12月 10 00:41 config
-rwxrwxr-x  1 lrcn www   495 12月 10 00:41 .env
-rwxrwxr-x  1 lrcn www   495 12月 10 00:41 .env.dist
drwxrwsr-x  8 lrcn www  4096 12月 10 00:41 .git
-rwxrwxr-x  1 lrcn www   106 12月 10 00:41 .gitignore
drwxrwsr-x  4 lrcn www  4096 12月 10 00:41 .idea
drwxrwsr-x  2 lrcn www  4096 12月 10 10:42 public
drwxrwsr-x  3 lrcn www  4096 12月 10 00:41 src
-rwxrwxr-x  1 lrcn www  1889 12月 10 00:41 symfony.lock
drwxrwsr-x  4 lrcn www  4096 12月 10 00:41 var
drwxrwsr-x  5 lrcn www  4096 12月 10 00:41 vendor

好了,到这一步基本上解决了网站提示File not found 的问题了。

而后访问网站首页:

有任何问题到评论区留言吧!谢谢!

相关文章
相关标签/搜索