lnmp架构 mysql数据库Cannot assign requested address报错解决

数据库连接错误 ,具体是 网络连接问题​ 导致的。错误信息 "Cannot assign requested address" 表示系统无法分配本地地址来建立数据库连接。

报错截取如下:

{

"code": 10501,

"message": "SQLSTATEHY000 2002 Cannot assign requested address",

"traces": [

{

"name": "think\\db\\exception\\PDOException",

"file": "\/www\/wwwroot\/zjjgzyxy\/vendor\/topthink\/think-orm\/src\/db\/PDOConnection.php",

"line": 797,

"code": 10501,

"message": "SQLSTATEHY000 2002 Cannot assign requested address",

"trace": [

{

"file": "\/www\/wwwroot\/zjjgzyxy\/vendor\/topthink\/think-orm\/src\/db\/connector\/Mysql.php",

"line": 66,

"function": "getPDOStatement",

"class": "think\\db\\PDOConnection",

"type": "->"

},

}

这个错误通常在高并发场景下出现。首先排查php及mysql配置文件。优化数据库连接管理,增加复用,减少频繁创建新连接。

具体操作步骤:

编辑 /usr/local/php/etc/php-fpm.conf 或 www.conf

PHP-FPM配置

1.连接池设置

pm = dynamic

pm.max_children = 50

pm.start_servers = 5

pm.min_spare_servers = 5

pm.max_spare_servers = 35

pm.max_requests = 1000 # 进程处理1000个请求后重启,避免内存泄漏

2.进程管理

ps aux | grep php-fpm #查看当前FPM进程状态

service php-fpm restart #重启FPM

Nginx配置

  1. 连接数限制

编辑 /usr/local/nginx/conf/nginx.conf

worker_processes auto; # 自动设置工作进程数

worker_connections 10240; # 每个工作进程最大连接数

multi_accept on;

use epoll;

查看当前连接状态

netstat -an | grep :80 | wc -l

2.反向代理超时

在server或location块中

location ~ \.php$ {

fastcgi_connect_timeout 300;

fastcgi_send_timeout 300;

fastcgi_read_timeout 300;

fastcgi_buffer_size 64k;

fastcgi_buffers 4 64k;

}

MySQL配置

  1. 连接数设置

编辑 /etc/my.cnf

mysqld

max_connections = 1000

max_connect_errors = 1000

wait_timeout = 600

interactive_timeout = 600

mysql -e "show status like 'Threads_connected';" 查看当前连接数

mysql -e "show variables like 'max_connections';" 查看最大连接数

  1. 连接池优化

查看当前连接状态

mysql -e "show processlist;"

mysql -e "show status like '%connection%';"

重启命令:

  • 重启PHP-FPM:service php-fpm restart

  • 重启Nginx:service nginx restart

  • 重启MySQL:service mysql restart

检查服务器资源:

free -h 查看可用内存

mysql -e "SHOW STATUS LIKE 'Threads_connected';" 查看当前连接数

还是无法解决,则查看服务器文件

编辑 /etc/sysctl.conf文件:

打开文件

nano /etc/sysctl.conf

添加或修改以下参数:

net.ipv4.tcp_max_syn_backlog = 16384

net.ipv4.tcp_synack_retries = 1

net.ipv4.tcp_fin_timeout = 5 # 从10改为5秒

net.ipv4.tcp_keepalive_time = 1200

net.ipv4.tcp_keepalive_probes = 3

net.ipv4.tcp_keepalive_intvl = 5

net.ipv4.conf.all.send_redirects = 0

net.ipv4.conf.default.send_redirects = 0

net.ipv4.conf.all.accept_redirects = 0

vm.swappiness = 5

net.core.rmem_max = 2048000

net.core.wmem_max = 2048000

net.ipv4.ip_local_port_range=10000 65000 # 从40000-60000改为10000-65000

net.ipv4.ip_local_reserved_ports=48200-48253

net.ipv4.neigh.default.gc_thresh1 = 10240

net.ipv4.neigh.default.gc_thresh2 = 20480

net.ipv4.neigh.default.gc_thresh3 = 40960

vm.max_map_count=262144

添加的参数 ↓

net.ipv4.tcp_tw_reuse = 1 # 开启TIME_WAIT套接字重用

net.ipv4.tcp_tw_recycle = 1 # 开启TIME_WAIT套接字快速回收

net.ipv4.tcp_max_tw_buckets = 20000 # 限制TIME_WAIT最大数量

net.core.somaxconn = 65535 # 增加监听队列长度

net.ipv4.tcp_syncookies = 1 # 开启SYN cookies

net.ipv4.tcp_abort_on_overflow = 0 # 不拒绝新的连接请求

立即生效命令(终端执行)

sysctl -p

sysctl -p 如果不行,尝试

/sbin/sysctl -p

监控效果:观察"无法分配请求的地址"错误是否消失、持续监控TIME_WAIT连接数

  • netstat -an | grep TIME_WAIT

  • netstat -an | grep 3306

相关推荐
lie..7 小时前
30天从零开始学AI应用开发(Day 12):像产品一样稳:流式输出、报错重试、花钱控制
开发语言·人工智能·php
frjc8 小时前
数据库选型:如何从众多数据库中选出最理想的那一个
redis·mysql·clickhouse·elasticsearch
小马哥程序开发8 小时前
[点赞收藏免费领取 · 项目源码]37399民族服饰饰品商城小程序
sql·mysql·flask·源码·课程设计·程序开发·课设
顺顺 尼8 小时前
linux 进程信号(上)
linux·c++·算法
郑州光合科技余经理8 小时前
同城电商系统:库存变更怎么同步到订单
java·开发语言·前端·后端·uni-app·php·ai编程
niuTaylor9 小时前
飞腾 FT-2000/4 Ubuntu 内存卡 / NVMe SSD 系统制作完整指南
linux·服务器·人工智能·驱动开发·单片机
傲世仙尊10 小时前
信号量环形队列与线程池起步-把临界资源拆成很多份
linux
Huangjin007_10 小时前
【Linux 系统篇(二十五)】文件(二) 系统文件I/O详解
linux·运维·服务器
ShineWinsu10 小时前
对于ProtoBuffer:ProtoBuffer的介绍以及安装
linux·网络·google·协议·序列化·反序列化·protobuffer
FlightYe11 小时前
视界原理之2D视频(二):视频文件里有什么
android·linux·网络·c++·ffmpeg·音视频·aac