去评论
dz插件网

解决nginx+php/java/go/python+mysql下time_wait连接数过多问题[转]

逝水年华
2024/03/14 12:47:05
公司服务器连接数超过10K了,查了下大多数是没有即时回收,采用tcp复用容易后程序出现了故障,以前一直看到说PHP持久连接有问题,所以没怎么用,最近有机会试了下。
非常香,连接数直接降低到几百了,目前观察数周没有问题。
查看连接数
  1. netstat -n |  wc -l # 总连接数
  2. netstat -n | grep -i time_wait | wc -l # time_wait 连接数
  3. netstat -anp # 查看占用端口过多的程序
tcp复用解决方案

网上大部分解决方案是修改sysctl.conf回收重用ipv4连接,但是可能带来其他问题
  1. net.ipv4.tcp_syncookies = 1
  2. net.ipv4.tcp_timestamps=1
  3. net.ipv4.tcp_tw_reuse=1
  4. net.ipv4.tcp_tw_recycle=1
  5. net.ipv4.tcp_fin_timeout=30
  6. net.ipv4.tcp_keepalive_time = 600
nginx fastcgi(php) 解决方案

修改nginx.conf
  1. upstream fastcgi_backend {
  2.     server 127.0.0.1:9000;
  3.     keepalive 60;
  4. }
  5. location ~ \.php$ {
  6.         fastcgi_pass  fastcgi_backend;
  7.         fastcgi_keep_conn on;
  8.         fastcgi_index  index.php;
  9.         fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;
  10.         include        fastcgi_params;
  11. }
主要是 fastcgi_keep_conn on 与 upstream 的 keepalive
nginx + proxy (python/go/java) 解决方案
  1. upstream wxpic {
  2.     keepalive 60;
  3.     server 127.0.0.1:xxx;
  4. }
  5. server {
  6.     keepalive_requests 10000; # 默认100
  7.     location / {
  8.         proxy_http_version 1.1;
  9.         proxy_set_header Connection "";
  10.     }
  11. }
主要是 proxy_http_version, proxy_set_header Connection ""以及keepalive_requests
mysql数据库连接解决方案

修改yii数据库配置采用长链接
  1. 'db' => [
  2.     'class' => 'yii\db\Connection',
  3.     'dsn' => '*', 'username' => '*',
  4.     'password' => '*',
  5.     'charset' => 'utf8mb4',
  6.     'attributes' => [
  7.        PDO::ATTR_PERSISTENT => true
  8.     ]
  9. ],
redis 连接数

Yii redis 持久配置
  1. 'redis' => [
  2.         'class' => 'yii\redis\Connection',
  3.          'hostname' => '127.0.0.1',
  4.          'retries' => 3,
  5.          'port' => 6379,
  6.          'password' => '',
  7.          'socketClientFlags' => STREAM_CLIENT_CONNECT | STREAM_CLIENT_PERSISTENT,
  8.      ],
predis redis 持久配置
  1. $client = new \Predis\Client([
  2.        'scheme' => 'tcp',
  3.        'host' => $redis->hostname,
  4.        'port' => $redis->port,
  5.        'password' => $redis->password,
  6.        'persistent'=>true,
  7.   ]);
phpredis redis 持久配置
  1. $redis->pconnect('127.0.0.1', 6379);

源文地址:https://c4ys.com/archives/1609