Linux 单节点环境部署(gpmall 商城示例)
引言:前段时间完成了一次 Linux 单节点应用部署实验,过程中踩了不少坑。本文把当时的操作过程重新整理成一份可复现的教程,重点补上环境说明、命令解释和验证环节。
目标
- 了解应用系统需要哪些基础服务;
- 完成这些基础服务的安装与启动;
- 部署 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
能看到商城首页即部署完成。
如果访问失败,按下面顺序排查:
netstat -ntlp确认端口是否真的在听;tail -f shop.log看后端日志有没有报错;mysql -uroot -p123456确认数据库能连;redis-cli ping确认 Redis 正常;curl http://localhost:9200确认 ES 正常;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'
排查:
systemctl status mariadb→ 服务正常tail -f /var/log/mariadb/mariadb.log→ 无异常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 # 应用日志
以上就是完整的部署过程。核心不是把命令敲一遍,而是理解每个服务为什么存在、配置项改了什么、出问题按什么顺序排查。
浙公网安备 33010602011771号