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

33 阅读15分钟

引言

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

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

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

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 控制台页面。

rabbitmq_login.png

  • 输入账号密码并登录:guest/guest

rabbitmq_home.png

  • 创建帐号并设置其角色为管理员:mall/mall1234

rabbitmq_admin_mall.png

  • 创建一个新的虚拟host为:/mall

rabbitmq_mall_host.png

  • 给mall用户分配权限和/mall虚拟host

rabbitmq_mall_permission.png

点击mall用户进入用户配置页面并给mall用户配置该虚拟host的权限

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: mallPassword1234
    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.png

打包扣好后会在子模块对应的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)开通微服务端口防火墙

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

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

6)云服务器控制台安全组添加微服务端口入站规则

aliyunPorts.png 添加完入站规则后点击右边的保存按钮完成对指定端口的入站放行,下面对几个微服务端口的入站规则笔者已经全部添加好了。

然后我们登录Nacos服务的控制台(默认的登录用户名和密码为:nacos/nacos)

nacosServiceList.png 进入主页后点击左边菜单栏中的【服务管理】-> 【服务列表】就可以看到注册上来的三个微服务:mall-authmall-portalmall-gateway

部署前端mall-app-web项目

使用HBuilder X 打开 mall-app-web项目

1)修改appConfig.js 文件中的API_BASE_URL常量

export const API_BASE_URL = 'http://47.113.205.244:8201'; //修改为 mall-gateway 网关服务对应的IP地址

2)打包H5项目

h5_publish.png 网站域名栏可填写自己注册备案的域名,本人的服务器暂时未备案就暂时使用h5命名,然后点击【发行按钮】完成项目打包,打包完成后控制台会提示编译后的index.html文件和static静态文件为于项目根目录的unpackage/dist/build/h5目录下。

3)压缩包上传到云服务器并拷贝到Nginx服务的docker容器中

我们将h5目录打成一个h5.zip包压缩文件到云服务器

h5Zip.png 笔者使用免费开源的FinalShell这款云服务器连接客户端工具连接的阿里云服务器,切换到指定目录后,点击右侧上传附件的图标按钮,打开对话框后选中打包好的h5.zip压缩文件上传到/mydata/nginx/html目录,并执行unzip h5.zip命令解压h5.zip压缩包。

4)修改从docker容器nginx-test镜像服务系统空间拷贝到宿主机/mydata/nginx目录下的配置文件

# 切换到conf.d目录下
cd /mydata/nginx/nginx/conf.d
# 修改default.conf
vim default.conf
server {
    listen       80;
    listen  [::]:80;
    server_name  localhost;

    #access_log  /var/log/nginx/host.access.log  main;

    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
    }
   // ......省略其他
}

按住i键后将 server 对象中的server_name 改为localhost, 然后按住 Esc键后再输入 ':' ,再输入 'wq' 回车保存修改

然后执行如下命令将修改后的default.conf配置文件拷贝到nginx-test 镜像服务空间的conf.d目录

docker container cp default.conf nginx-test:/etc/nginx/conf.d

然后再执行重新加载配置文件命令

docker exec -it nginx-test nginx -s reload

5)将解压后的的h5目录中的文件拷贝到nginx-test 镜像服务空间的html目录

# 切换到宿主机html目录
cd /mydata/nginx/nginx/html
# 拷贝index.html文件到nginx-test镜像服务空间
docker container cp index.html nginx-test:/usr/share/nginx/html
# 拷贝static目录到nginx-test镜像服务空间
docker container cp static nginx-test:/usr/share/nginx/html

docker_copy.png

6)重启nginx-test镜像服务

docker restart nginx-test

站点效果

部署完成后,我们就可以在浏览器中输入站点网址 http://47.113.205.244回车后进入系统首页

mall_home_page.png 此时是以游客角色进入系统首页,点击任何一个链接后页面会弹框提示我们去登录

login_tip.png 点击【重新登录】按钮进入登录界面

login_form.png

输入用户名zhengsan和登录密码123456 点击登录按钮登录成功后再次进入首页

user_home_page.png

这次是以普通用户角色进入系统首页,点击下面的【小米官方旗舰店】则可跳转到【品牌详情】页

brand_detail.png

点击其中一个商品【小米 红米5A】则可进入购物页面

点击右边的【加入购物车按钮】后,然后点击【购物车】按钮进入购物车页面

shoping_car.png 继续点击【去结算】则进入【创建订单】页面

create_order.png 后面的流程笔者就不继续演示了,大家把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.png

原创不易,能看到这里的老铁真的是铁粉无疑了!非常需要你们的点赞、在看和转发一套三连来鼓励笔者写出更多更好的优质文章,谢谢!

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