温馨提示×

LNMP环境下Ubuntu如何优化性能

小樊
42
2025-12-26 01:47:52
栏目: 智能运维

LNMP环境下Ubuntu性能优化实操指南

一 基础与连接优化

  • 保持组件为最新稳定版(Nginx、MySQL/MariaDB、PHP),及时获取性能修复与新特性。
  • 启用HTTP/2HTTP/3(QUIC),在 Nginx 中开启 TLS 并优先使用 ECDHE 系列曲线,减少握手开销。
  • 开启Gzip/Brotli压缩,压缩文本类资源(HTML/CSS/JS/JSON),降低传输体积。
  • 配置静态资源长缓存(Cache-Control/Expires),搭配CDN分发图片、视频、下载包与静态资源,减轻源站压力。
  • 打开HTTPS(如 Let’s Encrypt),并合理设置TLS 会话复用/会话票据与 OCSP Stapling,减少握手延迟。
  • 调整 Nginx 并发模型:设置worker_processes auto(通常等于 CPU 核心数),worker_connections结合业务并发与文件描述符限制进行调优。
  • 提升系统文件描述符限制(nofile),例如在**/etc/security/limits.conf**中设置 soft/hard 值,并在需要时配置 systemd 服务 LimitNOFILE,避免“Too many open files”。

二 Nginx与PHP-FPM调优

  • 进程模型与连接:Nginx 使用epoll/kqueue事件驱动;PHP-FPM 采用动态(dynamic)按需(ondemand)进程管理,结合内存与并发目标设置pm.max_children / pm.start_servers / pm.min_spare_servers / pm.max_spare_servers / pm.max_requests,避免进程过多导致内存抖动或过少导致排队。
  • 通信方式:优先使用Unix Domain Socket(如 unix:/var/run/php/php8.1-fpm.sock),减少 TCP 开销;确保 Nginx 与 PHP-FPM 运行用户与权限一致。
  • 静态资源与缓存:为图片、字体、CSS/JS 设置强缓存协商缓存(ETag/Last-Modified);对可缓存的动态内容启用Nginx FastCGI 缓存(proxy_cache_path/fastcgi_cache_path),设置keys_zone、levels、max_size、inactive、use_temp_path=off与缓存有效期策略。
  • 压缩与头部:开启gzip;按需启用Brotli(需额外模块);减少不必要的响应头与 Cookie 体积。
  • 超时与缓冲:合理设置fastcgi_read_timeout / fastcgi_send_timeout,避免长请求被过早中断;根据业务调整client_max_body_size与各类buffer大小。
  • 典型示例(/etc/nginx/nginx.conf 片段,按需调整):
    • fastcgi_cache_path /var/cache/nginx levels=1:2 keys_zone=fcgi:10m max_size=1g inactive=60m use_temp_path=off;
    • gzip on; gzip_vary on; gzip_types text/plain text/css application/json application/javascript text/xml application/xml+rss;
    • server { location ~* .(jpg|jpeg|png|gif|ico|css|js)$ { expires 30d; add_header Cache-Control “public, no-transform”; } }
      以上要点涵盖 Nginx 并发、缓存、压缩与 PHP-FPM 进程管理的关键实践。

三 MySQL或MariaDB调优

  • 缓冲与内存:将innodb_buffer_pool_size设为物理内存的50%–70%(上限一般不超过32GB),这是提升 InnoDB 性能的首要参数;MyISAM 场景再考虑key_buffer_size
  • 连接与会话:根据并发与内存设置max_connections,避免过大导致内存占用激增;合理设置thread_cache_size减少线程创建销毁开销。
  • 日志与持久化:权衡性能与持久性,必要时将innodb_flush_log_at_trx_commit设为2(在崩溃时可能丢失最近 1 秒事务);根据负载调整innodb_log_file_sizesync_binlog
  • 查询与索引:避免SELECT ,为高频查询条件与排序/分组字段建立复合索引;使用EXPLAIN*分析执行计划,定位全表扫描与临时表。
  • 慢查询与维护:开启slow_query_log,设置long_query_time=1–2s,定期用pt-query-digestMySQLTuner分析并优化;对大表执行ANALYZE/OPTIMIZE TABLE与必要时的分区/分表
  • 缓存策略:MySQL 8.0 已移除查询缓存(query cache),建议以Redis/Memcached等外部缓存替代。
  • 典型示例(/etc/mysql/mysql.conf.d/mysqld.cnf 片段,按需调整):
    • innodb_buffer_pool_size=4G
    • innodb_flush_log_at_trx_commit=2
    • slow_query_log=1
    • slow_query_log_file=/var/log/mysql/slow-query.log
    • long_query_time=2
      以上为数据库层面的核心调优项与维护方法。

四 应用层与缓存架构

  • 对象缓存:引入Redis/Memcached缓存热点数据、会话与配置字典,降低数据库 QPS;在 PHP 框架中合理使用缓存标签/前缀TTL
  • 页面与数据缓存:对不常变的页面启用Nginx FastCGI 页面级缓存;对接口与复杂查询使用应用层缓存(如整页、片段、查询结果)。
  • 内容优化:对图片进行压缩与适当格式转换(如 WebP),对CSS/JS进行合并、最小化与异步/延迟加载;减少阻塞渲染资源。
  • 会话存储:将会话存入Redis,便于多实例扩展与共享登录态。
  • 典型示例(Nginx 动态内容缓存):
    • fastcgi_cache_key “$scheme$request_method$host$request_uri”;
    • fastcgi_cache_valid 200 302 10m; fastcgi_cache_valid 404 1m;
    • add_header X-Cache $upstream_cache_status;
      以上措施可显著降低后端负载并缩短首屏时间。

五 监控、压测与容量规划

  • 监控与告警:部署Prometheus + Grafana监控CPU、内存、连接数、QPS、慢查询、缓存命中率等;Nginx 开启stub_status,PHP-FPM 开启status,MySQL 启用性能/状态变量采集。
  • 日志与诊断:定期分析Nginx access/error 日志PHP-FPM 日志,关注502/504/慢请求;使用EXPLAIN慢查询日志定位 SQL 瓶颈。
  • 压测与容量:使用ab/wrk/heyk6进行渐进式压测,验证RPS、P95/P99 延迟、错误率与缓存命中率;结合监控数据逐步调大worker_connections、pm.max_children、innodb_buffer_pool_size等关键参数。
  • 工具与基线:利用MySQLTuner/Percona Toolkit获取配置与 SQL 优化建议,形成基线指标滚动优化机制。
  • 安全与合规:在优化同时完成防火墙(UFW)最小权限TLS安全更新等基础安全配置,避免性能与安全顾此失彼。
    以上实践可形成“监控—压测—调优—复盘”的闭环,确保性能稳定可持续。

0