我有以下流程 jmeter 并发 api 请求 -> magento-host-server -> magento-container
- 以下错误仅在测试团队的 apache jmeter 的并发请求被击中时发生。
- 并非所有 API 都会抛出此错误(只有此 API 会抛出错误 api/account/userprofile)
- 并非总是会出现错误,假设此错误发生的概率为 50%,错误率约为 30%,唯一的错误是 SSL 握手。
- 我无法在本地机器上重现此错误,该错误仅在测试团队的 jmeter 发出并发请求时发生。
- 出现此错误期间,服务器负载约为 CPU 使用率的 20-30%。
- 我在容器 apache 和应用程序日志中没有看到任何重要的错误日志
以下是 magento 应用程序容器运行的主机的 nginx 反向代理服务器配置
上游后端 {#添加用于负载测试 服务器 127.0.0.1:8484;# 添加以进行负载测试 } # 添加用于负载测试 服务器 { listen 443 ssl; # 由 Certbot 管理 服务器名称 magento.acc.abcd.eu; 客户端最大主体大小10M; 地点 / { 代理密码 https://127.0.0.1:8484; proxy_ssl_name magento.acc.abcd.eu; # 添加以进行负载测试 proxy_ssl_server_name on;#添加用于负载测试 代理缓冲区 16 16k; 代理缓冲区大小32k; proxy_set_header 主机 $http_host; proxy_set_header X-真实IP $remote_addr; proxy_set_header X-Forwarded-对于 https; 代理重定向关闭; proxy_set_header X-Forwarded-Proto $scheme; 代理缓存关闭; 代理请求缓冲关闭; 代理SSL协议TLSv1 TLSv1.1 TLSv1.2; send_timeout 3600s;#为负载测试添加 proxy_connect_timeout 3600s;#为负载测试添加 proxy_read_timeout 3600s;#为负载测试添加 memcached_connect_timeout 3600s;#为负载测试添加 memcached_read_timeout 3600s;#为负载测试添加 memcached_send_timeout 3600s;#为负载测试添加 } 访问日志/var/log/nginx/magento-access.log; 错误日志/var/log/nginx/magento-error.log; ssl_certificate /etc/nginx/ssl/star_acc_abcd_eu_full_chain.crt; # 由 Certbot 管理 ssl_certificate_key /etc/nginx/ssl/star_acc_abcd_eu.key; # 由 Certbot 管理 ssl_会话_超时1d; ssl_session_cache 共享:MozSSL:10m; ssl_session_tickets关闭; # 中间配置 ssl_协议TLSv1.2TLSv1.3; ssl_密码ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384; ssl_prefer_server_ciphers开启; ssl_dhparam /etc/nginx/certs/abcd-dhparam.pem; } 服务器 { 听 [::]:80; 听80; 服务器名称 magento.acc.abcd.eu; 返回 301 https://magento.acc.abcd.eu$request_uri; }
以下是 nginx 日志
2023/12/18 07:15:01 [错误] 1639325#0:*159305 对等端在与上游进行 SSL 握手时在 SSL 握手中关闭了连接,客户端:12.12.12.12,服务器:magento.acc.abcd.eu,请求:“GET /nl/rest/all/V1/customers/search?searchCriteria%5BfilterGroups%5D%5B0%5D%5Bfilters%5D%5B0%5D%5Bfield%5D=email&searchCriteria%5BfilterGroups%5D%5B0%5D%5Bfilters%5D%5B0%5D%5Bvalue%5D=saritaumale%40abcdtestmail.com&searchCriteria%5BfilterGroups%5D%5B0%5D%5Bfilters%5D%5B0%5D%5BconditionType%5D=eq&searchCriteria%5BsortOrders%5D%5B0%5D%5Bfield%5D=email&searchCriteria%5BsortOrders%5D%5B0%5D%5Bdirection%5D=asc HTTP/1.1", 上游: “https://127.0.0.1:8484/nl/rest/all/V1/customers/search?searchCriteria%5BfilterGroups%5D%5B0%5D%5Bfilters%5D%5B0%5D%5Bfield%5D=email&searchCriteria%5BfilterGroups%5D%5B0%5D%5Bfilters%5D%5B0%5D%5Bvalue%5D=saritaumale%40abcdtestmail.com&searchCriteria%5BfilterGroups%5D%5B0%5D%5Bfilters%5D%5B0%5D%5BconditionType%5D=eq&searchCriteria%5BsortOrders%5D%5B0%5D%5Bfield%5D=email&searchCriteria%5BsortOrders%5D%5B0%5D%5Bdirection%5D=asc”,主机: “magento.acc.abcd.eu”
以下是 magento 容器 apache2 配置
小于号 VirtualHost *:443 大于号 服务器名称 magento-ssl-proxy.acc.abcd.eu 服务器别名 magento.acc.abcd.eu fairs-m2.acc.abcd.eu clubid-m2.acc.abcd.eu appstore-m2.acc.abcd.eu whitelabel-m2.acc.abcd.eu brochure-m2.acc.abcd.eu acsifreelife-m2.acc.abcd.eu checkoutflow-m2.acc.abcd.eu subscription-m2.acc.abcd.eu forms-m2.acc.abcd.eu 标头始终设置 Strict-Transport-Security“max-age=31536000;includeSubDomains;preload” 标头始终设置 Referrer-Policy“strict-origin-when-cross-origin” 标题始终设置权限策略“加速度计=(self),环境光传感器=(),自动播放=(),电池=(),摄像头=(),跨域隔离=(self),显示捕获=(),文档域=(self),加密媒体=(self),未渲染时执行=(self),视口外执行=(self),全屏=(self),地理位置=(self),陀螺仪=(),键盘地图=(self),磁力计=(),麦克风=(),midi=(),导航覆盖=(self),付款=(self),画中画=(self),公钥凭据获取=(self),屏幕唤醒锁定=(),同步xhr =(self),usb =(),web共享=(),xr空间跟踪=(),剪贴板读取=(self),剪贴板写入=(self),游戏手柄=(),扬声器选择=(),转换测量=()、无需用户激活的焦点=()、隐藏=()、空闲检测=()、兴趣群组=()、串行=()、同步脚本=()、信任令牌兑换=()、窗口放置=()、垂直滚动=()” SSLEngine 开启 SSLCertificateFile“/usr/local/share/ca-certificates/star_acc_acsi_eu.crt” SSLCertificateKeyFile“/usr/local/share/ca-certificates/star_acc_acsi_eu.key” SSLCACertificateFile“/usr/local/share/ca-certificates/star_acc_acsi_eu.ca-bundle” ProxyPreserveHost 开启 ProxyPass / http://127.0.0.1:80/ 连接超时=60 超时=1200 Keepalive=On # 添加用于负载测试 超时 1200 代理超时 300 # 添加用于负载测试 RequestHeader 设置 X-Forwarded-Port “443” RequestHeader 设置 X-Forwarded-Proto "https" 错误日志“logs/ssl-proxy-error.log” CustomLog“logs/ssl-proxy-access.log”代理 CustomLog 日志/ssl_request_log“%t%h%{SSL_PROTOCOL}x%{SSL_CIPHER}x \“%r\”%b” 小于号/VirtualHost 大于号
下面是容器 apache2 日志,该日志是在主机 nginx 服务器端发生 SSL 握手错误后几秒生成的
[Tue Dec 19 06:32:47.463827 2023] [proxy_fcgi:error] [pid 268875] (70007)指定的超时已过期:[客户端 127.0.0.1:40270] AH01075:将请求发送到时出错:(轮询) [Tue Dec 19 06:32:48.239519 2023] [proxy_fcgi:error] [pid 268508] (70007)指定的超时已过期:[客户端 127.0.0.1:40670] AH01075:将请求发送到时出错:(轮询)
我尝试了什么?
我尝试了以下配置中用 # 标记的所有选项,以进行负载测试
答案1
最有可能的是peer closed connection in SSL handshake
JMeter 方面的问题。
值得检查
- jmeter.log文件 最好为 Apache HttpComponents 启用 JMeter 调试日志记录
- 启用 SSL/TLS 连接调试对于 JMeter
- 任何资源限制或网络问题