Nginx error.log (13: Permission denied)

問題描述

日前公司產品的網頁上傳檔案時出現 return code 500 的錯誤,查看 Nginx 的 /var/log/nginx/error.log 時發現有以下錯誤訊息:

1
2021/02/15 23:28:38 [error] 1#1: *1 open() "/var/lib/nginx/tmp/client_body/0000000001" failed (13: Permission denied), request: ......

還有一種情況是發生在瀏覽器 get javascript 檔案時 200 OK ,但出現 net::ERR_QUIC_PROTOCOL_ERROR 的錯誤訊息,查看 Nginx 的 /var/log/nginx/error.log 時發現有以下錯誤訊息:

1
2021/02/15 23:28:38 [error] 1#1: *1 open() "/var/lib/nginx/tmp/proxy/0/0000000010" failed (13: Permission denied), request: ......

解決方法

  1. 確認 Nginx service 的 process user 是否為你預期的使用者,這裡範例的使用者為 www-data:

    1
    2
    3
    4
    5
    6
    $ ps -aux | grep nginx
    www-data 6252 0.0 0.0 56216 6264 ? S 2020 0:00 nginx: worker process
    www-data 6253 0.0 0.0 56480 6292 ? S 2020 0:01 nginx: worker process
    www-data 6254 0.0 0.0 56216 6300 ? S 2020 0:01 nginx: worker process
    www-data 6255 0.0 0.0 56480 6500 ? S 2020 0:03 nginx: worker process
    root 15636 0.0 0.0 55008 3840 ? Ss 2020 0:00 nginx: master process /usr/sbin/nginx
  2. 接著查看 /var/lib/nginx/tmp/ 的權限:

    1
    2
    3
    4
    5
    6
    7
    $ ls -l /var/lib/nginx/tmp/
    total 8
    drwxr-xr-x 2 root root 4096 Feb 15 23:28 client_body
    drwxr-xr-x 2 www-data www-data 4096 Feb 15 23:28 fastcgi
    drwxr-xr-x 2 www-data www-data 4096 Feb 15 23:28 proxy
    drwxr-xr-x 2 www-data www-data 4096 Feb 15 23:28 scgi
    drwxr-xr-x 2 www-data www-data 4096 Feb 15 23:28 uwsgi
  3. 發現 client_body 的 owner 為 root,而非 www-data 這個使用者,所以才會出現 Permission denied 的錯誤訊息,因此我們需要將 client_body 的 owner 改為 www-data:

    1
    $ sudo chown -R www-data:www-data /var/lib/nginx/
  4. 重新啟動 Nginx service:

    1
    $ sudo systemctl restart nginx
  5. 重新上傳檔案,發現已經可以正常上傳了。

  6. 記得回頭檢查 nginx.conf 中的 user 設定,以釐清問題。