WordPress – 檔案權限設定(1)

wordpress 更新失敗就會看到下面的錯誤訊息,只需要修改檔案權限即可.

Installation failed: Unable to locate WordPress content directory (wp-content).

測試環境為 Ubuntu16.04 x86_64(虛擬機)

前言
Wordpress 更新 plugin , theme 時需要輸 Linux 系統的使用者帳號與密碼,但實際在運作的是 httpd process 的使用者 (Ubunut 為 www-data , RHEL/CentOS 為 apache),下面是透過 ps 指令來觀察.

root@ubuntu:/var/www/html# ps aux | grep apache2
root       1509  0.0  2.8 287188 27992 ?        Ss   00:55   0:00 /usr/sbin/apache2 -k start
www-data   2832  0.0  3.2 293180 32920 ?        S    01:00   0:00 /usr/sbin/apache2 -k start
www-data   2833  0.0  3.5 293868 35752 ?        S    01:00   0:01 /usr/sbin/apache2 -k start
www-data   2834  0.0  3.4 293508 34444 ?        S    01:00   0:00 /usr/sbin/apache2 -k start

單一使用者如 root 時 WordPress 檔案權限設定建議如下.

  1. HTML 檔案/目錄 的擁有者 (User)
    我安裝好的 WordPress 檔案,目錄 預設的使用者是 nobody ,wordpress 建議使用一個真的使用者來取代掉 預設的使用者,不建議全部使用 httpd process 的使用者 (Ubunut 為 www-data , RHEL/CentOS 為 apache).

    我使用 root 當做使用者.

    將 /var/www/html 權限都修改成為 root

    root@ubuntu:~# chown -R root:root /var/www/html/
    
  2. HTML 檔案/目錄 的群組 (Group)
    我安裝好的 WordPress 檔案,目錄 預設的是群組為 nobody 以及 nogroup ,wordpress 沒有任何建議,應該使用同一個使用者當作群組名稱即可.

    我直接使用 root 當做群組.剛剛指令也修改過了.

  3. HTML 目錄權限
    所有的目錄只能設定為 755 – 使用者擁有 read/write/exec(進入目錄的權限) ,群組與其他使用者擁有 read/exec(進入目錄的權限).

    利用下面指令將所有目錄權限修改成為 755

    root@ubuntu:~# find /var/www/html/ -type d -exec chmod 755 {} \;
    
  4. HTML 檔案權限
    所有檔案只能設定 644 – 使用者擁有 read/write ,群組與其他使用者擁有 read.

    利用下面指令將所有檔案權限修改成為 644

    root@ubuntu:~# find /var/www/html/ -type f -exec chmod 644 {} \;
    
  5. 特殊檔案 wp-config.php
    wp-config.php 設定檔需要 httpd process 的使用者 (Ubunut 為 www-data , RHEL/CentOS 為 apache) 讀取,我們可以這樣設定,擁有者 root ,群組 www-data ,權限 440 – 使用者擁有 read ,群組 read.

    root@ubuntu:~# rm /var/www/html/wp-config-sample.php
    root@ubuntu:~# chgrp www-data /var/www/html/wp-config.php
    root@ubuntu:~# chmod 440 /var/www/html/wp-config.php
    
  6. 特殊檔案 .htaccess
    .htaccess 設定檔需要 httpd process 的使用者 (Ubunut 為 www-data , RHEL/CentOS 為 apache) 讀取,我們可以這樣設定,擁有者 root ,群組 www-data ,權限 664 – 使用者擁有 read / write ,群組 read / write , 其他 read .

    root@ubuntu:~# touch /var/www/html/.htaccess
    root@ubuntu:~# chgrp www-data /var/www/html/.htaccess
    root@ubuntu:~# chmod 664 /var/www/html/.htaccess
    
  7. 特殊目錄 wp-content
    通常安裝完 wordpress 第一個遇到的問題是上傳圖片時系統顯示

    無法建立目錄: wp-content/uploads,伺服器是否允許寫入上層目錄?
    

    預設是沒有 uploads 這個目錄的,需要自行建立,權限不需設定成為 777 ,只要讓 httpd process 的使用者 (Ubunut 為 www-data , RHEL/CentOS 為 apache) 有寫入權限即可.

    root@ubuntu:~# mkdir /var/www/html/wp-content/uploads
    

    我們可以這樣設定
    擁有者 root ,群組 www-data
    目錄權限 775 – 使用者擁有 read / write / Exec ,群組 read / write / Exec , 其他 read / Exec.
    檔案權限 664 – 使用者擁有 read / write ,群組 read / write , 其他 read .

    root@ubuntu:~# find /var/www/html/wp-content -exec chgrp www-data {} \;
    root@ubuntu:~# find /var/www/html/wp-content -type d -exec chmod 775 {} \;
    root@ubuntu:~# find /var/www/html/wp-content -type f -exec chmod 664 {} \;
    
  8. 特殊目錄 wp-admin
    試過之後需要把這個目錄的擁有者設定成為 www-data.

    root@ubuntu:~# chown -R www-data:www-data /var/www/html/wp-admin/
    

    這樣就可以更新 plugin , theme … ,或是設定 Apache2 + SSH2 細節請參考 http://benjr.tw/10928

設定完成的 wordprss 權限如下.

root@ubuntu:~# ll -a /var/www/html
total 196
drwxr-xr-x  5 root       root      4096 Oct 30 23:24 ./
drwxr-xr-x  3 root       root      4096 Oct 30 23:23 ../
-rw-rw-r--  1 root       www-data     0 Oct 31 00:11 .htaccess
-rw-r--r--  1 root       root       418 Sep 24  2013 index.php
-rw-r--r--  1 root       root     19935 Jan  2  2017 license.txt
-rw-r--r--  1 root       root      7413 Dec 12  2016 readme.html
-rw-r--r--  1 root       root      5447 Sep 27  2016 wp-activate.php
drwxr-xr-x  9 www-data   www-data  4096 Sep 19 14:21 wp-admin/
-rw-r--r--  1 root       root       364 Dec 19  2015 wp-blog-header.php
-rw-r--r--  1 root       root      1627 Aug 29  2016 wp-comments-post.php
-r--r-----  1 root       www-data  3273 Oct 30 23:23 wp-config.php
drwxrwxr-x  5 root       www-data  4096 Oct 30 23:40 wp-content/
-rw-r--r--  1 root       root      3286 May 24  2015 wp-cron.php
drwxr-xr-x 18 root       root     12288 Sep 19 14:21 wp-includes/
-rw-r--r--  1 root       root      2422 Nov 20  2016 wp-links-opml.php
-rw-r--r--  1 root       root      3301 Oct 24  2016 wp-load.php
-rw-r--r--  1 root       root     34327 May 12 10:12 wp-login.php
-rw-r--r--  1 root       root      8048 Jan 10  2017 wp-mail.php
-rw-r--r--  1 root       root     16200 Apr  6  2017 wp-settings.php
-rw-r--r--  1 root       root     29924 Jan 24  2017 wp-signup.php
-rw-r--r--  1 root       root      4513 Oct 14  2016 wp-trackback.php
-rw-r--r--  1 root       root      3065 Aug 31  2016 xmlrpc.php
root@ubuntu:~# ll /var/www/html/wp-content/
total 24
drwxrwxr-x 5 root www-data 4096 Oct 30 23:40 ./
drwxr-xr-x 5 root root     4096 Oct 30 23:24 ../
-rw-rw-r-- 1 root www-data   28 Jan  8  2012 index.php
drwxrwxr-x 3 root www-data 4096 Oct 31 00:07 plugins/
drwxrwxr-x 5 root www-data 4096 Sep 19 14:21 themes/
drwxrwxr-x 2 root www-data 4096 Oct 30 23:25 uploads/

這個設定有一個問題就是無法更新 wordpress 本身,因為 wordpress 在更新時會把舊的 php 程式改成新的版本, 但 httpd process 並沒有寫入這些檔案的權限,修改方式請參考這一篇 http://benjr.tw/10976

One thought on “WordPress – 檔案權限設定(1)

發表迴響

你的電子郵件位址並不會被公開。 必要欄位標記為 *

這個網站採用 Akismet 服務減少垃圾留言。進一步瞭解 Akismet 如何處理網站訪客的留言資料