AWS EC2部署Sendy发信时Nginx报504超时错误如何解决?
Sendy 504网关超时与Nginx崩溃故障解决方案
配置超时参数
- Nginx侧配置
编辑对应站点的Nginx配置文件(默认路径/etc/nginx/sites-available/你的站点配置),在处理Sendy请求的location块中添加以下配置:
执行proxy_connect_timeout 600s; proxy_send_timeout 600s; proxy_read_timeout 600s; fastcgi_read_timeout 600s; fastcgi_send_timeout 600s; send_timeout 600s;nginx -t校验配置无语法错误后,运行systemctl reload nginx生效。 - PHP运行环境配置
编辑php.ini配置文件(路径随PHP版本不同有差异,可通过php --ini查找),修改以下参数:
若使用PHP-FPM,还需编辑对应池配置(默认路径max_execution_time = 600 memory_limit = 512M/etc/php/[版本号]/fpm/pool.d/www.conf),添加或修改request_terminate_timeout = 600,修改后执行systemctl reload php[版本号]-fpm重载服务。
修复文件描述符限制不足问题
你观察到的open socket left及aborting报错,核心原因是Nginx worker进程的最大打开文件句柄数限制被打满,导致进程异常崩溃:
- 全局永久调整句柄限制:编辑
/etc/security/limits.conf,新增2行配置:* soft nofile 65535 * hard nofile 65535 - 单独调整Nginx服务的句柄限制:编辑Nginx的systemd服务配置文件,在
[Service]段落添加LimitNOFILE=65535,执行systemctl daemon-reload && systemctl restart nginx生效。 - 验证配置:执行
cat /proc/$(cat /var/run/nginx.pid)/limits | grep "Max open files",确认输出的软、硬限制均为65535即可。
适配AWS环境优化Sendy发信逻辑
- 改用CLI模式触发发信任务,避免Web请求受Nginx超时限制:在crontab中添加定时任务,每分钟执行一次Sendy的调度脚本,样例如下:
* * * * * www-data php /var/www/sendy/scheduled.php > /dev/null 2>&1 - 下调Sendy单批发信数量:在Sendy后台设置中将单次发信批次调整为50~100,降低单次任务的执行时长与资源消耗。
- 检查AWS侧配置:确认RDS的最大连接数配置足够、EC2到RDS的安全组规则没有限制连接时长、EC2的出站规则允许发信端口(25/465/587)的请求。
效果验证
发起小批量发信测试,确认不再返回504错误,查看Nginx错误日志无aborting类告警即可。
内容的提问来源于stack exchange,提问作者COdeingNinja
相关产品推荐
相关产品推荐

