LNMP服务器如何进行资源限制
导读:LNMP服务器的资源限制实践指南 一 系统级限制 文件描述符与进程数 在**/etc/security/limits.conf**提升软硬限制,例如:* soft nofile 65535 * hard nofile 65535...
LNMP服务器的资源限制实践指南
一 系统级限制
-
文件描述符与进程数
- 在**/etc/security/limits.conf**提升软硬限制,例如:
* soft nofile 65535 * hard nofile 65535 - 在 Nginx 主配置中同步设置:
worker_rlimit_nofile 65535; events { worker_connections 16384; } - 理论最大并发连接数≈worker_processes × worker_connections(需同时考虑系统级 fd 与内核网络参数)。建议按CPU 核心数设置 worker_processes,必要时启用worker_cpu_affinity做亲和性绑定。以上设置可避免“too many open files”和连接数受限问题。
- 在**/etc/security/limits.conf**提升软硬限制,例如:
-
内核网络与端口
- 提升连接队列与端口范围,编辑**/etc/sysctl.conf**:
net.core.somaxconn = 32768 net.ipv4.ip_local_port_range = 1024 65535 net.core.netdev_max_backlog = 32768 net.ipv4.tcp_max_syn_backlog = 65536 net.ipv4.tcp_tw_reuse = 1 - 执行
sysctl -p使配置生效。上述参数有助于在高并发下减少连接丢弃与队列溢出。
- 提升连接队列与端口范围,编辑**/etc/sysctl.conf**:
-
容器场景(可选)
- 若使用 Docker,直接对容器做资源上限,例如限制内存与磁盘写速率:
docker run -d --name nginx --memory=500m --memory-swap=1g nginx:latest docker run -d --name mysql --device-write-bps /dev/sda:10mb mysql:8.0 - 也可在编排文件(如 docker-compose)中声明 limits 与 reservations,便于统一管理。
- 若使用 Docker,直接对容器做资源上限,例如限制内存与磁盘写速率:
二 Nginx层限制
- 请求速率与突发
- 定义共享内存区与速率,配合突发队列与无延迟放行:
http { limit_req_zone $binary_remote_addr zone=req_limit:10m rate=10r/s; server { location / { limit_req zone=req_limit burst=20 nodelay; } } }
- 定义共享内存区与速率,配合突发队列与无延迟放行:
- 并发连接数
- 限制单 IP 并发与虚拟主机总并发:
http { limit_conn_zone $binary_remote_addr zone=conn_limit:10m; server { limit_conn conn_limit 20; # 每IP并发 limit_conn_status 429; # 可选:返回429而非503 } }
- 限制单 IP 并发与虚拟主机总并发:
- 带宽限速
- 对特定路径或全站限速(例如100KB/s):
location /download/ { limit_rate 100k; }
- 对特定路径或全站限速(例如100KB/s):
- 安全与可用性
- 结合Fail2Ban封禁暴力访问来源,降低异常流量对后端冲击:
sudo yum install fail2ban -y # 配置 /etc/fail2ban/jail.local [DEFAULT] bantime = 600 findtime = 600 maxretry = 3 [nginx] enabled = true filter = nginx action = iptables-multiport[name=nginx, port="http,https", protocol=tcp] logpath = /var/log/nginx/access.log
- 结合Fail2Ban封禁暴力访问来源,降低异常流量对后端冲击:
三 PHP-FPM层限制
- 进程模型与数量
- 在**/etc/php/{
版本}
/fpm/pool.d/www.conf**中设置进程池:
pm = dynamic pm.max_children = 50 pm.start_servers = 5 pm.min_spare_servers = 2 pm.max_spare_servers = 8 pm.max_requests = 10000 # 防止内存泄漏累积 - 估算 max_children:若单进程常驻约20–30MB,可用“可用内存 / 单进程内存”粗略估算,并预留系统与其他服务内存。
- 在**/etc/php/{
版本}
/fpm/pool.d/www.conf**中设置进程池:
- 脚本级资源
- 在php.ini中控制脚本资源边界:
memory_limit = 128M max_execution_time = 30 - 在 FPM 池配置中可设置请求终止超时:
request_terminate_timeout = 30
- 在php.ini中控制脚本资源边界:
四 MySQL MariaDB层限制
- 连接与会话
- 在**/etc/mysql/my.cnf的[mysqld]**段限制并发:
max_connections = 150 - 结合应用连接池与超时设置,避免连接风暴与线程堆积。
- 在**/etc/mysql/my.cnf的[mysqld]**段限制并发:
- 内存与缓存
- 合理设置 InnoDB 缓冲池,常见做法是总内存的50%–70%(需结合实际负载与实例共存情况):
innodb_buffer_pool_size = 2G - 其他影响内存与临时表行为的参数(如tmp_table_size、max_heap_table_size)应与业务查询特征匹配,避免磁盘临时表放大 I/O。
- 合理设置 InnoDB 缓冲池,常见做法是总内存的50%–70%(需结合实际负载与实例共存情况):
- 维护与治理
- 定期执行OPTIMIZE TABLE / ANALYZE TABLE,清理无用索引与碎片,降低资源浪费。
- 持续监控慢查询与连接使用,必要时引入连接池或读写分离,分散热点压力。
五 监控与容量规划
- 实时监控
- 使用top/htop、vmstat、iostat、glances观察 CPU、内存、I/O 与网络队列,定位瓶颈与异常进程。
- 容量与上限核算
- 预估 Nginx 最大并发:worker_processes × worker_connections,并与系统ulimit -n、内核somaxconn等参数联动。
- 预估 PHP-FPM 内存:max_children × 单进程内存,确保不超过物理内存并预留系统余量。
- 预估 MySQL 连接与缓冲:max_connections与innodb_buffer_pool_size共同决定数据库层资源占用,避免与系统和其他服务争用。
- 变更与回滚
- 任何参数调整遵循“小步变更、灰度验证、可回滚”的流程,变更后观察错误率、延迟、吞吐与系统指标,必要时回退或二次调优。
声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!
若转载请注明出处: LNMP服务器如何进行资源限制
本文地址: https://pptw.com/jishu/754688.html
