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

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

报错截取如下:

{

"code": 10501,

"message": "SQLSTATE[HY000] [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": "SQLSTATE[HY000] [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

相关推荐
释怀不想释怀5 分钟前
Linux环境变量
linux·运维·服务器
zzzsde11 分钟前
【Linux】进程(4):进程优先级&&调度队列
linux·运维·服务器
凡人叶枫22 分钟前
C++中智能指针详解(Linux实战版)| 彻底解决内存泄漏,新手也能吃透
java·linux·c语言·开发语言·c++·嵌入式开发
JMchen12337 分钟前
Android后台服务与网络保活:WorkManager的实战应用
android·java·网络·kotlin·php·android-studio
yuanmenghao44 分钟前
Linux 性能实战 | 第 7 篇 CPU 核心负载与调度器概念
linux·网络·性能优化·unix
qq_297574671 小时前
Linux 服务器 Java 开发环境搭建保姆级教程
java·linux·服务器
70asunflower1 小时前
Emulation,Simulation,Virtualization,Imitation 的区别?
linux·docker
神梦流2 小时前
GE 引擎的内存优化终局:静态生命周期分析指导下的内存分配与复用策略
linux·运维·服务器
凡人叶枫2 小时前
C++中输入、输出和文件操作详解(Linux实战版)| 从基础到项目落地,避坑指南
linux·服务器·c语言·开发语言·c++
wdfk_prog2 小时前
[Linux]学习笔记系列 -- [drivers][input]serio
linux·笔记·学习