問題描述
日前公司產品的網頁上傳檔案時出現 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: ...... |
解決方法
確認 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接著查看
/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發現
client_body的 owner 為root,而非www-data這個使用者,所以才會出現Permission denied的錯誤訊息,因此我們需要將client_body的 owner 改為www-data:1
$ sudo chown -R www-data:www-data /var/lib/nginx/
重新啟動 Nginx service:
1
$ sudo systemctl restart nginx
重新上傳檔案,發現已經可以正常上傳了。
記得回頭檢查
nginx.conf中的 user 設定,以釐清問題。