在云主机部署高可用电商平台
在云主机部署高可用电商平台
1 概述
1.1 背景介绍
电商平台是一种在线交易平台,它允许商家和消费者通过互联网进行商品或服务的买卖。电商平台提供了一个集中的市场,使卖家能够展示和销售他们的产品,同时也为买家提供了一个方便、快捷、安全的购物环境。华为云开发者空间是华为云为初级开发者打造的入门级开发技能训练平台,旨在培养开发者通过使用云主机提升开发者个人能力和技能。
1.2 适用对象
- 企业
- 个人开发者
- 高校学生
1.3 案例时间
本案例总时长预计120分钟。
1.4 案例流程
{{{width="40%" height="auto"}}}
说明:
①下载电商代码到云主机(前端和后端);
②在云主机上配置基础环境,安装MySQL和Redis;
③配置JAVA环境,编译安装电商程序;
④安装和配置HaProxy实现高可用;
⑤验证电商的高可用特性。
1.5 资源总览
本次案例预计花费总计0.0元。
| 云资源 | 消耗费用 | 时长 |
|---|---|---|
| 云主机 2H4G 硬盘40G | 免费 | 120分 |
2 基础环境配置
2.1 安装配置MySQL
MySQL是一款高性能关系数据库,电商平台使用MySQL做数据持久化存储。
- 安装MySQL、启动并查看服务状态。
sudo apt update
sudo apt install -y mysql-server
sudo systemctl start mysql
sudo systemctl status mysql

确认Active为running状态,即可按q退出查看页面。
- 登录mysql
sudo mysql -uroot
- 登录成功后,执行如下命令,修改默认的MySQL密码
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password;
alter user root@localhost identified with mysql_native_password by '1qaz2wsx';
说明:其中 1qaz2wsx 为配置的数据库密码,后面登录的时候需要使用。

- 退出MySQL
命令行中输入quit,退出MySQL客户端。
quit
- 重新登录数据库,设置数据库访问权限
sudo mysql -h 127.0.0.1 -uroot -p
输入命令后回车,然后输入自己设置的密码,回车后登录成功。
登录成功完成MySQL安装。
- 退出MySQL
命令行中输入quit,退出MySQL客户端。
quit
2.2 安装Redis
Redis是一款高性能缓存组件,在Discuz论坛中提供数据缓存能力,提升论坛的响应速度,优化用户体验。
进入云主机后,在桌面鼠标右击,在菜单中点击 “在终端中打开”(不同的桌面版本可能打开方式不一样),打开命令行工具。

- 在命令行中输入命令安装redis。
sudo apt-get -y install redis-server
- 输入命令确认redis已经安装并且服务正在运行。
sudo systemctl status redis-server

确认Active为running状态,然后按q退出即可。
2.3 安装Nginx
- 登陆云主机
sudo apt update
sudo apt install -y nginx
- 修改nginx配置文件
备份原始文件。
sudo mv /etc/nginx/nginx.conf /etc/nginx/nginx.conf.bak
编辑新的配置文件。
sudo vim /etc/nginx/nginx.conf
文件内容如下:(按i开启编辑模式,文件内容复制到文件中后,按 :wq 保存并退出)
注意:以下文档内容需要根据实际情况修改。
user www-data;
worker_processes auto;
pid /run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf;
events {
worker_connections 768;
# multi_accept on;
}
http {
upstream backend {
server 127.0.0.1:8090;
}
sendfile on;
tcp_nopush on;
types_hash_max_size 2048;
# server_tokens off;
include /etc/nginx/mime.types;
default_type application/octet-stream;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3; # Dropping SSLv3, ref: POODLE
ssl_prefer_server_ciphers on;
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
include /etc/nginx/conf.d/*.conf;
server {
listen 8080;
server_name 127.0.0.1;
location / {
root /var/www/html;
index index.html;
break;
}
location /api {
proxy_pass http://backend;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
break;
}
}
server {
listen 8081;
server_name 127.0.0.1;
location / {
root /var/www/html-8081;
index index.html;
break;
}
location /api {
proxy_pass http://backend;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
break;
}
}
}
- 重启服务
sudo systemctl reload nginx
2.4 安装Java环境
- 卸载自带jdk17
执行下面命令:
sudo apt-get update
sudo apt purge -y openjdk-17-jdk openjdk-17-jdk-headless openjdk-17-jre openjdk-17-jre-headless
- 安装jdk8
sudo apt-get install -y openjdk-8-jdk
- 安装完成验证
java -version
如下图所示:

3 安装电商程序
3.1 前端程序安装
-
登陆云主机,下载前端代码
打开终端命令行
cd
mkdir web
cd web/
git clone https://gitcode.com/CaseDeveloper/E-Commerce-Web.git
cd E-Commerce-Web
- node安装
# 安装 nvm (Node 版本管理器) -网络原因,此处可能需要多尝试几次
curl -o- https://gitee.com/RubyMetric/nvm-cn/raw/main/install.sh | bash
# 下载并安装 Node.js(如执行失败,需要重启终端或者打开第二个终端)
nvm install 22
# 验证环境中是否存在正确的 Node.js 版本
node -v # 应该打印 `v22.12.0`
# 验证环境中是否存在正确的 npm 版本
npm -v # 应该打印 `10.9.0`
- 前端代码编译
cd /home/developer/web/E-Commerce-Web/
npm install
npm run build
编译成功后会生成结果文件,如下图:

- 部署前端程序
sudo rm -f /var/www/html/*.html
cd dist
sudo cp -a * /var/www/html/
sudo mkdir -p /var/www/html-8081
sudo cp -a * /var/www/html-8081/
- 重启nginx服务
sudo systemctl reload nginx
验证端口,8080,8081端口正常运行。
sudo netstat -tlnp

3.2 后端程序部署
- 登陆个人云主机
https://developer.huaweicloud.com/space/devportal/desktop
打开链接后,进入个人云主机页面。

- 拉取后端程序代码修改参数配置
打开CodeArts IDE for Java。


参数如下:
URL:https://gitcode.com/CaseDeveloper/E-Commerce-Java.git
Directory: /home/developer/demo/E-Commerce-Java

修改配置文件。

配置文件具体修改为:
| 参数名 | 例子 |
|---|---|
| spring.datasource.url | jdbc:mysql://localhost:3306/e_demo_project?useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC |
| spring.datasource.username | root |
| spring.datasource.password | 1qaz2wsx |
| spring.redis.host | 127.0.0.1 |
| server.port | 8090 |
- 编译程序

然后在IDE的终端中执行命令。
左侧选择 maven->Lifecycle->install 后双击执行

执行结果如下:

出现BUILD SUCCESS 说明编译成功。
- 执行SQL脚本
打开云主机命令行终端

终端中输入登陆mysql命令
mysql -uroot -p
回车后输入密码:1qaz2wsx(2.1中自定义密码)

登陆成功。

执行如下命令:
CREATE DATABASE e_demo_project;
use e_demo_project;
source /home/developer/demo/E-Commerce-Java/db_init_test.sql;
show tables;
生成表如下:

数据初始化完成。
输入quit命令,退出MySQL命令行
quit
执行脚本结束。
- 后端程序启动
服务器上执行如下命令:
cp /home/developer/demo/E-Commerce-Java/target/E-Commerce-Java-1.0-SNAPSHOT.jar /home/developer/demo/
cd /home/developer/demo/
nohup java -jar E-Commerce-Java-1.0-SNAPSHOT.jar > output.log 2>&1 &
后端程序完成启动。
- 环境验证
检查端口:
sudo netstat -tlnp \|grep 8090
确认8090端口已启动。
4 高可用配置
4.1 HaProxy安装
HAProxy是一款具备高并发、高性能的TCP和HTTP负载均衡器。它能够支持万级以上的并发连接,适用于各种规模的网站和应用程序。HAProxy的主要功能包括负载均衡、会话保持、自动故障切换以及基于正则表达式的路由决策等。
- 执行安装命令:
sudo apt-get -y install haproxy
- 配置文件备份:
sudo mv /etc/haproxy/haproxy.cfg /etc/haproxy/haproxy.cfg1
- 创建新的配置文件
sudo vim /etc/haproxy/haproxy.cfg
配置文件内容如下,复制内容到上面的文件中。
global
log /dev/log local0
log /dev/log local1 notice
chroot /var/lib/haproxy
stats socket /run/haproxy/admin.sock mode 660 level admin expose-fd listeners
stats timeout 30s
user haproxy
group haproxy
daemon
# Default SSL material locations
ca-base /etc/ssl/certs
crt-base /etc/ssl/private
# See: https://ssl-config.mozilla.org/#server=haproxy&server-version=2.0.3&config=intermediate
ssl-default-bind-ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384
ssl-default-bind-ciphersuites TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256
ssl-default-bind-options ssl-min-ver TLSv1.2 no-tls-tickets
defaults
log global
mode http
option httplog
option dontlognull
timeout connect 5000
timeout client 50000
timeout server 50000
errorfile 400 /etc/haproxy/errors/400.http
errorfile 403 /etc/haproxy/errors/403.http
errorfile 408 /etc/haproxy/errors/408.http
errorfile 500 /etc/haproxy/errors/500.http
errorfile 502 /etc/haproxy/errors/502.http
errorfile 503 /etc/haproxy/errors/503.http
errorfile 504 /etc/haproxy/errors/504.http
balance source
frontend http-in
bind *:80
default_backend servers
backend servers
mode http
option redispatch
option abortonclose
balance source
option httpchk GET /index.html
server server1 127.0.0.1:8080 weight 6 check inter 2000 rise 2 fall 3
server server2 127.0.0.1:8081 weight 6 check inter 2000 rise 2 fall 3
复制完成后按 Esc ,输入 :wq 保存退出

- 启动haproxy
sudo systemctl restart haproxy
- 检查服务启动状态
sudo systemctl status haproxy
服务运行正常,确定服务为running状态,按q键退出查看。

- 验证访问,浏览器中输入访问地址
http://127.0.0.1/
访问结果如下:

4.2 验证高可用特性
要验证服务的高可用性,需要分2步走:
- 验证后端单独8080端口的可用性,此时8081端口关闭
- 验证后端单独8081端口的可用性,此时8080端口关闭
4.2.1 关闭8081端口,验证8080端口可用性
- 停止8081端口,在终端中执行下面命令
备份conf文件
sudo mv /etc/nginx/nginx.conf /etc/nginx/nginx.conf.8080
复制下面代码内容到配置文件
sudo vim /etc/nginx/nginx.conf
按i开启编辑模式,复制下面内容到终端,然后按Esc键退出编辑模式,按 :wq 退出并保存
user www-data;
worker_processes auto;
pid /run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf;
events {
worker_connections 768;
# multi_accept on;
}
http {
upstream backend {
server 127.0.0.1:8090;
}
sendfile on;
tcp_nopush on;
types_hash_max_size 2048;
# server_tokens off;
include /etc/nginx/mime.types;
default_type application/octet-stream;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3; # Dropping SSLv3, ref: POODLE
ssl_prefer_server_ciphers on;
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
include /etc/nginx/conf.d/*.conf;
server {
listen 8080;
server_name 127.0.0.1;
location / {
root /var/www/html;
index index.html;
break;
}
location /api {
proxy_pass http://backend;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
break;
}
}
}
修改完成后,按Esc 退出编辑模式,再按 :wq 保存 退出。
重启nginx服务
sudo systemctl reload nginx
- 访问80端口,效果如下:
浏览器打开下面地址
http://127.0.0.1

以上情况说明在8080,集群可以正常访问。
4.2.2 关闭8080端口监听,启用8081端口
- 停止8080端口,在终端中执行下面命令
备份conf文件
sudo mv /etc/nginx/nginx.conf /etc/nginx/nginx.conf.8081
复制下面代码内容到配置文件
sudo vim /etc/nginx/nginx.conf
按i开启编辑模式,复制下面内容到终端,然后按Esc键退出编辑模式,按 :wq 退出并保存。
user www-data;
worker_processes auto;
pid /run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf;
events {
worker_connections 768;
# multi_accept on;
}
http {
upstream backend {
server 127.0.0.1:8090;
}
sendfile on;
tcp_nopush on;
types_hash_max_size 2048;
# server_tokens off;
include /etc/nginx/mime.types;
default_type application/octet-stream;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3; # Dropping SSLv3, ref: POODLE
ssl_prefer_server_ciphers on;
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
include /etc/nginx/conf.d/*.conf;
server {
listen 8081;
server_name 127.0.0.1;
location / {
root /var/www/html-8081;
index index.html;
break;
}
location /api {
proxy_pass http://backend;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
break;
}
}
}
修改完成后,按Esc 退出编辑模式,再按 :wq 保存 退出。
重启nginx服务。
sudo systemctl reload nginx
- 访问80端口,效果如下:
浏览器打开下面地址
http://127.0.0.1

以上情况说明在端口8081,集群可以正常访问。
案例验证完成。
更多推荐

所有评论(0)