为了避免 nginx 504 网关超时,我尝试在 PHP 代码开始时执行以下操作:
set_time_limit(0);
另外,我尝试提高时间设置/etc/php/7.0/fpm/php.ini
:
max_execution_time = 3600
max_input_time = 3600
以及/etc/php/7.0/fpm/pool.d/www.conf
:
request_terminate_timeout=3600
重新启动 nginx 后,我在请求 3600 秒之前仍然收到 504 网关超时错误。
我还应该做些什么才能彻底避免这种情况?
答案1
具有高性能 MPM-Event 工作器的 Nginx 和 Apache 使用专用守护进程(服务)来运行 PHP。您已经以正确的方式配置了此守护进程。但现在您必须配置 Web 服务器以等待这么长时间。可以使用以下设置来完成神奇的设置fastcgi_读取超时。
配置 Nginx 等待一段时间...
location ~ \.php$ {
# allow logging
access_log /var/log/nginx/access.log vhosts;
# include defaults
include fastcgi_params;
# define connection to php-fpm
fastcgi_keep_conn on;
fastcgi_pass unix:/var/run/php5-fpm.sock;
fastcgi_index index.php;
# php script name
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param SCRIPT_NAME $fastcgi_script_name;
# set buffers
fastcgi_buffer_size 128k;
fastcgi_buffers 256 16k;
fastcgi_busy_buffers_size 256k;
fastcgi_temp_file_write_size 256k;
# allow web-server to wait for a long time before giving up
fastcgi_read_timeout 3600s;
}
我不建议为可公开访问的 Web 服务器激活此设置。
如果某项任务需要花费一些时间,那么您应该通过 CLI(命令行界面)来执行此任务。一个很好的例子就是为一个大型网站生成 Google sitemap.xml。
例子:
通过命令行执行脚本...
cd /var/www/mysite/ ; php generateSitemap.php
定义一个 cronjob 来通过命令行每天执行脚本...
0 4 * * * cd /var/www/mysite/ ; php generateSitemap.php