Linux 单节点环境部署(gpmall 商城示例)

引言:前段时间完成了一次 Linux 单节点应用部署实验,过程中踩了不少坑。本文把当时的操作过程重新整理成一份可复现的教程,重点补上环境说明、命令解释和验证环节。

目标

  1. 了解应用系统需要哪些基础服务;
  2. 完成这些基础服务的安装与启动;
  3. 部署 gpmall 前后端并访问验证。

1. 环境说明

动手之前先把环境交代清楚。

  • 操作系统:CentOS 7
  • 主机名:mall
  • 虚拟机 IP:以实际为准(后文 Elasticsearch 配置需替换)
  • YUM 源:本地源 /etc/yum.repos.d/local.repo
  • 应用:gpmall(开源商城,含 4 个后端 jar + 1 个前端 dist)
  • 后端端口:8081 / 8082 / 8083

查看系统版本:

[root@localhost ~]# cat /etc/redhat-release
CentOS Linux release 7.x

2. Linux 环境部署

2.1 修改主机名

[root@localhost ~]# hostnamectl set-hostname mall
[root@localhost ~]# bash
[root@mall ~]#

hostnamectl set-hostname 修改静态主机名,重启后仍生效。执行 bash 是为了让当前 shell 立即刷新提示符。

2.2 查看主机名

[root@mall ~]# hostname
mall

或者:

[root@mall ~]# hostnamectl
   Static hostname: mall
         Icon name: computer-vm
           Chassis: vm

2.3 配置 hosts 文件

[root@mall ~]# vi /etc/hosts

加入一行(IP 换成你自己的):

192.168.x.x    mall

验证:

[root@mall ~]# ping -c 2 mall
PING mall (192.168.x.x) 56(84) bytes of data.
64 bytes from mall (192.168.x.x): icmp_seq=1 ttl=64 time=0.032 ms

注意:提示符里的名字只是显示,真正影响服务的是 /etc/hostname/etc/hosts 的内容。如果只改了提示符而没配 hosts,某些服务用主机名互相访问时仍会解析失败。

2.4 配置本地 YUM 源

查看本地源配置:

[root@mall ~]# cat /etc/yum.repos.d/local.repo
[local]
name=Local YUM
baseurl=file:///mnt/cdrom
enabled=1
gpgcheck=0

解释:

  • baseurl=file:///mnt/cdrom 表示从挂载的 ISO 读包,不走网络;
  • gpgcheck=0 跳过签名校验,学习环境可用;
  • 如果 ISO 没挂上,先执行 mount /dev/cdrom /mnt/cdrom

本地源里只有 CentOS 官方包。Elasticsearch 不在其中,如果直接安装成功,说明你的环境里额外配了 Elastic 源或用了其他源,建议在环境说明里补一句。

3. 安装基础服务

基础服务共 5 项:Java JDK、Redis、Elasticsearch、Nginx、MariaDB。

3.1 安装 Java 环境

作用:gpmall 是 Java 应用,需要 JDK 运行。

[root@mall ~]# yum install -y java-1.8.0-openjdk java-1.8.0-openjdk-devel

验证:

[root@mall ~]# java -version
openjdk version "1.8.0_xxx"
OpenJDK Runtime Environment (build 1.8.0_xxx)
OpenJDK 64-Bit Server VM (build 25.xxx-bxx, mixed mode)

看到版本号即安装成功。

3.2 安装 Redis

作用:缓存会话和热点数据,减轻数据库压力。

[root@mall ~]# yum install redis -y

3.3 安装 Elasticsearch

作用:为 gpmall 提供商品搜索能力。

[root@mall ~]# yum install elasticsearch -y

CentOS 默认源没有 ES,如果你的环境能直接装成功,说明之前配过 Elastic 源。这一步建议在环境说明里写清楚。

3.4 安装 Nginx

作用:托管前端静态资源,反向代理后端接口。

[root@mall ~]# yum install nginx -y

CentOS 7 默认源没有 Nginx,需要 EPEL 源。原文直接装成功,说明源已配好。

3.5 安装 MariaDB

作用:存储 gpmall 的业务数据(用户、商品、订单等)。

[root@mall ~]# yum install mariadb mariadb-server -y

4. 启动系统服务

4.1 配置并启动 MariaDB

编辑配置文件:

[root@mall ~]# vi /etc/my.cnf

[mysqld] 段下加入:

[mysqld]
init_connect='SET NAMES utf8'
collation_connection = utf8_unicode_ci
character-set-server=utf8

保存退出:Esc:wq

这里要注意:两条 init_connect 写在一起,后一条会覆盖前一条,实际只有一条生效。正确写法是只保留一条 init_connect,其他字符集参数分开写。

init_connect 只对非超级用户生效,root 登录不受影响。

重启服务:

[root@mall ~]# systemctl restart mariadb

4.2 设置 root 密码

尝试用密码登录:

[root@mall ~]# mysql -uroot -p123456

能进入 MariaDB [(none)]> 提示符,说明密码正确。

如果忘了密码,不要反复试,跳过权限表重置:

systemctl stop mariadb
mysqld_safe --skip-grant-tables &
mysql -uroot
UPDATE mysql.user SET password=PASSWORD('新密码') WHERE user='root';
FLUSH PRIVILEGES;

然后重启 MariaDB。

4.3 创建 gpmall 数据库

进入数据库后:

MariaDB [(none)]> create database gpmall;

如果提示已存在,直接使用:

MariaDB [(none)]> use gpmall;

导入数据:

MariaDB [gpmall]> source /root/gpmall.sql;

出现大量 Query OK 表示导入成功。

退出:

MariaDB [gpmall]> exit;

验证:

[root@mall ~]# mysql -uroot -p123456 -e "use gpmall; show tables;"

能看到表列表即成功。

4.4 启动 Redis 服务

修改配置,注释掉绑定地址:

[root@mall ~]# sed -i 's/^bind 127.0.0.1/# bind 127.0.0.1/' /etc/redis.conf
[root@mall ~]# sed -i 's/protected-mode yes/protected-mode no/' /etc/redis.conf

启动并设置开机自启:

[root@mall ~]# systemctl start redis
[root@mall ~]# systemctl enable redis

验证:

[root@mall ~]# redis-cli ping
PONG

解释这两条 sed:

  • 注释 bind 127.0.0.1:允许其他主机连接,不只监听本机;
  • 关闭 protected-mode:非本机连接时不拒绝。

生产环境不要这样裸奔,应配密码 + 防火墙。

4.5 启动 Elasticsearch

编辑配置:

[root@mall ~]# vi /etc/elasticsearch/elasticsearch.yml

写入:

http.cors.enabled: true
http.cors.allow-origin: "*"
http.cors.allow-credentials: true

network.host 改为自己的 IP。

注意:http.cors.allow-origin 的引号必须是英文引号,写成中文引号 ”*“ 会导致 YAML 解析失败。

启动并设置开机自启:

[root@mall ~]# systemctl start elasticsearch
[root@mall ~]# systemctl enable elasticsearch

验证:

[root@mall ~]# curl http://本机IP:9200
{
  "name" : "...",
  "cluster_name" : "...",
  "version" : { "number" : "x.x.x" },
  "tagline" : "You Know, for Search"
}

解释这三条:开启 CORS 跨域,允许任意来源访问 ES 的 HTTP 接口,方便前端或可视化工具调用。生产环境应把 * 换成具体域名。

4.6 启动 Nginx 服务

[root@mall ~]# systemctl start nginx
[root@mall ~]# systemctl enable nginx

验证:

[root@mall ~]# systemctl status nginx
● nginx.service - The nginx HTTP and reverse proxy server
   Active: active (running)

无报错即可。

5. 应用系统部署

5.1 确认 hosts 解析

[root@mall ~]# cat /etc/hosts
127.0.0.1   localhost localhost.localdomain
192.168.x.x mall

5.2 部署前端页面

清空 Nginx 默认目录:

[root@mall ~]# rm -rf /usr/share/nginx/html/*

复制前端打包产物:

[root@mall ~]# cp -rvf dist/* /usr/share/nginx/html/

dist 是 gpmall 前端项目打包后的静态目录,需要提前上传到当前目录。

修改 Nginx 配置:

[root@mall ~]# vi /etc/nginx/conf.d/default.conf

按实际情况配置 root 指向 /usr/share/nginx/html,并配置后端接口的反向代理。

重启 Nginx:

[root@mall ~]# nginx -t
[root@mall ~]# systemctl restart nginx

nginx -t 测试语法,再 restart,避免配置写错导致 Nginx 起不来。

5.3 部署后端服务

进入目录:

[root@mall ~]# cd /root/gpmall

依次启动 4 个服务:

[root@mall gpmall]# nohup java -jar shopping-provider-0.0.1-SNAPSHOT.jar > shop.log 2>&1 &
[root@mall gpmall]# nohup java -jar user-provider-0.0.1-SNAPSHOT.jar > user.log 2>&1 &
[root@mall gpmall]# nohup java -jar gpmall-shopping-0.0.1-SNAPSHOT.jar > gpmall-shop.log 2>&1 &
[root@mall gpmall]# nohup java -jar gpmall-user-0.0.1-SNAPSHOT.jar > gpmall-user.log 2>&1 &

注意日志文件名要和 jar 包名保持一致,避免排查时找错文件。

解释 nohup ... &

  • nohup:忽略挂断信号,退出 shell 后进程继续运行;
  • > xxx.log 2>&1:标准输出和错误输出都写入日志;
  • &:后台运行。

检查端口:

[root@mall gpmall]# netstat -ntlp | grep -E '8081|8082|8083'
tcp6 0 0 :::8081 :::* LISTEN 12345/java
tcp6 0 0 :::8082 :::* LISTEN 12346/java
tcp6 0 0 :::8083 :::* LISTEN 12347/java

看到 8081、8082、8083 三个端口处于 LISTEN 即启动成功。

浏览器访问:

http://192.168.x.x

能看到商城首页即部署完成。

如果访问失败,按下面顺序排查:

  1. netstat -ntlp 确认端口是否真的在听;
  2. tail -f shop.log 看后端日志有没有报错;
  3. mysql -uroot -p123456 确认数据库能连;
  4. redis-cli ping 确认 Redis 正常;
  5. curl http://localhost:9200 确认 ES 正常;
  6. systemctl status nginx 确认 Nginx 正常。

6. 总结

6.1 五个服务的作用

  • Java JDK:运行 gpmall 后端
  • MariaDB:存储业务数据
  • Redis:缓存会话和热点数据
  • Elasticsearch:商品搜索
  • Nginx:托管前端、反向代理后端

6.2 常见问题:MariaDB 连接失败

现象:

mysql -uroot
ERROR 1045 (28000): Access denied for user 'root'@'localhost'

排查:

  1. systemctl status mariadb → 服务正常
  2. tail -f /var/log/mariadb/mariadb.log → 无异常
  3. mysql -uroot -p123456 → 能登录

原因:之前已经设置过 root 密码,本次连接未带密码。

解决:使用正确密码登录;忘记密码时用 --skip-grant-tables 重置。

6.3 常用排查命令

systemctl status <服务名>          # 服务状态
ss -lntp | grep <端口>             # 端口监听
journalctl -u <服务名> -f          # 实时日志
curl -I http://localhost:<端口>    # HTTP 测试
tail -f xxx.log                    # 应用日志

以上就是完整的部署过程。核心不是把命令敲一遍,而是理解每个服务为什么存在、配置项改了什么、出问题按什么顺序排查。