增加 Nextcloud 執行時間避免超時

前言

如果你在 Nextcloud 上傳很大的檔案時,在他 assembling 一段時間後有可能會發生上傳失敗的問題。這是因為 Nextcloud 上傳的時候會將檔案分塊,所有碎塊都傳完之後才會將它組裝起來。他會需要這麼做的原因,是因為某些 CDN 會限制單檔上傳上限只有 100MB,所以他這個操作就能繞過這個限制,但可能會產生額外的問題。

太大的檔案會造成組裝合併的時候花更長的時間,而 php-fpm 預設的執行時間又只有 60 秒,所以超過就會超時,而導致上傳失敗。這時候你打開 F12 應該會看到 HTTP 504 Gateway Timeout 類似的文字。因此這邊文章就是來說說如何設定加大執行時間。

操作方式

你有兩種方式可以增大執行時間,一個是直接在 Nginx 定義,另一個是改 php-fpm 的設定檔,當然你兩個都設定是最好。

Nginx 設定檔

前往 /etc/nginx/sites-enabled 並編輯 nextcloud 設定檔。

cd /etc/nginx/sites-enabled && sudo vim nextcloud

找到 location ~ \.php 的段落,並增加一些 fastcgi 的設定值如下方這樣:

location ~ \.php(?:$|/) {
    fastcgi_split_path_info ^(.+?\.php)(/.*)$;
    set $path_info $fastcgi_path_info;

    try_files $fastcgi_script_name =404;

    include fastcgi_params;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    fastcgi_param PATH_INFO $path_info;
    fastcgi_param HTTPS on;

    fastcgi_param modHeadersAvailable true;
    fastcgi_param front_controller_active true;
    fastcgi_pass unix:/run/php/php8.4-fpm.sock;

    fastcgi_intercept_errors on;
    fastcgi_request_buffering off;
    fastcgi_send_timeout 600s;
    fastcgi_read_timeout 600s;
    fastcgi_connect_timeout 3600s;

    fastcgi_max_temp_file_size 0;
}

主要就是定義那幾行 timeout 時間,把他拖長一點。接著就檢查並重啟 Nginx 就可以囉。

sudo nginx -t && sudo systemctl restart nginx

php-fpm 設定檔

進到 php-fpm 的資料夾,根據不同版本路徑有可能不同,例如說我這裡的版本是 8.4,並編輯 php.ini

cd /etc/php/8.4/fpm && sudo vim php.ini

這個文件很長,但主要我們就是更新數值而已,如下:

max_execution_time = 3600
max_input_time = 3600
request_terminate_timeout = 600
default_socket_timeout = 600

接著重啟 php-fpm 就好囉。(重啟命令一樣有版本之分)

sudo systemctl restart php8.4-fpm