网站首页 > 精选教程 正文
在现代Web开发中,构建一个可靠的、可扩展的Web应用程序需要综合利用多种技术栈。本文将通过实际案例,详细讲解如何从零开始部署一个以Spring Boot为核心的Web应用程序,包括后端、数据库、缓存、中间件和前端的全栈配置。我们将利用Ansible来实现自动化部署,以简化繁琐的配置流程。
场景概述
该应用由以下组件组成:
- Spring Boot:核心后端服务,打包为一个可运行的JAR文件。
- MySQL:提供关系型数据库支持。
- Redis:作为缓存服务,加速数据访问。
- Vue.js:构建用户交互的前端界面。
- Nginx:反向代理和静态文件服务。
我们将假设目标服务器运行CentOS7,Ubuntu 20.04或类似的Linux发行版,并通过Ansible进行远程配置。
部署步骤
1. 准备服务器环境
首先,确保目标服务器已经安装了以下基本工具:
- OpenSSH:用于Ansible的远程连接。
- Python:Ansible需要Python支持。
在控制节点安装Ansible:
# CentOS 7 系统
yum install ansible -y
# Ubuntu 系统
sudo apt update && sudo apt install -y ansible
验证Ansible安装是否成功:
ansible --version
2. 规划目录结构
为了让项目部署更加清晰,我们规划以下目录结构:
├── ansible
│ ├── playbooks
│ │ ├── deploy.yml # 主Playbook文件
│ ├── inventory # 主机清单
│ ├── files # 上传的静态文件和配置
│ │ ├── springboot-app.jar
│ │ ├── nginx.conf
│ │ └── vue-dist/
将必要的文件上传到files目录中,包括Spring Boot的JAR包、Nginx配置文件,以及Vue的打包结果(通常是dist目录)。
3. 编写Playbook
接下来,我们将逐步编写Playbook,分步完成部署。
3.1 安装必需的服务
安装Java环境、MySQL、Redis和Nginx:
- name: Install Required Services
hosts: all
become: true
tasks:
- name: Install Java, MySQL, Redis, and Nginx (Ubuntu)
apt:
name:
- openjdk-11-jdk
- mysql-server
- redis-server
- nginx
state: present
update_cache: yes
when: ansible_os_family == 'Debian' # Ubuntu系统
- name: Install Java, MySQL, Redis, and Nginx (CentOS)
yum:
name:
- openjdk-11-jdk
- mysql-server
- redis-server
- nginx
state: present
when: ansible_os_family == 'RedHat' # CentOS系统
3.2 配置MySQL数据库
配置数据库和用户:
- name: Configure MySQL Database
mysql_db:
name: springboot_db
state: present
login_user: root
login_password: "your_mysql_root_password"
- name: Create MySQL User
mysql_user:
name: springboot_user
password: springboot_password
priv: 'springboot_db.*:ALL'
state: present
login_user: root
login_password: "your_mysql_root_password"
3.3 配置Redis
确保Redis服务正在运行:
- name: Ensure Redis is Running (Ubuntu)
service:
name: redis-server
state: started
enabled: true
when: ansible_os_family == 'Debian' # Ubuntu系统
- name: Ensure Redis is Running (CentOS)
service:
name: redis
state: started
enabled: true
when: ansible_os_family == 'RedHat' # CentOS系统
3.4 部署Spring Boot应用
现在我们可以上传Spring Boot应用的JAR包并配置systemd服务,使其能够自动启动。
- name: Upload Spring Boot Application
copy:
src: files/springboot-app.jar
dest: /opt/springboot-app/springboot-app.jar
owner: root
group: root
mode: '0755'
- name: Configure Spring Boot SystemD Service
copy:
dest: /etc/systemd/system/springboot-app.service
content: |
[Unit]
Description=Spring Boot Application
After=network.target
[Service]
User=root
ExecStart=/usr/bin/java -jar /opt/springboot-app/springboot-app.jar
Restart=always
[Install]
WantedBy=multi-user.target
- name: Reload SystemD and Start Spring Boot Service
command: systemctl daemon-reload
- name: Ensure Spring Boot Service is Running
service:
name: springboot-app
state: started
enabled: true
3.5 配置Nginx
我们将配置Nginx作为反向代理,并将前端Vue应用的静态文件服务到指定目录。
- name: Upload Vue Static Files
copy:
src: files/vue-dist/
dest: /var/www/html/vue-app/
owner: www-data
group: www-data
mode: '0755'
- name: Configure Nginx
copy:
src: files/nginx.conf
dest: /etc/nginx/sites-available/springboot-app
- name: Enable Nginx Configuration
file:
src: /etc/nginx/sites-available/springboot-app
dest: /etc/nginx/sites-enabled/springboot-app
state: link
- name: Remove Default Nginx Configuration
file:
path: /etc/nginx/sites-enabled/default
state: absent
- name: Restart Nginx
service:
name: nginx
state: restarted
3.6 完整Playbook
将所有任务整合到一个完整的Playbook中,最终形成deploy.yml,代码如下:
---
- name: Deploy Spring Boot Web Application
hosts: all
become: true
vars:
mysql_root_password: "{{ mysql_root_password }}" # MySQL root 密码
mysql_database: springboot_db # 数据库名称
mysql_user: springboot_user # 数据库用户
mysql_password: "{{ mysql_password }}" # 数据库用户密码
tasks:
# 安装服务(Java, MySQL, Redis, Nginx)
- name: Install Java, MySQL, Redis, and Nginx (Ubuntu)
apt:
name:
- openjdk-11-jdk
- mysql-server
- redis-server
- nginx
state: present
update_cache: yes
when: ansible_os_family == 'Debian' # Ubuntu系统
- name: Install Java, MySQL, Redis, and Nginx (CentOS)
yum:
name:
- java-11-openjdk
- mysql-server
- redis
- nginx
state: present
when: ansible_os_family == 'RedHat' # CentOS系统
# 配置MySQL数据库
- name: Configure MySQL Database
mysql_db:
name: "{{ mysql_database }}"
state: present
login_user: root
login_password: "{{ mysql_root_password }}"
- name: Create MySQL User
mysql_user:
name: "{{ mysql_user }}"
password: "{{ mysql_password }}"
priv: "{{ mysql_database }}.*:ALL"
state: present
login_user: root
login_password: "{{ mysql_root_password }}"
# 确保Redis服务正在运行
- name: Ensure Redis is Running (Ubuntu)
service:
name: redis-server
state: started
enabled: true
when: ansible_os_family == 'Debian' # Ubuntu系统
- name: Ensure Redis is Running (CentOS)
service:
name: redis
state: started
enabled: true
when: ansible_os_family == 'RedHat' # CentOS系统
# 上传Spring Boot应用JAR文件
- name: Upload Spring Boot Application
copy:
src: files/springboot-app.jar
dest: /opt/springboot-app/springboot-app.jar
owner: root
group: root
mode: '0755'
# 配置Spring Boot SystemD服务
- name: Configure Spring Boot SystemD Service
copy:
dest: /etc/systemd/system/springboot-app.service
content: |
[Unit]
Description=Spring Boot Application
After=network.target
[Service]
User=root
ExecStart=/usr/bin/java -jar /opt/springboot-app/springboot-app.jar
Restart=always
[Install]
WantedBy=multi-user.target
- name: Reload SystemD and Start Spring Boot Service
command: systemctl daemon-reload
- name: Ensure Spring Boot Service is Running
service:
name: springboot-app
state: started
enabled: true
# 上传Vue前端静态文件
- name: Upload Vue Static Files
copy:
src: files/vue-dist/
dest: /var/www/html/vue-app/
owner: www-data
group: www-data
mode: '0755'
# 配置Nginx
- name: Configure Nginx
copy:
src: files/nginx.conf
dest: /etc/nginx/sites-available/springboot-app
- name: Enable Nginx Configuration
file:
src: /etc/nginx/sites-available/springboot-app
dest: /etc/nginx/sites-enabled/springboot-app
state: link
- name: Remove Default Nginx Configuration
file:
path: /etc/nginx/sites-enabled/default
state: absent
- name: Restart Nginx
service:
name: nginx
state: restarted
通过以上步骤,您可以在CentOS和Ubuntu系统上自动化部署一个完整的Spring Boot Web应用,包括后端(Spring Boot)、数据库(MySQL)、缓存(Redis)、前端(Vue.js)以及反向代理(Nginx)。通过Ansible的自动化部署,不仅提高了部署效率,还使得运维工作更加便捷、可重复。如果您有任何问题或改进建议,欢迎留言讨论。
猜你喜欢
- 2025-03-19 瑞芯微RK3568|SDK开发之环境安装及编译操作
- 2025-03-19 从0开始,让你的Spring Boot项目跑在Linux服务器
- 2025-03-19 Jenkins 部署运行(jenkins怎么部署环境)
- 2025-03-19 K8S环境快速部署Kafka(K8S外部可访问)
- 2025-03-19 开源文档预览项目 kkFileView (9.9k star) ,快速入门
- 2025-03-19 搭建一个基于Docker服务的java Web服务器环境1
- 2025-03-19 如何安装一个专业版的linux(如何安装linux软件)
- 2025-03-19 用了8年的方式-用 Docker 瞬间搭建本地开发环境
- 2025-03-19 本地Ubuntu轻松部署高效性能监控平台SigNoz与远程使用教程
- 2025-03-19 基于Ubuntu16.04使用KVM实现Linux环境虚拟机化
你 发表评论:
欢迎- 04-11Java面试“字符串三兄弟”String、StringBuilder、StringBuffer
- 04-11Java中你知道几种从字符串中找指定的字符的数量
- 04-11探秘Java面试中问的最多的String、StringBuffer、StringBuilder
- 04-11Python字符串详解与示例(python字符串的常见操作)
- 04-11java正则-取出指定字符串之间的内容
- 04-11String s1 = new String("abc");这句话创建了几个字符串对象?
- 04-11java判断字符串中是否包含某个字符
- 04-11关于java开发中正确的发牌逻辑编写规范
- 最近发表
-
- Java面试“字符串三兄弟”String、StringBuilder、StringBuffer
- Java中你知道几种从字符串中找指定的字符的数量
- 探秘Java面试中问的最多的String、StringBuffer、StringBuilder
- Python字符串详解与示例(python字符串的常见操作)
- java正则-取出指定字符串之间的内容
- String s1 = new String("abc");这句话创建了几个字符串对象?
- java判断字符串中是否包含某个字符
- 关于java开发中正确的发牌逻辑编写规范
- windows、linux如何后台运行jar(并且显示进程名)
- 腾讯大佬私人收藏,GitHub上最受欢迎的100个JAVA库,值得学习
- 标签列表
-
- nginx反向代理 (57)
- nginx日志 (56)
- nginx限制ip访问 (62)
- mac安装nginx (55)
- java和mysql (59)
- java中final (62)
- win10安装java (72)
- java启动参数 (64)
- java链表反转 (64)
- 字符串反转java (72)
- java逻辑运算符 (59)
- java 请求url (65)
- java信号量 (57)
- java定义枚举 (59)
- java字符串压缩 (56)
- java中的反射 (59)
- java 三维数组 (55)
- java插入排序 (68)
- java线程的状态 (62)
- java异步调用 (55)
- java中的异常处理 (62)
- java锁机制 (54)
- java静态内部类 (55)
- java怎么添加图片 (60)
- java 权限框架 (55)
本文暂时没有评论,来添加一个吧(●'◡'●)