从Apache2迁移至Nginx(含反向代理)后网站访问量骤降且性能缓慢
刚看到你的问题,我之前帮不少人处理过Apache迁Nginx后的性能问题,给你梳理几个核心排查方向,一步步来:
第一步:先排查Nginx自身的运行状态与连接情况
- 先查看Nginx的连接状态,执行
netstat -anp | grep nginx或者更高效的ss -tulpn | grep nginx,重点看是否有大量TIME_WAIT或ESTABLISHED连接堆积——如果TIME_WAIT太多,说明连接回收机制没调好,可在nginx.conf里加tcp_tw_reuse on;和tcp_tw_recycle on;优化。 - 立刻检查Nginx的错误日志,路径一般是
/var/log/nginx/error.log,搜索关键词比如too many open files(文件句柄不足)、connection refused(后端连接失败)、timeout(超时),这些都是常见的性能瓶颈触发点。如果是文件句柄问题,要在nginx.conf里设置worker_rlimit_nofile 65535;,同时修改系统的/etc/security/limits.conf增加Nginx进程的句柄限制。
第二步:盯住
file_get_contents的遗留阻塞问题 你之前Apache宕机的根源是这个函数的无阻塞调用,迁到Nginx后如果后端用的是PHP-FPM,这个问题依然会拖垮服务:
- 先检查PHP-FPM的状态:执行
systemctl status php-fpm(对应你的PHP版本,比如php8.2-fpm),看是否有进程耗尽、大量慢请求堆积的情况。也可以访问PHP-FPM的状态页(如果配置了的话)看详细指标。 - 强制给
file_get_contents加超时:要么修改php.ini里的default_socket_timeout = 5(设置5秒超时,根据业务调整),要么在代码里手动添加上下文控制超时:$context = stream_context_create([ 'http' => [ 'timeout' => 5 // 5秒超时 ] ]); $content = file_get_contents($external_url, false, $context); - 用
strace跟踪卡住的PHP-FPM进程:找到占用资源高的PHP-FPM进程ID,执行strace -p <进程ID>,观察系统调用是否卡在connect或recvfrom上——这就是外部请求阻塞的实锤。
第三步:检查反向代理配置的合理性
Nginx作为反向代理,配置不当会直接导致响应慢:
- 检查代理超时参数:
proxy_connect_timeout、proxy_send_timeout、proxy_read_timeout,默认可能设置得过长(比如60秒),导致连接一直挂着占用资源,建议先调整为10秒左右,根据业务场景再微调。 - 开启代理缓存(如果业务允许):静态内容或不常变化的动态内容可以用Nginx缓存减轻后端压力,示例配置:
# 在http块里定义缓存路径 proxy_cache_path /var/cache/nginx/site_cache levels=1:2 keys_zone=site_cache:10m max_size=10g inactive=60m use_temp_path=off; # 在对应的server块里启用缓存 server { ... proxy_cache site_cache; proxy_cache_key "$scheme$request_method$host$request_uri"; proxy_cache_valid 200 304 10m; # 200/304状态码缓存10分钟 ... } - 调整Nginx的 worker 参数:确保
worker_processes auto;(自动匹配CPU核心数),worker_connections 4096;(根据服务器配置调高,默认1024可能不够),这两个参数直接影响Nginx的并发处理能力。
第四步:系统层面的资源瓶颈排查
- 用
htop或top实时监控CPU、内存、磁盘IO使用率:如果CPU被某个进程(比如PHP-FPM、Nginx)占满,或者内存不足开始频繁swap,磁盘IO使用率长期超过80%,都会导致Nginx响应缓慢。 - 检查磁盘空间:执行
df -h,确认Nginx日志目录、缓存目录所在的磁盘没有被占满——磁盘满了会导致Nginx无法写入日志、缓存无法生成,直接影响性能。 - 用
vmstat 1查看系统负载:重点看r列(等待运行的进程数)和b列(不可中断睡眠的进程数),如果r持续高于CPU核心数,说明CPU资源不足;b数值高则大概率是磁盘IO阻塞。
内容的提问来源于stack exchange,提问作者Typewar




