ubuntu + nginx 1.26 + php7.4 + mysql8.0 调优
服务器配置 8核 16G
查看内存 free -h
nginx配置
worker_processes auto; # 自动检测CPU核心数
worker_rlimit_nofile 65535; # 提高文件描述符限制
events {worker_connections 8192; # 每个worker的最大连接数multi_accept on; # 一次性接受所有连接use epoll; # 使用epoll事件模型
}
http {include mime.types;default_type application/octet-stream;sendfile on; # 高效文件传输tcp_nopush on; # 减少网络包数量tcp_nodelay on; # 实时数据传输keepalive_timeout 65; # 长连接超时时间server_tokens off; # 隐藏Nginx版本信息# Gzip压缩gzip on;gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;# 虚拟主机配置include /etc/nginx/conf.d/*.conf;include /etc/nginx/sites-enabled/*;
}
mysql数据库调优
基本配置
[mysqld]
# 基础设置
# 仅本地访问
bind-address = 127.0.0.1
port = 3306
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
# 最大连接数
max_connections = 300
# 连接超时时间
wait_timeout = 600
# 内存分配 (约占总内存的60%)
# InnoDB缓冲池大小
innodb_buffer_pool_size = 6G
# 日志文件大小
innodb_log_file_size = 512M
# MyISAM索引缓冲区
key_buffer_size = 128M
#排序操作缓冲区大小 推荐值:1M-8M,根据服务器内存和查询复杂度调整 如从 2M 逐步增加到 4M、8M
sort_buffer_size = 4M
# 随机读缓冲区
read_rnd_buffer_size = 4M
# JOIN操作缓冲区
join_buffer_size = 4M
# 性能优化
# 平衡性能与安全性
innodb_flush_log_at_trx_commit = 2
# 二进制日志同步频率
sync_binlog = 100
# IOPS估计值
innodb_io_capacity = 2000
# 读IO线程数
innodb_read_io_threads = 8
# 写IO线程数
innodb_write_io_threads = 8
# 线程并发数
innodb_thread_concurrency = 16
# 在【mysqld】下加入以下配置(解决group by报错解决)
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
group_concat_max_len = 102400
# 时区设置
default-time_zone = '+8:00'
开启缓慢sql日志
# 启用慢查询日志
slow_query_log = 1
# 慢查询日志文件路径
slow_query_log_file = /var/log/mysql/mysql-slow.log
# 设置慢查询时间阈值(单位:秒)
long_query_time = 3
# 记录未使用索引的查询
log_queries_not_using_indexes = 1
php-fmp 配置优化
基础配置
计算最大进程数# 计算平均php进程平均内存
ps -ylC php-fpm7.4 --sort:rss | awk '{sum+=$8; n++} END {print "平均内存(KB): " sum/n}'
# 计算最大进程数 PHP-FPM + MySQL 总内存建议控制在 12GB 左右(留 4GB 给系统)
# 可用内存(MB) ÷ 单个进程内存(MB) = 最大进程数
配置 /etc/php/7.4/fpm/pool.d/www.conf
[www]
pm = dynamic
; (1024MB*6) ÷ 32MB ≈ 192(pm.max_children值)
pm.max_children = 190
; 初始进程数
pm.start_servers = 20
; 最小空闲进程数
pm.min_spare_servers = 10
; 最大空闲进程数
pm.max_spare_servers = 30
; 空闲进程超时时间
pm.process_idle_timeout = 10s
; 单个请求最大执行时间(秒)
request_terminate_timeout = 30
; 慢请求日志阈值
request_slowlog_timeout = 5s
; 慢请求日志路径
slowlog = /var/log/php7.4-fpm-slow.log
; 提高文件描述符限制
rlimit_files = 65535
启用 OPcache 默认启动
[opcache]
opcache.enable=1
opcache.enable_cli=1
opcache.memory_consumption=128
opcache.interned_strings_buffer=8
opcache.max_accelerated_files=10000
opcache.validate_timestamps=1
opcache.revalidate_freq=1
opcache.fast_shutdown=1
压力测试 ApacheBench
安装
sudo apt install apache2-utils# 模拟1个客户端请求100次:
ab -n 100 http://www.example.com/# 模拟100个客户端请求10000次:
ab -n 10000 -c 100 http://www.example.com/# 调用POST方法的接口10次,传输的数据格式为JSON:
ab -n 10 -p json-file http://www.example.com/# 调用OPTIONS方法的接口10次:
ab -n 10 -m OPTIONS http://www.example.com/# 输出每次请求的返回信息:
ab -n 10 -v 2 http://www.example.com/
测试效果显著