云服务器Linux环境部署mall电商项目完整实践教程

引言

在笔者之前的文章微服务版mall电商项目本地开发环境启动前后端服务详细指导教程中笔者详细介绍了如何在开发者的本地环境把开源mall-swarm电商项目跑起来。但是最终我们的项目都是要部署到云服务器上去成为一个用户可访问的站点才有价值,包括后面的支付环节都是需要我们部署到云服务上才能申请到支付宝支付和微信支付的商户号才能打通的。

笔者在尝试将mall电商项目部署到个人的腾讯云和阿里云服务上时踩了不少坑,这篇文章相信可以帮助大家在部署微服务项目的时候少踩很多坑。由于部署mall-swarm微服务项目需要安装不少中间件以及不少于3个微服务,因此一台1核2G的云服务器根本跑不起来,因此需要不少于2台云服务器,至少有一台2核4G配置的云服务器,当然如果能租一台2核8G的云服务器一台也够了。

本文6800余字,大约需要花费您15分钟时间才能阅读完,所以建议先收藏,等晚上下了班时间充足了再进行精读,阅读完必定让您收获成为一名具备独立承接项目所必可少运维技能!

JDK8 安装

Linux 系统环境下安装JDK8非常简单,为了节约文章篇幅,笔者给大家找了一篇写得非常具有实操性且图文并茂的文章给大家参考实践。Linux环境安装JDK8

Docker 环境安装

因为我们在云服务器Linux环境下部署mall-swarm微服务项目时大部分中间件服务都是基于docker安装的,所以需要在自己的云服器上先安装docker环境。
1)安装yum-utils

yum install -y yum-utils device-mapper-persistent-data lvm2

2)为yum源添加docker仓库

yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

3)安装docker

yum install docker-ce

4)启动docker

systemctl start docker

MySQL安装

数据库建议不使用docker安装,原因有以下两点:

数据安全问题:不要将数据储存在容器中,这也是 Docker 官方容器使用技巧中的一条。容器随时可以停止、或者删除。当容器被rm掉,容器里的数据将会丢失。为了避免数据丢失,用户可以使用数据卷挂载来存储数据。但是容器的 Volumes 设计是围绕 Union FS 镜像层提供持久存储,数据安全缺乏保证。如果容器突然崩溃,数据库未正常关闭,可能会损坏数据。另外,容器里共享数据卷组,对物理机硬件损伤也比较大。

性能问题:大家都知道,MySQL 属于关系型数据库,对IO要求较高。当一台物理机跑多个时,IO就会累加,导致IO瓶颈,大大降低 MySQL 的读写性能。

rpm 包安装 Mysql5.7

笔者之前在自己的腾讯云服务器上使用rpm包安装过mysql服务,并写了一篇文章记录自己当时安装过程踩过的坑,大家可以参考这篇文章在自己的云服务器上安装mysql5.7

Linux系统云服务器上安装Mysql5.7数据库,解决不能远程访问的bug

1)安装完成之后使用MySQL命令打开客户端:

mysql -uroot -proot --default-character-set=utf8

2)创建mall数据库及mallSwarm用户:

-- 创建mall数据库
create database mall character set utf8;
-- 创建mallSwarm用户和登录密码
create user mallSwarm
    identified by 'mallPassword12345'
    with max_connections_per_hour 500 max_updates_per_hour 100 max_user_connections 500 max_queries_per_hour 200;
-- 授权mallSwarm用户操作mall数据库的权限
GRANT CREATE,DROP,ALTER,INSERT,UPDATE,SELECT,DELETE on mall.* to 'mallSwarm'@'%' with grant OPTION;
FLUSH PRIVILEGES;

3)在sql编辑器窗口中执行项目中document/sql/mall.sql中的全部sql脚本。

Redis 安装

# 拉取redis镜像
docker pull redis:latest
# 运行redis
docker run -it --name redis -p 6379:6379 -d redis:latest

进入Redis容器使用redis-cli命令进行连接

docker exec -it redis redis-cli

redis_docker

RabbitMQ 安装

1)下载rabbitmq3.12-management的docker镜像

docker pull rabbitmq:3.12-management

2)docker 启动 RabbitMQ 服务

docker run -p 5672:5672 -p 15672:15672 --name rabbitmq \
-v /mydata/rabbitmq/data:/var/lib/rabbitmq \
-d rabbitmq:3.12-management

3)开通 RabbitMQ 服务端口防火墙

# rabbitmq 客户端访问rabbitmq 服务端口号
firewall-cmd --zone=public --add-port=5672/tcp --permanent
# rabbitmq 客户端访问rabbitmq 管理后台服务端口号
firewall-cmd --zone=public --add-port=15672/tcp --permanent
# 使开通的防火墙生效
firewall-cmd --reload

开通rabbitmq 服务端口的防火墙之后还需要登录往云服务控制台中的安全组入站规则添加对 5672和15672端口的放行,否则无法通过浏览器访问rabbitmq 控制台页面。

  • 访问地址查看是否安装成功:http://47.120.47.250:15672/

rabbitmq_login

  • 输入账号密码并登录:guest/guest
    rabbitmq_home
  • 创建帐号并设置其角色为管理员:mall/mall1234
    rabbitmq_admin_mall
  • 给mall用户分配权限和/mall虚拟host
    rabbitmq_mall_permission
  • 点击mall用户进入用户配置页面并给mall用户配置该虚拟host的权限
    rabbitmq_hosts

ElasticSearch 与 Kibana 安装

ES 与 Kibana的安装请参考笔者之前写过的文章 Docker 安装7.12.1版本ElasticSearch、Kibana及中文分词器

MongoDB安装

MongoDB 的安装请参考笔者之前写过的文章文档型数据库MongoDB的安装与入门操作

Nacos 安装

Nacos的安装笔者没有使用docker安装,而是通过上传nacos-server-2.1.0.tar.gz压缩包到云服务器上的/usr/local目录,然后执行以下命令完成解压和安装

# 解压
tar -zxvf nacos-server-2.1.0.tar.gz
# 进入bin目录
cd ./nacos/bin
# 以单机模式启动nacos服务
sh startup.sh -m standalone
# 启动nacos 成功后执行命令查看启动日志
cat /usr/local/nacos/logs/start.out

控制台出现 nacos 启动成功的日志

   ,--.
       ,--.'|
   ,--,:  : |                                           Nacos 2.1.0
,`--.'`|  ' :                       ,---.               Running in stand alone mode, All function modules
|   :  :  | |                      '   ,'\   .--.--.    Port: 8848
:   |   \ | :  ,--.--.     ,---.  /   /   | /  /    '   Pid: 1208727
|   : '  '; | /       \   /     \.   ; ,. :|  :  /`./   Console: http://172.29.68.237:8848/nacos/index.html
'   ' ;.    ;.--.  .-. | /    / ''   | |: :|  :  ;_
|   | | \   | \__\/: . ..    ' / '   | .; : \  \    `.      https://nacos.io
'   : |  ; .' ," .--.; |'   ; :__|   :    |  `----.   \
|   | '`--'  /  /  ,.  |'   | '.'|\   \  /  /  /`--'  /
'   : |     ;  :   .'   \   :    : `----'  '--'.     /
;   |.'     |  ,     .-./\   \  /            `--'---'
'---'        `--`---'     `----'

2024-03-05 23:55:14,468 INFO Bean 'org.springframework.security.access.expression.method.DefaultMethodSecurityExpressionHandler@285f09de' of type [org.springframework.security.access.expression.method.DefaultMethodSecurityExpressionHandler] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)

2024-03-05 23:55:14,473 INFO Bean 'methodSecurityMetadataSource' of type [org.springframework.security.access.method.DelegatingMethodSecurityMetadataSource] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)

2024-03-05 23:55:14,901 INFO Tomcat initialized with port(s): 8848 (http)

2024-03-05 23:55:15,345 INFO Root WebApplicationContext: initialization completed in 4955 ms

2024-03-05 23:55:20,923 INFO Initializing ExecutorService 'applicationTaskExecutor'

2024-03-05 23:55:21,074 INFO Adding welcome page: class path resource [static/index.html]

2024-03-05 23:55:21,427 INFO Creating filter chain: Ant [pattern='/**'], []

2024-03-05 23:55:21,630 INFO Initializing ExecutorService 'taskScheduler'

2024-03-05 23:55:21,660 INFO Exposing 2 endpoint(s) beneath base path '/actuator'

2024-03-05 23:55:21,832 INFO Tomcat started on port(s): 8848 (http) with context path '/nacos'

2024-03-05 23:55:21,836 INFO Nacos started successfully in stand alone mode. use embedded storage

开通 nacos 8848 和 9848 端口防火墙,前者用于客户端与nacos服务端http 协议通信和 grpc 通信协议端口

# nacos 客户端访问nacos 服务端http协议端口号
firewall-cmd --zone=public --add-port=8848/tcp --permanent
# nacos 客户端访问nacos 服务端 grpc 协议端口号
firewall-cmd --zone=public --add-port=9848/tcp --permanent
# 使开通的防火墙生效
firewall-cmd --reload

最后,记得登录往云服务控制台中的安全组入站规则添加对 8848 和9848端口的放行

安装 Nginx 服务

Nginx是一个轻量级的Web服务器,后面我们要部署Vue项目打包后的zip包这就需要用到Nginx服务。这里我们也选择使用docker容器来安装 Nginx 服务, 因为无论是使用tar.gz包安装需要经过编译安装,这个过程非常容易出错,笔者一开始选择了使用tar.gz包安装,但却在安装过程中出现各种报错。于是索性使用Docker容器安装,没想到非常顺利就把Nginx安装好了。

执行如下命令安装并启动Nginx

# 拉取Nginx 镜像
docker pull nginx
#运行
docker run --name nginx-test -p 80:80 -d nginx

启动Nginx成功后执行如下命令进入docker使用沙箱隔离机制给Nginx分配的系统空间

docker exec -it nginx-test /bin/bash

进入Nginx的隔离系统后,执行ls命令可看到Docker容器给Nginx服务分配的系统根目录

[root@iZf8zdh51orpja1xwy1mutZ bin]# docker exec -it nginx-test /bin/bash
root@4b0c1dff5fe8:/# ls
bin   dev                  docker-entrypoint.sh  home  lib32  libx32  mnt  proc  run   srv  tmp  var
boot  docker-entrypoint.d  etc                   lib   lib64  media   opt  root  sbin  sys  usr
root@4b0c1dff5fe8:/#

docker 安装的 Nginx 服务的 几个重要文件分别在隔离系统中的以下几个目录:

  • nginx配置文件位置:/etc/nginx/nginx.conf, 其中nginx.conf文件中引入了/etc/nginx/conf.d/default.conf配置文件;
  • html目录位置:/usr/share/nginx/html;
  • 访问与错误日志位置:/var/log/nginx/access.log/var/log/nginx/error.log
  • nginx.pid文件位置: /run/nginx.pid,用于存放nginx服务的进程id

docker沙箱系统中我们不好修改 nginx 的配置文件,我们可以docker container cp命令将nginx的配置文件目录拷贝到宿主机中的/mydata/nginx 目录下:

docker container cp nginx-test:/etc/nginx /mydata/nginx/

反之,我们也可以使用docker container cp 将宿主机中的文件拷贝到docker容器中,然后通过执行docker restart nginx-test 命令重启nginx服务。

部署后端SpringCloud微服务jar包

这里我们为了方便演示并考虑服务器能承受的最大运行内存,我们目前只启动3个微服务,分别是mall-gatewaymall-authmall-portal 3 个微服务。

1)修改mall-gatewaymall-auth 两个子模块中的bootstrap-prod.yml 配置文件

spring:
  cloud:
    nacos:
      discovery:
        server-addr: 47.113.205.244:8848 #注意使用服务器ip地址不需要加http协议
      #        server-addr: http://nacos-registry:8848
      config:
#        server-addr: http://nacos-registry:8848
        file-extension: yaml
        server-addr: 47.113.205.244:8848
logging:
  file:
    path: ./logs
  level:
    root: info
    sql: debug
    web: info

主要修改了nacos的地址,改为云服务上部署的nacos服务地址,并加上了日志文件位置和日志级别配置。

2)修改mall-portal子模块中的``bootstrap-prod.yml 配置文件

spring:
  cloud:
    nacos:
      discovery:
        server-addr: 47.113.205.244:8848
      config:
        server-addr: 47.113.205.244:8848
        file-extension: yaml
  datasource:
    url: jdbc:mysql://134.175.187.61:3306/mall?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai&useSSL=false&allowPublicKeyRetrieval=true
    username: mallSwarm
    password: mallPassword12345
    druid:
      initial-size: 5 #连接池初始化大小
      min-idle: 10 #最小空闲连接数
      max-active: 20 #最大连接数
      web-stat-filter:
        exclusions: "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*" #不统计这些请求数据
      stat-view-servlet: #访问监控网页的登录用户名和密码
        login-username: druid
        login-password: druid
  rabbitmq:
    host: 47.120.47.250
    port: 5672
    username: guest
    password: guest
  redis:
    host: localhost # Redis服务器地址
    database: 0 # Redis数据库索引(默认为0)
    port: 6379 # Redis服务器连接端口
    password:  # Redis服务器连接密码(默认为空)
    timeout: 3000ms # 连接超时时间(毫秒)
logging:
  file:
    path: ./logs
  level:
    root: info
    sql: debug
    web: info

主要修改了客户端连接nacosmysqlrabbitmq 三个服务的连接地址,并加上了日志文件和日志级别配置项。

3)打包上传到服务器

在IDEA中对三个子模块的Lifecycle生命周期函数,选中跳过测试模式开关按钮,依次执行 cleanpackage
mvnPackage
打包扣好后会在子模块对应的target目录下出现对应的<name>-1.0-SNAPSHOT.jar,将打包好的mall-gateway-1.0-SNAPSHOT.jarmall-auth-1.0-SNAPSHOT.jarmall-portal-1.0-SNAPSHOT.jar依次上传到2核4G配置的阿里云服务器上新建的/usr/local/mall/gateway/usr/local/mall/auth/usr/local/mall/portal目录下,并分别在各个子目录中新建logs目录。

4)运行启动微服务jar包脚本

执行如下命令启动三个微服务(因为笔者最熟悉的部署方式就是这种上传jar包后执行shell脚本完成部署,因此暂时没用docker部署,未来会切换成docker容器部署微服务)

# cd切换到gateway目录
cd /usr/local/mall/gateway
# 启动mall-gateway网关微服务
nohup java -jar -Dspring.profiles.active=prod -Dserver.port=8201  ./mall-gateway-1.0-SNAPSHOT.jar>./logs/app.log 2>&1 &
# cd切换到auth目录
cd ../auth
# 启动mall-auth 认证微服务
nohup java -jar -Dspring.profiles.active=prod -Dserver.port=8401  ./mall-auth-1.0-SNAPSHOT.jar>./logs/app.log 2>&1 &
# cd切换到portal目录
cd ../portal
# 启动mall-portal电商客户侧应用微服务
nohup java -jar -Dspring.profiles.active=prod -Dserver.port=8085 ./mall-portal-1.0-SNAPSHOT.jar>./logs/app.log 2>&1 &

启动成功后控制会打印出启动成功的微服务线程ID。

5)开通微服务端口防火墙

# 开通 mall-gateway服务端口防火墙
firewall-cmd --zone=public --add-port=8201/tcp --permanent
# 开通 mall-auth服务端口防火墙
firewall-cmd --zone=public --add-port=8401/tcp --permanent
# 开通 mall-portal服务端口防火墙
firewall-cmd --zone=public --add-port=8085/tcp --permanent
# 使开通的防火墙生效
firewall-cmd --reload

6)云服务器控制台安全组添加微服务端口入站规则
aliyunPorts
添加完入站规则后点击右边的保存按钮完成对指定端口的入站放行,下面对几个微服务端口的入站规则笔者已经全部添加好了。

然后我们登录Nacos服务的控制台(默认的登录用户名和密码为:nacos/nacos)
nacosServiceList
进入主页后点击左边菜单栏中的【服务管理】-> 【服务列表】就可以看到注册上来的三个微服务:mall-authmall-portal mall-gateway

站点效果

部署完成后,我们就可以在浏览器中输入站点网址 http://47.113.205.244回车后进入系统首页
mall_home_page
此时是以游客角色进入系统首页,点击任何一个链接后页面会弹框提示我们去登录
login_tip
点击【重新登录】按钮进入登录界面
login_form
输入用户名zhengsan和登录密码123456 点击登录按钮登录成功后再次进入首页
user_home_page
这次是以普通用户角色进入系统首页,点击下面的【小米官方旗舰店】则可跳转到【品牌详情】页
brand_detail
点击其中一个商品【小米 红米5A】则可进入购物页面
xiaomi_shoping
点击右边的【加入购物车按钮】后,然后点击【购物车】按钮进入购物车页面
shoping_car
继续点击【去结算】则进入【创建订单】页面
create_order
后面的流程笔者就不继续演示了,大家把mall项目部署到自己的云服务器上后就可以自行操作熟悉各种场景了。

结语

本文主要介绍了如何在付服务器Linux系统环境下搭建部署mall电商项目所需要的基础设施以及中间件服务,包括JDK8DockerMysqlRabbitMqRedisMongoDBElasticSearchNacosNginx等,大部分基础设施服务采用了Docker容器安装,简单高效。并以jar包的形式部署了mall电商项目中的三个微服务项目,分别是:mall-gateway网关项目、mall-auth鉴权项目以及商城门户项目mall-portal,同时使用NginxDocker镜像服务服务部署了使用HBuilderX打包好的mall-web-app项目。前端访问后端接口统一走mall-gateway网关,本文的部署实践部分也附带了很多操作过程中的截图。

最后我们通过浏览器访问的方式体验了部署到阿里云服务器上的mall电商项目的网站效果,希望大家通过本文都能掌握具备独立开发项目的运维知识和技术。整个部署过程中,笔者也踩了不少坑,下一篇文章笔者会详细列举自己在部署过程中踩过的坑以及它们对应的解决方案。

阿里云服务器推荐

大家也看到了要部署整个mall电商项目的前后端服务,需要安装8个基础设施及中间件服务,5个后台微服务(mall-gatewaymall-authmall-portalmall-adminmall-monitor)以及两个前端服务(mall-app-webmall-admin-web)等多达15个服务,占用的运行内存不可谓不高,所以需要至少两台云服务器才能支撑整个项目的稳定运行。如果要部署自己的mall电商项目独立站点,那就少不了要购买云服务器。

部署好mall这样一个多模块微服务项目少购买一两台云服务器,笔者的这个mall项目的多数jar包就部署在了一台2核4G配置的阿里云服务器上。亲身体验过,不仅好用,而且价格非常实惠。

新人购买一台2核4G配置的阿里云服务器3个月只需要60多块钱,而购买一台2核2G配置的ECS云服务器一年只需要99元,非常划算。感兴趣的老铁们可以复制下面的链接到浏览器中进入【阿里云小站】购买一台属于自己的云服务器,不仅有助于提高我们独立开发网站的能力,而且有一天说不定还能还能依靠自己的网站变现给自己带来一份不菲的副业收入,小伙伴们有想法就赶紧去行动吧!点击下面的【阿里云小站】链接就可以去选购自己想要的阿里云服务器了。
阿里云小站
下面是阿里云服务器产品预览图
aliyun_servers
原创不易,能看到这里的老铁真的是铁粉无疑了!作者需要你们的点赞、在看和转发一套三连来鼓励他写出更多更好的优质文章,谢谢!

关注微信公众号【阿福谈Web编程】,并在公众号后台发送关键字【mall项目源码】即可获得mall前后端项目的源码git仓库地址链接。

  • 24
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

heshengfu1211

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值