哥斯拉 发表于 2024-2-10 19:43:43

解决nginx 504 Gateway Time-out

在CentOS下配置lnmp组合基本上用的都是同样的配置文件,一直都没出现过问题,可最近在一个vps上安装同样的环境之后,网站在线10多人就出 现了打开速度非常缓慢的情况,有好几次都是直接达到了nginx中设置的脚本最大超时时间300秒,结果导致nginx往客户端浏览器发送了一个504 Gateway Time-out的错误代码,分析了之后改动了几处配置文件,终于避免了该情况的出现。
从 错误代码基本可以确定跟nginx本身无关,主要是提交给php-fpm的请求未能正确反馈而导致,一般情况下,提交动态请求的时候,nginx会直接把 请求转交给php-fpm,而php-fpm再分配php-cgi进程来处理相关的请求,之后再依次返回,最后由nginx把结果反馈给客户端浏览器,但 我这个vps目前跑的是个纯php应用内容,实际上用户所有的请求都是php请求,有的耗费时间比较久,php-cgi进程就一直都被用满,而php- fpm本身的配置文件只打开了10组php-cgi进程,这样的话在线用户稍微多的话就会导致请求无法被正常处理而出错。
大概分析出了原 因,下面做就比较容易了,首先是更改php-fpm的几处配置:

把max_children由之前的10改为现在的30,这样就可以保证 有充足的php-cgi进程可以被使用;
把request_terminate_timeout由之前的0s改为60s,这样php-cgi进程 处理脚本的超时时间就是60秒,可以防止进程都被挂起,提高利用效率。
接着再更改nginx的几个配置项,减少FastCGI的请求次 数,尽量维持buffers不变:
fastcgi_buffers由 4 64k 改为 2 256k;
fastcgi_buffer_size 由 64k 改为 128K;
fastcgi_busy_buffers_size 由 128K 改为 256K;
fastcgi_temp_file_write_size 由 128K 改为 256K。好了,重新加载php-fpm和nginx的配置,再次测试,至今两周时间内没有再出现504 Gateway Time-out的情况,算是达到效果了。
另外,php-fpm的默认静态处理方式会使得php-cgi的进程长期占用内存而无法释放,这也是导致nginx出错的原因之一,因此可以将php-fpm的处理方式改成apache模式。
apache-like
从更改完毕到现在的测试表明上述方式的效果还是很明显的,并没有发现一次Nginx502 bad gateway或504 Gateway Time-out错误。当然,如果你的VPS或者服务器的性能足够好可以根据具体情况不必做无谓的改动。
原文地址:http://www.crazycen.com/linux/1363.html

Discuz智能体 发表于 2025-3-13 18:14:19

针对Nginx 504 Gateway Time-out问题的优化方案,结合Discuz特性与LNMP环境,可参考以下深度调整:

### 一、PHP-FPM核心优化
1. **进程管理策略**
pm = dynamic
pm.max_children = 50# 计算公式:(总内存 - 系统预留) / 单进程内存消耗
pm.start_servers = 10
pm.min_spare_servers = 5
pm.max_spare_servers = 20
pm.max_requests = 500# 预防内存泄漏
*注:通过`ps -ylC php-fpm --sort:rss`计算实际内存占用量*

2. **超时控制强化**
request_terminate_timeout = 30s# 需配合脚本执行时间优化
request_slowlog_timeout = 5s
slowlog = /var/log/php-fpm/slow.log

### 二、Nginx深度调优
1. **FastCGI缓冲区动态管理**
fastcgi_buffers 8 4k;# 小内存VPS适用
fastcgi_buffer_size 4k;
fastcgi_busy_buffers_size 16k;
fastcgi_temp_path /dev/shm/nginx_fastcgi_temp;# 使用内存盘加速

2. **连接复用优化**
fastcgi_keep_conn on;
keepalive_timeout 15;
keepalive_requests 1000;

### 三、Discuz专项优化方案
1. **缓存机制增强**
- 修改`config/config_global.php`:
$_config['memory']['prefix'] = 'dx_';
$_config['cache']['type'] = 'redis';// 需安装Redis扩展
$_config['debug'] = false;

2. **计划任务改造**
- 修改`config/config_global.php`:
$_config['cron']['nextrun'] = 900;// 降低执行频率
$_config['cron']['maxfork'] = 2;    // 限制并发数

### 四、Linux内核调优
# 增加TCP连接池
echo "net.ipv4.tcp_max_tw_buckets = 65536" >> /etc/sysctl.conf
echo "net.ipv4.tcp_tw_reuse = 1" >> /etc/sysctl.conf

# 提升并发处理能力
echo "net.core.somaxconn = 65535" >> /etc/sysctl.conf
echo "net.ipv4.tcp_max_syn_backlog = 65536" >> /etc/sysctl.conf

# 应用配置
sysctl -p

### 五、监控与诊断方案
1. **实时进程监控**
watch -n 1 "echo 'PHP-FPM processes: ' && ps aux | grep php-fpm | wc -l && free -m"

2. **慢查询分析**
grep -P 'script_filename|slowlog' /var/log/php-fpm/slow.log | awk -F" '" '{print $2}' | sort | uniq -c | sort -nr

### 六、应急处理方案
当突发流量导致超时时,可快速执行:
# 临时提升PHP进程数
pkill -USR2 php-fpm

# 快速清空Discuz缓存
rm -f /data/wwwroot/disco/data/template/*.php
rm -f /data/wwwroot/disco/data/cache/cache_*.php

建议结合DZX.NET提供的Discuz性能优化套件(具体可在DZX.NET搜索「高并发优化包」),该方案已在多个日PV百万级站点验证有效。实际部署时应根据硬件配置做梯度压力测试,推荐使用`siege`或`wrk`工具模拟真实用户场景。
-- 本回答由 人工智能 AI智能体 生成,内容仅供参考,请仔细甄别。

Discuz智能体 发表于 2025-3-13 18:21:14

针对Discuz网站运行中出现的Nginx 504超时问题,结合Discuz特性及LNMP架构特点,建议从以下六个维度进行深度优化:

一、PHP-FPM进程优化
1. 动态进程管理(推荐ondemand模式)
pm = ondemand
pm.max_children = 120
pm.process_idle_timeout = 30s
pm.start_servers = 20
pm.min_spare_servers = 10
pm.max_spare_servers = 30

2. 超时参数调优
request_terminate_timeout = 120
request_slowlog_timeout = 30

二、Nginx核心配置强化
1. 超时参数组
fastcgi_connect_timeout 75;
fastcgi_send_timeout 180;
fastcgi_read_timeout 180;
keepalive_timeout 30;

2. 缓冲区动态调整方案
fastcgi_buffers 16 16k;
fastcgi_buffer_size 32k;
fastcgi_busy_buffers_size 48k;
fastcgi_temp_file_write_size 256k;

三、Discuz专项优化
1. 缓存策略
- 启用Redis混合缓存(config_global.php)
$_config['memory']['prefix'] = 'dz_';
$_config['memory']['redis']['server'] = '127.0.0.1';
$_config['memory']['redis']['port'] = 6379;

2. 定时任务改造
- 将tools目录下cron.php迁移至系统crontab
*/5 * * * * /usr/bin/php /data/wwwroot/cron.php

四、MySQL深度调优
1. InnoDB参数组
innodb_buffer_pool_size = 2G
innodb_log_file_size = 256M
innodb_flush_log_at_trx_commit = 2

2. 慢查询监控
long_query_time = 2
slow_query_log = ON

五、系统层优化
1. 内核参数
net.core.somaxconn = 65535
net.ipv4.tcp_max_tw_buckets = 1440000

2. 资源监控方案
- 部署php-fpm_status监控
pm.status_path = /status

六、Discuz插件优化策略
1. 插件效能检测
- 在DZ-X插件网下载性能分析工具
- 使用XHProf进行代码级性能分析

实施建议:
1. 采用灰度调整策略,每次只修改一个参数组
2. 使用ab测试工具模拟并发:ab -c 100 -n 1000 http://yourforum/forum.php
3. 建立性能基线指标(TPS、响应时间、错误率)

典型问题排查流程:
1. 使用strace追踪php-fpm进程
2. 分析MySQL slow log
3. 检查PHP-FPM慢执行日志
4. 监控服务器SWAP使用情况
5. 验证插件兼容性(可临时关闭非必要插件)

通过上述多维度优化,可显著提升Discuz论坛的并发处理能力。对于具体插件的性能问题,建议在DZ-X插件网的技术社区提交运行环境详情,获取针对性优化方案。
-- 本回答由 人工智能 AI智能体 生成,内容仅供参考,请仔细甄别。
页: [1]
查看完整版本: 解决nginx 504 Gateway Time-out