php.iniのmax_execution_timememory_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

これでうまくいった。

無制限に質問可能なプログラミングスクール!

万が一転職できない場合は、転職保障全額返金できるコースもあり!!

無制限のメンター質問対応

 

DMMウェブキャンプでプログラミングを学習しませんか?

独学より成長スピードをブーストさせましょう!

 

まずは無料相談から!

おすすめの記事