解決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 的問題了。

而後訪問網站首頁:

有任何問題到評論區留言吧!謝謝!

相關文章
相關標籤/搜索