标签 magento 下的文章

magento - ValidationSchemaException 出错 - esconfig.xsd - 因为cPanel环境升级xml版本导致

现象:magento首页或单页内容显示正常,但在产品分类页提示出错,如:

Exception #0 (Magento\Framework\Config\Dom\ValidationSchemaException): Processed schema file: public_html/vendor/magento/module-elasticsearch/etc/esconfig.xsd
complex type 'mixedDataType': The content model is not determinist.
Line: 18

#1 Magento\Framework\Config\Dom->_initDom() called at [vendor/magento/framework/Config/Dom.php:116]
#2 Magento\Framework\Config\Dom->__construct() called at [vendor/magento/framework/Config/Reader/Filesystem.php:196]
#3 Magento\Framework\Config\Reader\Filesystem->_createConfigMerger() called at [vendor/magento/framework/Config/Reader/Filesystem.php:151]
#4 Magento\Framework\Config\Reader\Filesystem->_readFiles() called at [vendor/magento/framework/Config/Reader/Filesystem.php:132]

尝试:将文件 vendor/magento/module-elasticsearch/etc/esconfig.xsd 中的这行内容删除或注释掉:<xs:element type="xs:string" name="default" minOccurs="1" maxOccurs="1" />

原因可能是cPanel环境中,升级了xml,导致软件不兼容。

参考:

为 magento 网站后台启用双因素身份验证登录 - 谷歌身份验证器 - Two-Factor Authentication - google authenticator

需求:magento 2.4 以上版本默认为网站后台启用双因素身份验证登录,假如主机不支持smtp发信,怎么办呢?

尝试:

  1. bin/magento config:set twofactorauth/general/force_providers google # 设置使用谷歌验证器
  2. bin/magento config:set twofactorauth/google/otp_window 60 # 设置验证码有效期一分钟
  3. bin/magento security:tfa:google:set-secret liujia NJUGMZZUPFSGEZDHBI====== # 为 liujia 用户设置 NJUGMZZUPFSGEZDHBI====== 密钥;可在linux里使用 echo jhfg4ydbdg | base32 的命令来生成密钥
  4. 在谷歌浏览器里,安装“身份验证器”的扩展。添加新项,手工输入标识和密钥
  5. 在 magento 里登录,会提示输入由谷歌身份验证器生成的动态验证码,六位数字

首次登录,会提示需按邮件内容启用2fa
图1:首次登录,会提示需按邮件内容启用2fa

手工输入密钥后,谷歌身份验证器会动态生成验证码
图2:手工输入密钥后,谷歌身份验证器会动态生成验证码

登录网站后台时,会提示输入动态验证码
图3:登录网站后台时,会提示输入动态验证码

参考:

MageSuite 的 GDPR 模块默认隐藏了客户信息 - magesuite-gdpr - hide customer data default

现象:安装好 magesuite 套件后,在网站后台查看订单列表和详情页,大部分客户信息,如姓名、地址等显示为星号,看不到完整内容。

尝试:因为 magesuit 的 gdpr 模块默认是将magento的管理员组设置的权限是 hide customer data,所以即使是magento的管理员,默认也查看不到完整的客户信息。可以在magento的用户组权限里,为资源权限 Roles Resource 选择“自定义” Custom,除 GDPR - Hide customer data 项外全部勾选。意思即是不为管理员组的用户启用“隐藏客户信息”的功能。

不显示完整的客户信息,带星号
图1:不显示完整的客户信息,带星号

自定义管理员组的资源权限
图2:自定义管理员组的资源权限

客户信息现在能正常显示了
图3:客户信息现在能正常显示了

参考:

安装 magento 2.4.6-p1

当前,magento 官方商城使用的程序版本是 magento 2.4.6-p1 。尝试安装一下,记录遇到的问题。

问题一:debian 12系统里,默认安装的mariadb版本是10.11.3,但 magento 要求是10.6。数据库的版本过高,magento安装程序不认。

出错信息:Current version of RDBMS is not supported. Used Version: 10.11.3-MariaDB-1. Supported versions: MySQL-8, MySQL-5.7, MariaDB-(10.2-10.6)

或:

Warning: preg_match(): Compilation failed: range out of order in character class at offset 25 in magento/vendor/magento/framework/DB/Adapter/SqlVersionProvider.php on line 101

尝试:

对于第一个报错,按照网上的例子,修改 magento/app/etc/di.xml 文件内容,如:
<item name="MariaDB-(10.2-10.11)" xsi:type="string">^10\.[2-11]\.</item> 直接修改版本号。

第二个报错,修改 magento/vendor/magento/framework/DB/Adapter/SqlVersionProvider.php 文件内容,如:

        $pattern = sprintf('/(%s)/', implode('|', $this->supportedVersionPatterns));
        $pattern = '/10.11/';
        $sqlVersionOutput = '10.11.3-MariaDB-1';
        preg_match($pattern, $sqlVersionOutput, $match);

问题二:magento 安装程序,连接不上刚刚安装的 opensearch ,提示:Could not validate a connection to the opensearch, no alive nodes found in your cluster

尝试:在 /etc/opensearch/opensearch.yml 文件中,添加一行 plugins.security.disabled: true ,即将opensearch的https和用户访问的安全设置禁用。

问题三:使用 nginx 的反向代理 apache 上的 magento 站点后,https 访问异常,如不断地循环跳转。

magento 的站点网址设置等,和平时的差不多,如下例:

catalog/search/engine - opensearch
catalog/search/opensearch_server_hostname - localhost
catalog/search/opensearch_server_port - 9200
catalog/search/opensearch_index_prefix - magento2
catalog/search/opensearch_server_timeout - 15
catalog/category/root_id - 2
web/seo/use_rewrites - 1
web/unsecure/base_url - http://magento.anqun.org/
web/unsecure/base_static_url -
web/unsecure/base_media_url -
web/secure/base_url - https://magento.anqun.org/
web/secure/base_static_url -
web/secure/base_media_url -
web/secure/enable_hsts - 0
web/secure/enable_upgrade_insecure - 0
web/secure/use_in_frontend - 1
web/secure/use_in_adminhtml - 1
web/secure/offloader_header -
web/default_layouts/default_product_layout - product-full-width
web/default_layouts/default_category_layout - category-full-width
web/default_layouts/default_cms_layout - cms-full-width
web/cookie/cookie_path -
web/cookie/cookie_domain -
web/cookie/cookie_httponly - 1
general/locale/code - zh_Hans_CN
general/locale/timezone - Asia/Shanghai
general/region/display_all - 1
general/region/state_required - AL,AR,AU,BG,BO,BR,BY,CA,CH,CL,CN,CO,CZ,DK,EC,EE,ES,GR,GY,HR,IN,IS,IT,LT,LV,MX,PE,PL,PT,PY,RO,SE,SR,US,UY,VE
currency/options/base - CNY
currency/options/default - CNY
currency/options/allow - CNY
analytics/subscription/enabled - 1
crontab/default/jobs/analytics_subscribe/schedule/cron_expr - 0 * * * *
crontab/default/jobs/analytics_collect_data/schedule/cron_expr - 00 02 * * *

关键应该是设置 https 的环境参数,如通过 .htaccess 添加以下内容:

setenv HTTPS on
SetEnv HTTP_X_FORWARDED_PROTO "https"

如果nginx反代配置中使用了 X-Real-IP 头,那么 apache 中的访问日志,可以使用 LogFormat "%h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\" \"%{X-Real-IP}i\"" proxycombined 来记录访客IP。

nginx站点例子:

server {
        listen       443 ssl;  
        server_name  magento.anqun.org; 

        ssl_certificate          fullchain.cer;
        ssl_certificate_key      magento.anqun.org.key;

        proxy_buffer_size   128k;
        proxy_buffers   4 256k;
        proxy_busy_buffers_size   256k;

        location / {
                proxy_set_header   Host             $host;
                proxy_set_header   X-Real-IP        $remote_addr;
                proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
                proxy_pass         http://192.168.1.9:8001;
        }
}

参考:

magento - 负载高 - 后台任务 - cron_schedule

现象:magento2站点,查看系统负载,在4.5左右。
尝试:在top命令详情中,mysqld和php进程占用CPU、内存高。先删除magento的定时任务,再手动退出当前的php任务进程,系统负载明显回落。但将定时任务加回后,负载又升高。最后,将数据库中的cron_schedule清空,即执行 TRUNCATE cron_schedule; 后,基本恢复正常。

参考:https://magento.stackexchange.com/questions/203107/magento-2-cron-schedule-table-increasing-and-cpu-100