AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / user-226592

rjbathgate's questions

Martin Hope
rjbathgate
Asked: 2020-11-03 16:24:02 +0800 CST

Codeignitor - 在登录/会话负载下 MySQL CPU 峰值和致命的 MySQL 死锁

  • 1

最初发布在stackoverflow上,并被推荐 serverfault 可能是更好的地方。

我有一个网站使用:

  • AWS RDS (MySQL Aurora) - 单个 t3.medium 实例
  • 负载均衡器上的 4 个 EC2(固定实例非弹性)
  • CodeIgnitor 3 代码库(3.1.11)(我刚刚根据推荐从 3.1.7 升级,因为新版本中有一些 Session 改进)。

一些规格:

EC2:

PHP Version 7.2.32-1+ubuntu18.04.1+deb.sury.org+1
Linux ip-172-32-19-104 5.4.0-1028-aws #29~18.04.1-Ubuntu SMP Tue Oct 6 17:14:23 UTC 2020 x86_64
Apache/2.4.29 (Ubuntu)

RDS:

5.6.mysql_aurora.1.22.2
Instance class: db.t3.medium
vCPU: 2
RAM: 4 GB

在繁重的负载下(500 人尝试在十分钟内登录),我们会遇到间歇性但重大的问题。很难获得有关用户体验的确切信息,但事情表明:

  • RDS MySQL Aurora CPU 显着飙升 (100%)
  • RDS MySQL Aurora Connections 峰值 (30-45) - 根据我的阅读,RDS Max Connections 是 {DBInstanceClassMemory/12582880},所以大约 340 4GB(1024 4 1024*1024)/12582880
  • 产生的错误Deadlock found when trying to get lock; try restarting transaction- 请参阅下面的完整错误跟踪。

因此,我做出了一个可能不正确的假设:

  1. 增加负载 >> 增加 RDS CPU 使用率
  2. 高 RDS CPU >> 死锁 >> 致命的 MySQL 错误(我对死锁不太熟悉,不知道这是否会发生,但听起来可行)。

错误指向libaries\Session\drivers\Session_database_driver.php,具体来说:

     /**
     * Write
     *
     * Writes (create / update) session data
     *
     * @param   string  $session_id Session ID
     * @param   string  $session_data   Serialized session data
     * @return  bool
     */
    public function write($session_id, $session_data)

   ...
   ...
   ...
   if ($this->_db->update($this->_config['save_path'], $update_data))
        {
            $this->_fingerprint = md5($session_data);
            return $this->_success;
        }

因此,我们在尝试更新 CI 会话时遇到了数据库死锁。

它似乎总是在用户登录过程中抛出错误,我认为这是更新会话繁重。

此会话和数据库类符合 CI 3.1.7 代码库。

当前的 Code Ignitor Session 配置如下:

$config['sess_driver'] = 'database';
$config['sess_cookie_name'] = 'ci_session';
$config['sess_expiration'] = 7200;
$config['sess_save_path'] = 'ci_sessions';
$config['sess_match_ip'] = FALSE;
$config['sess_time_to_update'] = 300;
$config['sess_regenerate_destroy'] = FALSE;

所以,如果我的假设是正确的,那么最好的行动计划是什么:

  1. 迁移到 RDS Serverless 并让 RDS 扩展以处理 CPU 负载?(我在某处读到 Serverless 可能无法很好地处理锁,因为它在锁定时无法正确扩展......我对此的理解显然是有限的)
  2. 迁移到更大的固定(非无服务器)RDS 来处理 CPU 负载?(不理想,因为 95% 的时间网站没有流量)
  3. 修改会话以存储在文件而不是数据库中- 这对我来说听起来很合乎逻辑,因为我们将所有会话负载从 MySQL 中移除,但我不完全了解任何其他后果,也不是只是修改$config['sess_driver']和设置会话文件文件夹路径
  4. 别的东西......(php-fpm?)

对于选项 3),我们使用负载均衡器,所以我担心如果用户在中途切换 LB,基于文件的会话将意味着用户会话的丢失。虽然,这可能是一个可以管理的问题,因为用户将在他们逗留期间留在 LB 上,除非它在中途跌倒。

选项 1 和 2 似乎是一种创可贴的方法,而不是解决无效的问题,但是,这可能只是资源不足的情况。

我在其他地方读到了一篇关于使用 php-fpm 减少同时 apache 线程数量的类似帖子的建议,但不确定这是否与此处相关,特别是在 php 7.2 上给出

很难“测试”,因为它只发生在大量用户登录负载下,所以一些建议将不胜感激,所以我不必在黑暗中多次刺伤。

谢谢

编辑:

以下完整错误的副本:

A Database Error Occurred 

Error Number: 1213 

Deadlock found when trying to get lock; try restarting transaction 

UPDATE `ci_sessions` SET `timestamp` = 1604298368 WHERE `id` = 'fqi83a50dfknbvl9h2r98mtgn2f3j2j6' Filename: libraries/Session/drivers/Session_database_driver.php 

Line Number: 260 

A PHP Error was encountered 

Severity: Warning 

Message: Unknown: Cannot call session save handler in a recursive manner 

Filename: Unknown 

Line Number: 0 
Backtrace: 

A PHP Error was encountered 

Severity: Warning 

Message: Unknown: Failed to write session data using user defined save handler. (session.save_path: /var/lib/php/sessions) 

Filename: Unknown 

Line Number: 0 

Backtrace

编辑: SHOW CREATE TABLE ci_sessions;

'ci_sessions', 'CREATE TABLE `ci_sessions` (
 `id` varchar(128) NOT NULL,
 `ip_address` varchar(45) NOT NULL,
 `timestamp` int(10) unsigned NOT NULL DEFAULT \'0\',
 `data` blob NOT NULL,
  KEY `ci_sessions_timestamp` (`timestamp`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8'
mysql session amazon-rds deadlock
  • 1 个回答
  • 413 Views
Martin Hope
rjbathgate
Asked: 2019-09-23 15:09:17 +0800 CST

Fail2Ban - IP 表拒绝不禁止

  • 0

我在 Ubuntu 16 上运行了 fail2ban,并运行了一些监狱。

一种是 http-get-dos:

在 jail.conf 中

[http-get-dos]
enabled = true
port = http,https
filter = http-get-dos
logpath = /var/log/apache2/access.log
maxretry = 100
findtime = 60
#ban for 5 minutes
bantime = 600
action = iptables[name=HTTP, port=http, protocol=tcp]

过滤文件:

# Fail2Ban configuration file
[Definition]

# Option: failregex
# Note: This regex will match any GET entry in your logs, so basically all valid and not valid entries are a match.
# You should set up in the jail.conf file, the maxretry and findtime carefully in order to avoid false positives.
failregex = ^<HOST> -.*"(GET|POST).*
# Option: ignoreregex
ignoreregex =

Fail2Ban 中的监狱似乎运行良好——我只是通过敲击 URL 对其进行了测试,并且我的 IP 已添加到 IP 表中。

但是,我实际上并没有被阻止 - IP 表 REJECT 似乎不起作用。

my.ip.address 出现在 Chain fail2ban-HTTP a REJECT 中的 IP 表中,但我没有被拒绝(仍然可以访问该站点)

iptables -nvL --line-numbers

Chain INPUT (policy ACCEPT 2689 packets, 413K bytes)
num   pkts bytes target     prot opt in     out     source               destination         
1       68  5849 fail2ban-HTTP  tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:80
2     3104  575K fail2ban-apache-overflows  tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            multiport dports 80,443
3     3104  575K fail2ban-apache  tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            multiport dports 80,443
4      728 43824 fail2ban-ssh  tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            multiport dports 22

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source               destination         

Chain OUTPUT (policy ACCEPT 3325 packets, 4380K bytes)
num   pkts bytes target     prot opt in     out     source               destination         

Chain fail2ban-HTTP (1 references)
num   pkts bytes target     prot opt in     out     source               destination         
1        0     0 REJECT     all  --  *      *       my.ip.address
     0.0.0.0/0            reject-with icmp-port-unreachable
2       68  5849 RETURN     all  --  *      *       0.0.0.0/0            0.0.0.0/0           

Chain fail2ban-apache (1 references)
num   pkts bytes target     prot opt in     out     source               destination         
1     3104  575K RETURN     all  --  *      *       0.0.0.0/0            0.0.0.0/0           

Chain fail2ban-apache-overflows (1 references)
num   pkts bytes target     prot opt in     out     source               destination         
1     3104  575K RETURN     all  --  *      *       0.0.0.0/0            0.0.0.0/0           

Chain fail2ban-ssh (1 references)
num   pkts bytes target     prot opt in     out     source               destination         
1      728 43824 RETURN     all  --  *      *       0.0.0.0/0            0.0.0.0/0  

我想知道这是否是一个订单问题 - 即全球 ACCEPT 胜过 IPTables 中的 fail2ban 规则。但如果这是问题所在,我不知道如何解决它,以及为什么fail2ban 一开始就没有把它放得足够高。

任何建议,非常感谢。

iptables
  • 1 个回答
  • 1175 Views
Martin Hope
rjbathgate
Asked: 2014-06-17 14:37:53 +0800 CST

为 Apache 服务器上的所有域创建 robots.txt 文件,但收到权限错误

  • 1

我在我的 Ubuntu 服务器上创建了一个“全局”robots.txt 文件并将其定位在

/home/robots.txt

然后在 /etc/apache2/apache.conf 的底部添加了这个:

Alias /robots.txt /home/robots.txt

并重新启动apache。

但是,当尝试访问 myvirtualhost.com/robots.txt 时,我得到 403 Forbidden。

/home/robots.txt 归 'root' 和 chmod 755 所有(测试为 777 也有错误)。

如果我将 Alias /robots.txt /home/robots.txt 更改为 Alias /robots.txt /home/myvirualhost/public_html/robots.txt 它可以工作 - 即确认此 Alias 规则正在运行。

我有另一个(较旧的)服务器,它具有完全相同的设置(root 拥有的 /home/robots.txt),它适用于所有虚拟主机及其用户。

我想知道 myvirtualhost.com/robots.txt 是否以 myvirtualhost 用户身份运行,因此无法访问 /home/robots.txt 但不确定,因为我认为我的旧服务器没有为此设置任何特殊权限... (不记得了)。

如果我删除 /home/robots.txt 我仍然会收到 403 Permission 错误,而不是找不到。

我有多个虚拟主机,所以不能只将其更改为 /home/myonevirualhost/public_html/robots.txt

非常感激任何的帮助。

谢谢

解决了:

将此添加到 apache.conf 文件中(并且需要全部授予,而不是允许形式全部作为运行最新版本的 apache):

**<Location "/robots.txt">
    SetHandler None
    Require all granted
</Location>**
Alias /robots.txt /home/robots.txt

但我还不能将其标记为已解决,因为我没有足够的分数在 8 小时内解决 :-)

permissions
  • 1 个回答
  • 9762 Views

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve