CentOS LNMP资源限制设置指南
LNMP(Linux+Nginx+MySQL+PHP)架构在高并发场景下,资源限制(如文件描述符、进程数、内存等)是影响稳定性的关键因素。以下从系统级、Nginx、PHP-FPM/PHP、MySQL四个核心组件,梳理资源限制的设置方法:
系统级限制是组件配置的基础,需先调整以确保组件配置生效。
文件描述符用于管理打开的文件、套接字等资源,高并发下易成为瓶颈。
/etc/security/limits.conf(永久生效):soft为软限制,hard为硬限制):* soft nofile 65535
* hard nofile 65535
/etc/sysctl.conf(调整系统全局文件描述符上限):sysctl -p使配置生效:fs.file-max = 2097152
fs.nr_open = 2097152
ulimit -n查看当前用户的文件描述符限制。调整TCP连接参数,提升并发处理能力:
/etc/sysctl.conf,添加以下内容:net.ipv4.tcp_max_tw_buckets = 6000 # 减少TIME_WAIT状态连接占用
net.ipv4.tcp_tw_reuse = 1 # 启用TIME_WAIT连接重用
net.ipv4.tcp_max_syn_backlog = 65535 # 增加SYN队列长度
net.core.somaxconn = 65535 # 增加监听队列长度
sysctl -p使配置生效。Nginx作为Web服务器,需调整工作进程、连接数等参数以适应高并发。
/usr/local/nginx/conf/nginx.conf(或/etc/nginx/nginx.conf):worker_processes auto; # 根据CPU核心数自动设置(如4核则设为4)
events {
worker_connections 1024; # 每个工作进程最大连接数(需小于系统nofile限制)
}
worker_processes建议设置为CPU核心数的1-2倍;worker_connections需结合系统nofile限制(如worker_processes×worker_connections ≤ nofile)。若Nginx以systemd方式运行,需修改服务文件:
/etc/systemd/system/nginx.service(或/lib/systemd/system/nginx.service):[Service]段添加:LimitNOFILE=65535
systemctl daemon-reload
systemctl restart nginx
PHP-FPM负责处理PHP请求,其进程管理和内存限制直接影响PHP性能。
/usr/local/php/etc/php-fpm.d/www.conf(或/etc/php-fpm.d/www.conf):pm = dynamic # 动态进程管理模式(推荐)
pm.max_children = 50 # 最大子进程数(根据内存计算:如每个PHP进程占30MB,2GB内存可设为50-60)
pm.start_servers = 5 # 启动时的子进程数
pm.min_spare_servers = 5 # 最小空闲子进程数
pm.max_spare_servers = 35 # 最大空闲子进程数
pm.max_requests = 500 # 每个子进程处理500个请求后重启(防止内存泄漏)
rlimit_files = 10240 # 每个PHP-FPM进程的文件描述符限制(需≥系统nofile限制)
pm.max_children是关键参数,需根据服务器内存计算(避免内存耗尽);pm.max_requests可防止PHP进程内存泄漏。/usr/local/php/etc/php.ini:memory_limit = 256M # 单个PHP脚本最大内存(根据应用需求调整,如Nextcloud可设为2G)
max_execution_time = 300 # 脚本最大执行时间(秒,如上传大文件需调整为300)
max_input_time = 60 # 输入数据最大处理时间
post_max_size = 16M # POST请求最大大小(需≥upload_max_filesize)
upload_max_filesize = 10M # 单个文件最大上传大小(根据需求调整,如2G)
memory_limit需与pm.max_children配合(如memory_limit×pm.max_children ≤ 服务器内存)。启用OPcache缓存PHP脚本编译结果,提升执行速度:
/usr/local/php/etc/php.ini,添加以下内容:[opcache]
zend_extension=opcache.so
opcache.enable=1
opcache.memory_consumption=128 # OPcache缓存大小(MB,如128M)
opcache.interned_strings_buffer=8 # 内部字符串缓存大小(MB)
opcache.max_accelerated_files=4000 # 缓存的脚本文件数量
opcache.revalidate_freq=60 # 脚本重新验证频率(秒)
MySQL作为数据库,需调整连接数和文件句柄限制以支持高并发。
/etc/my.cnf(或/etc/mysql/my.cnf):[mysqld]
max_connections = 500 # 最大连接数(根据应用需求调整,如高并发可设为1000+)
open_files_limit = 8192 # MySQL能打开的最大文件数(需≥系统nofile限制)
innodb_buffer_pool_size = 1G # InnoDB缓冲池大小(建议为服务器内存的50%-80%,如2GB内存设为1G)
max_connections过高会导致内存耗尽,需结合pm.max_children(PHP-FPM)和Nginx连接数调整;innodb_buffer_pool_size是MySQL性能关键参数,需预留足够内存。ulimit -n查看系统文件描述符限制;nginx -t检查Nginx配置语法;systemctl restart nginx php-fpm mysqld重启服务;php-fpm -t(测试配置)或systemctl status php-fpm(查看运行状态)。top、htop、vmstat、iostat等工具监控CPU、内存、磁盘I/O使用情况;使用ss -s查看TCP连接数;使用mysqladmin status查看MySQL连接数。以上设置需根据服务器硬件配置(CPU、内存、磁盘)和应用场景(如高并发上传、复杂查询)进行调整,建议在测试环境中验证后再应用于生产环境。