php.iniのmax_execution_time
やmemory_limit
の値を変更してもだいぶ早い段階で504 Gateway Timeout
のエラーが出る場合の対処法。
データベース内の特定のテーブルを全てCSVで書き出すAPIを叩いたら発生した。
結論としては、Webサーバー(nginxとか)のタイムアウトの時間を触らないといけない。php.ini
の設定あんま関係ない。
nginx設定ファイルの特定
docker-compose.yml
version: "3.9"
services:
app:
build: ./infra/php
volumes:
- ./backend:/work
environment:
#ホストOSにプロキシが設定あれば利用
HTTP_PROXY: "${HOST_HTTP_PROXY:-}"
HTTPS_PROXY: "${HOST_HTTPS_PROXY:-}"
web:
image: nginx:latest
ports:
- 80:80
- 443:443 #+
volumes:
- ./backend:/work
- ./infra/nginx/default.conf:/etc/nginx/conf.d/default.conf
- /etc/letsencrypt:/etc/letsencrypt #+
working_dir: /work
#中略
./infra/nginx/default.conf:/etc/nginx/conf.d/default.conf
とあることから、上記の例では./infra/nginx/default.conf
が設定を持っているファイルだとわかる。
nginx設定ファイルの編集
server {
client_max_body_size 1000000M;
listen 80;
listen [::]:80;
server_name core-system.online;
root /work/public;
add_header X-Frame-Options "SAMEORIGIN";
add_header X-XSS-Protection "1; mode=block";
add_header X-Content-Type-Options "nosniff";
index index.php;
charset utf-8;
# タイムアウト設定を追加
proxy_connect_timeout 600s; # 接続タイムアウトを600秒に設定
proxy_send_timeout 600s; # リクエスト送信のタイムアウトを600秒に設定
proxy_read_timeout 600s; # レスポンス受信のタイムアウトを600秒に設定
send_timeout 600s; # クライアントへの送信タイムアウトを600秒に設定
fastcgi_read_timeout 600s; #fastcgiの読み取りタイムアウト
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location = /favicon.ico {
access_log off;
log_not_found off;
}
location = /robots.txt {
access_log off;
log_not_found off;
}
error_page 404 /index.php;
location ~ \.php$ {
fastcgi_pass app:9000;
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
include fastcgi_params;
}
location ~ /\.(?!well-known).* {
include fastcgi_params;
}
}
server
ブロックにタイムアウトの設定を追加する。
なんもなかったら60秒でタイムアウトするのがデフォルトの挙動。。
fastcgi_read_timeout 600s; #fastcgiの読み取りタイムアウト
も必要と判断したのは、
location ~ \.php$ {fastcgi_pass app:9000;fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;include fastcgi_params;}
という記述が上記のファイル内にあったから。
コンテナの再構築
docker-compose down
docker-compose up -d
これでうまくいった。