You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

从Apache2迁移至Nginx(含反向代理)后网站访问量骤降且性能缓慢

刚看到你的问题,我之前帮不少人处理过Apache迁Nginx后的性能问题,给你梳理几个核心排查方向,一步步来:

第一步:先排查Nginx自身的运行状态与连接情况
  • 先查看Nginx的连接状态,执行 netstat -anp | grep nginx 或者更高效的 ss -tulpn | grep nginx,重点看是否有大量TIME_WAITESTABLISHED连接堆积——如果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>,观察系统调用是否卡在connectrecvfrom上——这就是外部请求阻塞的实锤。
第三步:检查反向代理配置的合理性

Nginx作为反向代理,配置不当会直接导致响应慢:

  • 检查代理超时参数:proxy_connect_timeoutproxy_send_timeoutproxy_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的并发处理能力。
第四步:系统层面的资源瓶颈排查
  • htoptop实时监控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

火山引擎 最新活动