本页目录
- 准备工作
- 步骤 1 - 配置防火墙
- 步骤 2 - 安装 PHP 及其扩展
- 步骤 3 - 安装 Composer
- 步骤 4 - 安装 MariaDB
- 步骤 5 - 配置 MariaDB
- 步骤 6 - 安装 Nginx
- 步骤 7 - 安装 SSL
- 步骤 8 - 安装 Elasticsearch
- 步骤 9 - 安装 Redis 服务器
- 步骤 10 - 下载 Magento
- 步骤 11 - 安装 Magento
- 步骤 12 - 配置 PHP-FPM
- 步骤 13 - 配置 SELinux
- 步骤 14 - 配置 Nginx
- 步骤 15 - 禁用双因素身份验证
- 步骤 16 - 访问管理后台
- 步骤 17 - 启用并配置双因素身份验证
- 总结
Magento 是一个用 PHP 编写的开源电子商务平台,于 2018 年被 Adobe 收购。它也提供商业版和基于云的产品形式。你可以使用 Magento 创建高负载的专业购物网站。它同时支持单店铺和多店铺两种模式,并附带大量可用于扩展功能的模块。
在本教程中,我们将安装 Magento 开源社区版。它提供了搭建专业在线商店所需的全部功能。我们还会安装 Elasticsearch 用于商品目录搜索、Redis 用于会话与文件缓存,并通过 Nginx 服务器对外提供服务。
准备工作
- 一台运行 Rocky Linux 9 的服务器,至少 2GB 内存。根据需求不同,你可能需要更多内存。
- 一个拥有 sudo 权限的非 root 用户。
- 服务器的完全限定域名(FQDN),例如 magento.example.com。
- 确保系统已更新。 $ sudo dnf update
- 系统需要安装的一些软件包。 $ sudo dnf install wget curl nano unzip yum-utils policycoreutils-python-utils -y 其中部分软件包可能已在你的系统中安装。
一台运行 Rocky Linux 9 的服务器,至少 2GB 内存。根据需求不同,你可能需要更多内存。
一个拥有 sudo 权限的非 root 用户。
服务器的完全限定域名(FQDN),例如 magento.example.com。
确保系统已更新。
$ sudo dnf update
系统需要安装的一些软件包。
$ sudo dnf install wget curl nano unzip yum-utils policycoreutils-python-utils -y
其中部分软件包可能已在你的系统中安装。
步骤 1 - 配置防火墙
第一步是配置防火墙。Rocky Linux 使用 Firewalld 防火墙,先检查防火墙的状态。
$ sudo firewall-cmd --state
running
防火墙通过不同的区域(zone)工作,我们将使用默认的公共区域(public zone)。列出防火墙上所有已激活的服务和端口。
$ sudo firewall-cmd --permanent --list-services
输出应类似以下内容。
cockpit dhcpv6-client ssh
放行 HTTP 和 HTTPS 端口。
$ sudo firewall-cmd --permanent --add-service=http
$ sudo firewall-cmd --permanent --add-service=https
再次检查防火墙状态。
$ sudo firewall-cmd --permanent --list-services
你应该能看到类似的输出。
cockpit dhcpv6-client http https ssh
重新加载防火墙以使更改生效。
$ sudo firewall-cmd --reload
步骤 2 - 安装 PHP 及其扩展
Rocky Linux 9 默认自带 PHP 8.1。若要始终使用最新版本的 PHP,或希望安装多个 PHP 版本,我们需要使用 REMI 仓库。
第一步是获取 Epel 仓库。
$ sudo dnf install epel-release -y
接下来安装 Remi 仓库。
$ sudo dnf install https://rpms.remirepo.net/enterprise/remi-release-9.rpm
查看可用的 PHP 软件流(stream)。
$ dnf module list php -y
Name Stream Profiles Summary
php 8.1 common [d], devel, minimal PHP scripting language
Remi's Modular repository for Enterprise Linux 9 - x86_64
Name Stream Profiles Summary
php remi-7.4 common [d], devel, minimal PHP scripting language
php remi-8.0 common [d], devel, minimal PHP scripting language
php remi-8.1 common [d], devel, minimal PHP scripting language
php remi-8.2 common [d], devel, minimal PHP scripting language
php remi-8.3 common [d], devel, minimal PHP scripting language
Hint: [d]efault, [e]nabled, [x]disabled, [i]nstalled
默认版本为 8.1。在撰写本教程时,Magento 兼容 PHP 8.2,因此启用 Remi 的 PHP 8.2 仓库。
$ sudo dnf module reset php -y
$ sudo dnf module enable php:remi-8.2
运行以下命令即可安装 PHP 以及 Magento 所需的扩展。
$ sudo dnf install php-fpm php-cli php-mysql php-mbstring php-xml php-gd php-bcmath php-zip php-curl php-tidy php-intl php-soap php-opcache php-xsl php-sodium
验证安装结果。
$ php --version
PHP 8.2.15 (cli) (built: Jan 16 2024 12:19:32) (NTS gcc x86_64)
Copyright (c) The PHP Group
Zend Engine v4.2.15, Copyright (c) Zend Technologies
with Zend OPcache v8.2.15, Copyright (c), by Zend Technologies
步骤 3 - 安装 Composer
Composer 是 PHP 的依赖管理工具,安装 Magento 时必须使用它。
运行以下命令下载 Composer 二进制文件。由于 Magento 需要 Composer 2.2 LTS,我们据此对命令做了相应调整。
$ php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
$ php composer-setup.php --2.2
$ php -r "unlink('composer-setup.php');"
将二进制文件移动到 /usr/local/bin 目录以完成 Composer 安装。
$ sudo mv composer.phar /usr/local/bin/composer
通过查看版本号来验证安装。
$ composer --version
Composer version 2.2.22 2023-09-29 10:53:45
步骤 4 - 安装 MariaDB
Rocky Linux 9 自带的 MariaDB 版本较旧,因此我们将使用 MariaDB 官方仓库进行安装。在撰写本教程时,Magento 支持 MariaDB 10.6,这正是我们将要安装的版本。
导入 MariaDB 的 GPG 密钥。
$ sudo rpm --import https://supplychain.mariadb.com/MariaDB-Server-GPG-KEY
创建并打开 /etc/yum.repos.d/mariadb.repo 文件进行编辑。
$ sudo nano /etc/yum.repos.d/mariadb.repo
在其中粘贴以下代码。
[mariadb]
name = MariaDB
baseurl = https://rpm.mariadb.org/10.6/rhel/$releasever/$basearch
gpgkey= https://rpm.mariadb.org/RPM-GPG-KEY-MariaDB
gpgcheck=1
按 Ctrl + X 保存文件,并在提示时输入 Y 确认。
$ sudo dnf install MariaDB-server
检查 MySQL(MariaDB)的版本。
$ mysql --version
mysql Ver 15.1 Distrib 10.6.16-MariaDB, for Linux (x86_64) using EditLine wrapper
启用并启动 MariaDB 服务。
$ sudo systemctl enable mariadb --now
运行 MariaDB 安全安装脚本。
$ sudo mariadb-secure-installation
系统会要求输入 root 密码。直接按回车键,因为我们尚未为其设置密码。
NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MariaDB
SERVERS IN PRODUCTION USE! PLEASE READ EACH STEP CAREFULLY!
In order to log into MariaDB to secure it, we'll need the current
password for the root user. If you've just installed MariaDB, and
haven't set the root password yet, you should just press enter here.
Enter current password for root (enter for none):
接下来会询问是否切换到 Unix socket 认证方式。unix_socket 插件允许你使用操作系统凭据连接 MariaDB 服务器。由于你已经拥有一个受保护的 root 账户,输入 n 继续。
OK, successfully used password, moving on...
Setting the root password or using the unix_socket ensures that nobody
can log into the MariaDB root user without the proper authorisation.
You already have your root account protected, so you can safely answer 'n'.
Switch to unix_socket authentication [Y/n] n
随后会询问是否更改 root 密码。输入 Y 继续,并将 root 密码修改为强壮且安全的密码。
... skipping.
You already have your root account protected, so you can safely answer 'n'.
Change the root password? [Y/n] Y
New password:
Re-enter new password:
Password updated successfully!
Reloading privilege tables..
... Success!
接下来会提出几个用于提升 MariaDB 安全性的问题。输入 Y 以删除匿名用户、禁止 root 远程登录、移除测试数据库并重新加载权限表。
By default, a MariaDB installation has an anonymous user, allowing anyone
to log into MariaDB without having to have a user account created for
them. This is intended only for testing, and to make the installation
go a bit smoother. You should remove them before moving into a
production environment.
Remove anonymous users? [Y/n] y
... Success!
Normally, root should only be allowed to connect from 'localhost'. This
ensures that someone cannot guess at the root password from the network.
Disallow root login remotely? [Y/n] y
... Success!
By default, MariaDB comes with a database named 'test' that anyone can
access. This is also intended only for testing, and should be removed
before moving into a production environment.
Remove test database and access to it? [Y/n] y
- Dropping test database...
... Success!
- Removing privileges on test database...
... Success!
Reloading the privilege tables will ensure that all changes made so far
will take effect immediately.
Reload privilege tables now? [Y/n] y
... Success!
Cleaning up...
All done! If you've completed all of the above steps, your MariaDB
installation should now be secure.
Thanks for using MariaDB!
你可以在命令行中输入 sudo mysql 或 sudo mariadb 进入 MariaDB shell。
步骤 5 - 配置 MariaDB
登录 MariaDB shell。
$ sudo mariadb
为 Magento 创建一个数据库。
MariaDB > CREATE DATABASE magento;
创建一个 SQL 用户账户。
MariaDB > CREATE USER 'magentouser'@'localhost' IDENTIFIED BY 'Your_password2';
将该数据库的全部权限授予该用户。
MariaDB > GRANT ALL PRIVILEGES ON magento.* TO 'magentouser'@'localhost';
刷新用户权限。
MariaDB > FLUSH PRIVILEGES;
退出 shell。
MariaDB > exit
步骤 6 - 安装 Nginx
Rocky Linux 9 自带的 Nginx 版本较旧,你需要使用 Nginx 官方仓库来安装最新版本。
创建并打开 /etc/yum.repos.d/nginx.repo 文件进行编辑。
$ sudo nano /etc/yum.repos.d/nginx.repo
在其中粘贴以下代码。
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true
[nginx-mainline]
name=nginx mainline repo
baseurl=http://nginx.org/packages/mainline/centos/$releasever/$basearch/
gpgcheck=1
enabled=0
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true
完成后按 Ctrl + X,并在提示时输入 Y 保存文件。
我们将安装 Nginx mainline 版本,因此启用对应的软件包。
$ sudo dnf config-manager --enable nginx-mainline
安装 Nginx。
$ sudo dnf install nginx -y
验证安装结果。
$ nginx -v
nginx version: nginx/1.25.3
启用并启动 Nginx 服务。
$ sudo systemctl enable nginx --now
检查服务状态。
? nginx.service - nginx - high performance web server
Loaded: loaded (/usr/lib/systemd/system/nginx.service; enabled; preset: disabled)
Drop-In: /etc/systemd/system/nginx.service.d
??php-fpm.conf
Active: active (running) since Fri 2024-01-26 06:46:17 UTC; 1s ago
Docs: http://nginx.org/en/docs/
Process: 19765 ExecStart=/usr/sbin/nginx -c /etc/nginx/nginx.conf (code=exited, status=0/SUCCESS)
Main PID: 19767 (nginx)
Tasks: 3 (limit: 12225)
Memory: 3.1M
CPU: 16ms
CGroup: /system.slice/nginx.service
??19767 "nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf"
??19768 "nginx: worker process"
??19769 "nginx: worker process"
步骤 7 - 安装 SSL
我们需要安装 Certbot 来生成 SSL 证书,这里将使用 Snapd 软件包安装器完成。由于 Rocky Linux 默认未附带它,因此需要安装 Snapd 安装器。它依赖 EPEL(Extra Packages for Enterprise Linux)仓库才能工作,不过我们在步骤 3 中已经安装过,所以可以直接继续。
安装 Snapd 软件包。
$ sudo dnf install -y snapd
启用并启动 Snap 服务。
$ sudo systemctl enable snapd --now
安装 Snap core 软件包,并确保你的 Snapd 版本是最新的。
$ sudo snap install core && sudo snap refresh core
创建 Snapd 正常工作所需的链接。
$ sudo ln -s /var/lib/snapd/snap /snap
$ echo 'export PATH=$PATH:/var/lib/snapd/snap/bin' | sudo tee -a /etc/profile.d/snapd.sh
安装 Certbot。
$ sudo snap install --classic certbot
运行以下命令,通过创建指向 /usr/bin 目录的符号链接,确保 Certbot 命令可以直接运行。
$ sudo ln -s /snap/bin/certbot /usr/bin/certbot
验证 Certbot 是否正常工作。
$ certbot --version
certbot 2.8.0
运行以下命令生成 SSL 证书。
$ sudo certbot certonly --nginx --agree-tos --no-eff-email --staple-ocsp --preferred-challenges http -m
[email protected]
-d magento.example.com
上述命令会将证书下载到服务器上的 /etc/letsencrypt/live/magento.example.com 目录。
生成 Diffie-Hellman 组证书。
$ sudo openssl dhparam -dsaparam -out /etc/ssl/certs/dhparam.pem 4096
检查 Certbot 续期调度服务。
$ sudo systemctl list-timers
你会看到 snap.certbot.renew.service 被列为计划运行的服务之一。
NEXT LEFT LAST PASSED UNIT ACTIVATES
-------------------------------------------------------------------------------------------------------------------------------
Fri 2024-01-26 08:05:24 UTC 1h 1min left Fri 2024-01-26 06:35:00 UTC 29min ago dnf-makecache.timer dnf-makecache.service
Fri 2024-01-26 14:20:42 UTC 7h left Thu 2024-01-25 14:20:42 UTC 16h ago systemd-tmpfiles-clean.timer systemd-tmpfiles-clean.service
Fri 2024-01-26 22:37:00 UTC 15h left - - snap.certbot.renew.timer snap.certbot.renew.service
对续期流程进行一次空运行(dry run),以确认 SSL 续期是否正常工作。
$ sudo certbot renew --dry-run
如果没有出现错误,说明一切就绪,证书将自动续期。
步骤 8 - 安装 Elasticsearch
Magento 使用 Elasticsearch 进行商品搜索。我们将通过其官方仓库安装 Elasticsearch 7.x,因为这是与当前最新版 Magento 2.4.6 兼容的版本。需求页面也提到了 Elasticsearch 8.5,但它与 Magento 配合并不正常。
导入 Elasticsearch 的 GPG 密钥。
$ sudo rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch
在 /etc/yum.repos.d/ 目录下创建名为 elasticsearch.repo 的文件并打开进行编辑。
$ sudo nano /etc/yum.repos.d/elasticsearch.repo
在其中粘贴以下代码。
[elasticsearch]
name=Elasticsearch repository for 7.x packages
baseurl=https://artifacts.elastic.co/packages/7.x/yum
gpgcheck=1
gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
enabled=0
autorefresh=1
type=rpm-md
完成后按 Ctrl + X,并在提示时输入 Y 保存文件。
安装 Elasticsearch。
$ sudo dnf install --enablerepo=elasticsearch elasticsearch
Elasticsearch 会消耗大量内存,你需要根据服务器规模限制其用量。创建 /etc/elasticsearch/jvm.options.d/memory.options 文件并打开进行编辑。
$ sudo nano /etc/elasticsearch/jvm.options.d/memory.options
在其中粘贴以下代码,并根据服务器规模修改数值。第一个值表示初始内存,第二个值表示最大可用内存。对于 1GB 及以上,使用 -Xms1g 这样的格式。
-Xms512m
-Xmx784m
按 Ctrl + X 并在提示时输入 Y 保存文件。这将把 Elasticsearch 配置为使用 1GB 内存。你可以根据需求和服务器配置自行调整。
启动并启用该服务。
$ sudo systemctl enable elasticsearch --now
检查 Elasticsearch 是否正常运行。
$ curl http://localhost:9200
你应该能看到类似以下输出。
{
"name" : "magento.example.com",
"cluster_name" : "elasticsearch",
"cluster_uuid" : "saBfw0F_Tam6ayGjXr6pEA",
"version" : {
"number" : "7.17.17",
"build_flavor" : "default",
"build_type" : "rpm",
"build_hash" : "aba4da413a368e296dfc64fb20897334d0340aa1",
"build_date" : "2024-01-18T10:05:03.821431920Z",
"build_snapshot" : false,
"lucene_version" : "8.11.1",
"minimum_wire_compatibility_version" : "6.8.0",
"minimum_index_compatibility_version" : "6.0.0-beta1"
},
"tagline" : "You Know, for Search"
}
步骤 9 - 安装 Redis 服务器
Magento 使用 Redis 进行会话和缓存存储。这一步完全可选,你也可以使用数据库来存储会话,但 Redis 的表现更佳。最新版 Magento 兼容 Redis 7.0。由于 Rocky Linux 自带的是 Redis 6.0,我们将使用 Remi 仓库进行安装。
我们在步骤 2 安装 PHP 时已经安装了 Remi 仓库。列出所有可用的 Redis 模块。
$ dnf module list redis
Name Stream Profiles Summary
redis 7 common [d] Redis persistent key-value database
Remi's Modular repository for Enterprise Linux 9 - x86_64
Name Stream Profiles Summary
redis remi-5.0 common [d] Redis persistent key-value database
redis remi-6.0 common [d] Redis persistent key-value database
redis remi-6.2 common [d] Redis persistent key-value database
redis remi-7.0 common [d] Redis persistent key-value database
redis remi-7.2 common [d] Redis persistent key-value database
Hint: [d]efault, [e]nabled, [x]disabled, [i]nstalled
启用 Redis 7.0。
$ sudo dnf module enable -y redis:remi-7.0
运行以下命令安装 Redis 服务器。
$ sudo dnf install redis
确认 Redis 版本。
$ redis-server -v
Redis server v=7.0.15 sha=00000000:0 malloc=jemalloc-5.2.1 bits=64 build=77c9855172eb54e9
启用并启动 Redis 服务。
$ sudo systemctl enable redis --now
使用以下命令验证服务连接。
$ redis-cli
你将进入 Redis shell。
第一步是为 Redis 默认用户设置密码。将 Your_Redis_Password 替换为你自己设定的强壮密码,并确保密码前加上 > 字符。
127.0.0.1:6379> acl setuser default >Your_Redis_Password
测试 Redis 认证。
127.0.0.1:6379> AUTH Your_Redis_Password
OK
向服务发送 Ping。
127.0.0.1:6379> ping
PONG
输入 exit 退出服务。
步骤 10 - 下载 Magento
为 Magento 创建网站根目录。
$ sudo mkdir /var/www/html/magento -p
将 Magento 目录的权限赋予当前用户。
$ sudo chown $USER:$USER /var/www/html/magento/ -R
在继续之前,你需要获取 Magento 仓库所需的身份验证密钥。访问 https://commercemarketplace.adobe.com/ 网站,点击右上角的 Sign in 链接,你将进入使用 Adobe ID 登录的页面。

点击 “Sign in with Adobe ID” 按钮进入下一页面。

如果你已有 Adobe ID,输入凭据即可继续;也可以在此创建一个账户。创建并登录账户后,打开 https://commercemarketplace.adobe.com/customer/accessKeys/ 这个网址。你也可以访问个人资料页(https://commercemarketplace.adobe.com/customer/account/)并点击 Access Keys 链接来进入该页面。

点击 “Create A New Access Key” 按钮创建你的身份验证密钥,并为密钥取一个便于识别的名称。

记下公钥和私钥,下一步会用到。
创建 ~/.config/composer/auth.json 文件并打开进行编辑。
$ nano ~/.config/composer/auth.json
在其中粘贴以下代码,使用公钥作为用户名、私钥作为密码。
{
"http-basic": {
"repo.magento.com": {
"username": "<public_key>",
"password": "<private_key>"
}
}
}
按 Ctrl + X 并在提示时输入 Y 保存文件。
切换到 /var/www/html/magento 目录。
$ cd /var/www/html/magento
创建 Magento 项目。注意命令末尾的英文句点,它表示命令当前所在的目录。
$ composer create-project --repository-url=https://repo.magento.com/ magento/project-community-edition .
你应该能看到类似的输出。
Creating a "magento/project-community-edition" project at "./"
Installing magento/project-community-edition (2.4.6-p3)
- Downloading magento/project-community-edition (2.4.6-p3)
- Installing magento/project-community-edition (2.4.6-p3): Extracting archive
Created project in /var/www/html/magento/.
Loading composer repositories with package information
Info from https://repo.packagist.org: #StandWithUkraine
Updating dependencies
Lock file operations: 566 installs, 0 updates, 0 removals
- Locking 2tvenom/cborencode (1.0.2)
- Locking adobe-commerce/adobe-ims-metapackage (2.2.0)
- Locking allure-framework/allure-codeception (v2.3.0)
- Locking allure-framework/allure-php-commons (v2.3.1)
- Locking allure-framework/allure-phpunit (v2.1.0)
...............................................
运行以下命令设置文件权限并使 Magento 二进制文件可执行。同时,将 Magento 目录的所有者设为 Nginx 用户,以便其能够访问网站。
$ sudo find var generated vendor pub/static pub/media app/etc -type f -exec chmod g+w {} +
$ sudo find var generated vendor pub/static pub/media app/etc -type d -exec chmod g+ws {} +
$ sudo chown -R :nginx .
$ sudo chmod u+x bin/magento
步骤 11 - 安装 Magento
确保你位于 Magento 目录中。
$ cd /var/www/html/magento
运行以下命令安装 Magento。
$ bin/magento setup:install \
--base-url=http://magento.example.com \
--use-secure=1 \
--base-url-secure=https://magento.example.com \
--use-secure-admin=1 \
--db-host=127.0.0.1 \
--db-name=magento \
--db-user=magentouser \
--db-password=Your_password2 \
--admin-firstname=Navjot \
--admin-lastname=Singh \
[email protected]
\
--admin-user=navjot \
--admin-password=admin_password \
--language=en_US \
--currency=USD \
--timezone=America/Chicago \
--use-rewrites=1 \
--elasticsearch-host=http://127.0.0.1 \
--elasticsearch-port=9200 \
--session-save=redis \
--session-save-redis-db=0 \
--session-save-redis-password=redis_password \
--cache-backend=redis \
--cache-backend-redis-db=2 \
--cache-backend-redis-password=redis_password \
--page-cache=redis \
--page-cache-redis-db=4 \
--page-cache-redis-password=redis_password
流程完成后,你将看到类似的输出。
.......
[SUCCESS]: Magento installation complete.
[SUCCESS]: Magento Admin URI: /admin_l5pv1h
Nothing to import.
记下 Admin URI(后台地址),稍后访问管理面板时会用到。
创建 Magento 定时任务(cron jobs)。
$ php bin/magento cron:install
验证定时任务。
$ crontab -l
你应该能看到类似以下输出。
#~ MAGENTO START f37deed947b2ea951ad6f939b8ab752bc79587e3d77f40d06f20f0657c98e94d
* * * * * /usr/bin/php /var/www/html/magento/bin/magento cron:run 2>&1 | grep -v "Ran jobs by schedule" >> /var/www/html/magento/var/log/magento.cron.log
#~ MAGENTO END f37deed947b2ea951ad6f939b8ab752bc79587e3d77f40d06f20f0657c98e94d
步骤 12 - 配置 PHP-FPM
打开 /etc/php-fpm.d/www.conf 文件。
$ sudo nano /etc/php-fpm.d/www.conf
我们需要将 PHP 进程的 Unix 用户/组设置为 nginx。在文件中找到 user = apache 和 group = apache 这两行,将其改为 nginx。
...
; Unix user/group of processes
; Note: The user is mandatory. If the group is not set, the default user's group
; will be used.
; RPM: apache user chosen to provide access to the same directories as httpd
user = nginx
; RPM: Keep a group allowed to write in log dir.
group = nginx
...
在文件中找到 listen.owner = nobody、listen.group = nobody、listen.mode = 0660 这几行,取消注释后按如下方式修改。
; Set permissions for unix socket, if one is used. In Linux, read/write
; permissions must be set in order to allow connections from a web server.
; Default Values: user and group are set as the running user
; mode is set to 0660
listen.owner = nginx
listen.group = nginx
listen.mode = 0660
按 Ctrl + X 并在提示时输入 Y 保存文件。
将执行时间上限提高到 180 秒。
$ sudo sed -i 's/max_execution_time = 30/max_execution_time = 180/' /etc/php.ini
将 PHP-FPM 的内存限制从 128MB 提高到 512MB。你可以根据服务器规模和需求进一步提高该限制。
$ sudo sed -i 's/memory_limit = 128M/memory_limit = 512M/' /etc/php.ini
Magento 默认将媒体库的文件大小限制设为 2MB。运行以下命令将文件大小限制提高到 25MB。
$ sudo sed -i 's/upload_max_filesize = 2M/upload_max_filesize = 25M/g' /etc/php.ini
$ sudo sed -i 's/post_max_size = 8M/post_max_size = 25M/g' /etc/php.ini
开启 Zlib 压缩。
$ sudo sed -i 's/zlib.output_compression = Off/zlib.output_compression = On/g' /etc/php.ini
按如图所示增大 realpath_cache 配置。
$ sudo sed -i 's/;realpath_cache_size = 4096k/realpath_cache_size = 10M/g' /etc/php.ini
$ sudo sed -i 's/;realpath_cache_ttl = 120/realpath_cache_ttl = 7200/g' /etc/php.ini
打开 /etc/php.d/10-opcache.ini 文件进行编辑。
$ sudo nano /etc/php.d/10-opcache.ini
找到 ;opcache.save_comments=1 这一行,按图示取消注释。
opcache.save_comments=1
按 Ctrl + X 并在提示时输入 Y 保存文件。
重启 PHP-FPM 服务。
$ sudo systemctl restart php-fpm
将 PHP 会话目录的所属组改为 Nginx。
$ sudo chgrp -R nginx /var/lib/php/session
步骤 13 - 配置 SELinux
运行以下命令修改 Magento 目录的安全上下文。
$ sudo semanage fcontext -a -t httpd_sys_rw_content_t '/var/www/html/magento/app/etc(/.*)?'
$ sudo semanage fcontext -a -t httpd_sys_rw_content_t '/var/www/html/magento/var(/.*)?'
$ sudo semanage fcontext -a -t httpd_sys_rw_content_t '/var/www/html/magento/pub/media(/.*)?'
$ sudo semanage fcontext -a -t httpd_sys_rw_content_t '/var/www/html/magento/pub/static(/.*)?'
$ sudo semanage fcontext -a -t httpd_sys_rw_content_t '/var/www/html/magento/generated(/.*)?'
$ sudo restorecon -Rv '/var/www/html/magento/'
应用策略以允许连接到外部主机。
$ sudo setsebool -P httpd_can_network_connect 1
应用策略以允许 Nginx 访问 PostgreSQL。
$ sudo setsebool -P httpd_can_network_connect_db 1
步骤 14 - 配置 Nginx
打开 /etc/nginx/nginx.conf 文件进行编辑。
$ sudo nano /etc/nginx/nginx.conf
在 include /etc/nginx/conf.d/*.conf; 这一行之前添加以下内容。
server_names_hash_bucket_size 64;
按 Ctrl + X 并在提示时输入 Y 保存文件。
创建并打开 /etc/nginx/conf.d/magento.conf 文件进行编辑。
$ sudo nano /etc/nginx/conf.d/magento.conf
在其中粘贴以下代码。
upstream fastcgi_backend {
server unix:/run/php-fpm/www.sock;
}
server {
# Redirect any http requests to https
listen 80;
listen [::]:80;
server_name magento.example.com;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name magento.example.com;
set $MAGE_ROOT /var/www/html/magento;
include /var/www/html/magento/nginx.conf.sample;
client_max_body_size 25m;
access_log /var/log/nginx/magento.access.log;
error_log /var/log/nginx/magento.error.log;
# TLS configuration
ssl_certificate /etc/letsencrypt/live/magento.example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/magento.example.com/privkey.pem;
ssl_trusted_certificate /etc/letsencrypt/live/magento.example.com/chain.pem;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers 'ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384';
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:50m;
ssl_session_timeout 1d;
# OCSP Stapling ---
# fetch OCSP records from URL in ssl_certificate and cache them
ssl_stapling on;
ssl_stapling_verify on;
ssl_dhparam /etc/ssl/certs/dhparam.pem;
}
完成后按 Ctrl + X 并在提示时输入 Y 保存文件。
Magento 自带一个 Nginx 配置模板,位于 /var/www/magento/nginx.conf.sample,我们已经将其引入到配置中。$MAGE_ROOT 变量指向我们已在文件中设置的 Magento 网站根目录,并在示例配置文件中被引用。
验证 Nginx 配置文件语法。
$ sudo nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
重启 Nginx 服务。
$ sudo systemctl restart nginx
通过 https://magento.example.com 打开 Magento 网站,你应该能看到如下页面。

如果 CSS 和 JS 没有加载,请运行以下命令。
$ cd /var/www/html/magento
$ sudo php bin/magento setup:static-content:deploy -f
$ sudo php bin/magento indexer:reindex
步骤 15 - 禁用双因素身份验证
在访问管理面板之前,我们需要先禁用默认开启的双因素身份验证。Magento 在安装过程中会尝试通过 sendmail 发送邮件来启用双因素身份验证,但由于我们尚未配置邮件,要访问后台的唯一办法就是先禁用该功能。
如果你已在服务器上配置好 sendmail 用于发送邮件,可以跳过此步骤。我们需要使用以下命令禁用 Magento 的两个模块来关闭双因素身份验证。
$ sudo php /var/www/html/magento/bin/magento module:disable Magento_AdminAdobeImsTwoFactorAuth
$ sudo php /var/www/html/magento/bin/magento module:disable Magento_TwoFactorAuth
运行以下命令生成相关类。
$ sudo php /var/www/html/magento/bin/magento setup:di:compile
同时清理缓存。
$ sudo php /var/www/html/magento/bin/magento c:c
步骤 16 - 访问管理后台
你必须使用 Magento 安装脚本提供的 URI 打开管理后台。如果你不小心忘记记录或丢失了该 URI,可以通过运行以下命令重新获取。
$ php /var/www/magento/bin/magento info:adminuri
Admin URI: /admin_l5pv1h
在浏览器中打开 https://magento.example.com/admin_l5pv1h,你将看到如下界面。

输入安装时设置的管理员凭据,点击 “Sign in” 按钮继续,随后将进入如下界面。

会弹出一个窗口,请求允许 Adobe 收集使用数据。点击 “Don't Allow” 按钮继续。
下一步是配置用于发送邮件的 SMTP,以便我们之后重新启用双因素身份验证。进入 Stores >> Configuration 菜单。

在左侧展开 Advanced 菜单,点击 Systems 选项打开邮件设置页面。

在 Transport、Host、Port 选项前取消勾选 “Use system value”。点击 Transport 下拉菜单并选择 SMTP。在本教程中,我们使用 Amazon SES 作为邮件发送服务。

在对应字段中输入你的 SMTP 主机、端口 587、用户名和密码,将 Auth 设为 LOGIN,将 SSL 设为 TLS。完成后点击 “Save Config” 按钮。邮件设置配置好后,下一步是配置店铺邮箱 ID,以便我们进行测试。
向上滚动,在同一页面展开 General 菜单,并选择 Store Email Addresses 选项。

取消勾选默认的 Sender Email 字段,输入你店铺的邮箱 ID。完成后点击 “Save Config” 按钮。同样地,打开 Contacts 页面,进行相同修改后点击 “Save Config” 按钮完成设置。

修改管理员选项可能会影响缓存,并会收到警告。运行以下命令手动清理缓存。
$ sudo php /var/www/html/magento/bin/magento c:c
要测试邮件,请访问店铺前台页面并打开 Contact Us 页面。你也可以直接访问 https://magento.example.com/contact/ 进入该页面。发送一条测试消息并点击 Submit 按钮,你应该会收到一封类似的邮件。

步骤 17 - 启用并配置双因素身份验证
既然已经启用了 SMTP 邮件服务,现在可以重新启用双因素身份验证了。运行以下命令启用双因素身份验证。
$ sudo php /var/www/html/magento/bin/magento module:enable Magento_AdminAdobeImsTwoFactorAuth
$ sudo php /var/www/html/magento/bin/magento module:enable Magento_TwoFactorAuth
升级各模块的安装配置。
$ sudo php /var/www/html/magento/bin/magento setup:upgrade
运行以下命令生成相关类。
$ sudo php /var/www/html/magento/bin/magento setup:di:compile
同时清理缓存。
$ sudo php /var/www/html/magento/bin/magento c:c
如果仍无法访问后台区域,也请运行以下命令。
强制部署静态内容。
$ sudo php /var/www/html/magento/bin/magento setup:static-content:Deploy -f
设置文件权限。
$ cd /var/www/html/magento
$ sudo find var generated vendor pub/static pub/media app/etc -type f -exec chmod g+w {} +
$ sudo find var generated vendor pub/static pub/media app/etc -type d -exec chmod g+ws {} +
$ sudo chown -R :nginx .
访问管理后台,你将看到如下界面。

我们将使用 Google Authenticator 方式。如果你有硬件密钥也可以使用。Google Authenticator 方式与任何 TOTP 应用兼容,包括 Authy、1Password、Bitwarden、Microsoft Authenticator 等。点击 “Apply” 按钮继续。

在下一页面,你会看到需要用 2FA 应用扫描的二维码。将信息添加到你的应用,并把生成的验证码复制到 Authenticator code 字段中。点击 “Confirm” 按钮进入管理后台。
总结
至此,我们完成了在 Rocky Linux 9 服务器上借助 Nginx 和 Elasticsearch 安装 Magento 电子商务网站的教程。如果你有任何疑问,欢迎在下方评论区留言。