LNMP下提示File not found問題的解決方法
一般情況下每個虛擬主機就是一個網站,網站一般通過域名進行訪問。最近在配置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 = 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, 得到了正常的結果:
如果得到以上信息,證明www用戶是可以訪問網站根目錄的,然后將項目symfony移動到/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
- 創建時間:-
好,修改目錄權限。我將/var/www目錄修改為了lrcn:www,并且在~/projcects目錄下創建了一個指向/var/www/symfony的軟鏈接,這樣我就可以在家目錄操作項目文件。問題是為什么要把/var/www目錄的擁有者修改為lrcn,因為這樣一來,我可以用lrcn用戶來隨便操作這個項目文件,lrcn用戶是我登錄linxu系統的用戶,在開發項目,平時使用的時候很方便。
- [lrcn@lrcn-pc var]$ tree www -L 2
- www
- └── symfony
- ├── bin
- ├── composer.json
- ├── composer.lock
- ├── config
- ├── public
- ├── src
- ├── symfony.lock
- ├── var
- └── vendor
更改后的效果:
- 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 的問題了。
然后訪問網站首頁
總結
以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對云狐的支持。