目录
1、明确内容
2、apt
2.1、apt 语法
2.2、常用命令
2.3、更新apt
3、安装JDK17
4、安装MySQL
4.1、安装
4.2、检查版本及安装位置
4.3、初始化MySQL配置⭐
4.4、检查状态
4.5、配置远程访问⭐
4.6、登录MySQL
4.7、测试数据库
4.8、设置权限与密码⭐
5、安装redis
6、安装Nginx
6.1、相关存储位置
6.2、配置文件
第一部分:全局块
第二部分:events块
第三部分:http块
完整配置文件
80端口占用
6.3、部署前端项目
6.4、测试效果
7、安装tomcat
7.1、报错
7.2、排错⭐
8、防火墙和安全组🔺
8.1、防火墙放行
8.2、阿里云安全组🔺
9、上传工程jar包
9.1、打包
9.2、上云
10、测试项目
10.1、运行
10.2、持续运行🔺
🍃作者介绍:双非本科大三网络工程专业在读,阿里云专家博主,专注于Java领域学习,擅长web应用开发、数据结构和算法,初步涉猎Python人工智能开发和前端开发。
🦅主页:@逐梦苍穹📕所属专栏:项目
🍔您的一键三连,是我创作的最大动力🌹
Java项目开发完成之后,想要给第三方访问,则需要部署到公网上去,阿里云/腾讯云是不错的选择,这里以阿里云为例进行详细说明
1、明确内容
第一步需要明确好自己部署一个项目到云服务器的同时,需要运行什么其他服务(这里以Java项目为例说明)。
①Java项目首先要部署JDK,这里部署的是JDK17;
②现在主流的Java项目都是以SpringBoot为主流,SpringBoot内嵌了tomcat容器,所以可以不额外部署tomcat服务;
③项目当中涉及到数据存储,需要部署数据库服务,这里使用的是MySQL;
④项目涉及到缓存操作,需要部署redis;
⑤如果项目是前后端分离项目,还需要部署前端nginx服务器,可以配置tomcat集群;
2、apt
apt(Advanced Packaging Tool)是一个在 Debian 和 Ubuntu 中的 Shell 前端软件包管理器。
apt 命令提供了查找、安装、升级、删除某一个、一组甚至全部软件包的命令,而且命令简洁而又好记。
apt 命令执行需要超级管理员权限(root)。
安装:apt-get install name
更新:apt-get update name
卸载:apt-get remove name
查找:apt-cache search name
2.1、apt 语法
apt [options] [command] [package ...]
options:可选,选项包括 -h(帮助),-y(当安装过程提示选择全部为"yes"),-q(不显示安装的过程)等等。
command:要进行的操作。
package:安装的包名。
2.2、常用命令
操作 | 命令 |
列出所有可更新的软件清单 | sudo apt update |
升级软件包 | sudo apt upgrade |
列出可更新的软件包及版本信息 | apt list --upgradeable |
升级软件包,升级前先删除需要更新的软件包 | sudo apt full-upgrade |
安装指定的软件包 | sudo apt install <package_name> |
安装多个软件包 | sudo apt install <package_1> <package_2> <package_3> |
更新指定的软件包 | sudo apt update <package_name> |
显示软件包具体信息(例如:版本号,安装大小,依赖关系等) | sudo apt show <package_name> |
删除软件包 | sudo apt remove <package_name> |
清理不再使用的依赖和库文件 | sudo apt autoremove |
移除软件包及配置文件 | sudo apt purge <package_name> |
查找软件包 | sudo apt search |
列出所有已安装的包 | apt list --installed |
列出所有已安装的包的版本信息 | apt list --all-versions |
2.3、更新apt
3、安装JDK17
sudo apt install openjdk-17-jdk
当系统要求输入密码时,请输入密码。然后键入 'Y' 并按 'Enter' 继续安装。
检查是否安装成功:
运行个jar包试试看:
正常运行,环境配置无误!
4、安装MySQL
4.1、安装
sudo apt-get install mysql-server
4.2、检查版本及安装位置
4.3、初始化MySQL配置⭐
输入命令:sudo mysql_secure_installation
需要的配置项会比较多,详细如下:
1)这里输入N,选择不进行密码的强校验:
2)这里输入Y,选择确认删除匿名用户:
3)这里输入N,选择允许root远程登陆:
4)这里输入N,选择不删除test数据库:
5)这里输入Y,选择修改的权限立即生效:
6)至此,初始化完成:
4.4、检查状态
检查MySQL服务的运行状态:systemctl status mysql.service
可以看到正常运行!
4.5、配置远程访问⭐
在Ubuntu下MySQL缺省是只允许本地访问的,使用远程连接工具是连不上的;
如果要其他机器也能够访问的话,需要进行配置;
找到 bind-address 修改值为 0.0.0.0(如果需要远程访问)。
命令:sudo vi /etc/mysql/mysql.conf.d/mysqld.cnf
此处修改为0.0.0.0
修改完成,记得重启服务:sudo /etc/init.d/mysql restart
如果遇到vi编辑器不能正常的插入和保存的情况,可以选择重新安装vim。
由于Ubuntu预装的是vim-tiny,而我们需要使用vim-full,步骤如下:
①卸载vim-tiny:apt-get remove vim-common
②安装vim-full:apt-get install vim
4.6、登录MySQL
命令:sudo mysql -uroot -p
输入用户和密码(按照上面的步骤,此时的root用户是没有密码的,直接回车即可):
4.7、测试数据库
show databases:
use mysql:
select User,authentication_string,Host from user:
select host,user,plugin from user:
4.8、设置权限与密码⭐
命令:
使用mysql_native_password修改加密规则:
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '密码';
更新用户的密码:
ALTER USER 'root'@'localhost' IDENTIFIED BY '密码' PASSWORD EXPIRE NEVER;
允许远程访问:
UPDATE user SET host = '%' WHERE user = 'root';
刷新cache中配置,刷新权限:
flush privileges;
如图:
到这里,MySQL在Ubuntu上的配置和安装就完成了!
5、安装redis
安装Redis:sudo apt install redis-server
安装完成后,Redis将自动启动。
检查Redis服务状态:sudo systemctl status redis-server
如果Redis未自动启动,则手动启动Redis:sudo systemctl start redis-server
接下来,为Redis设置密码:
首先,停止Redis服务:sudo systemctl stop redis-server
然后,编辑Redis配置文件:vim /etc/redis/redis.conf
在配置文件中找到以下行:# requirepass foobared
注释掉这行,添加密码,将 # requirepass foobared 修改为requirepass yourpassword,其中 yourpassword 是需要设置的密码。保存并关闭文件。
最后,重新启动Redis服务:sudo systemctl restart redis-server
现在,Redis已经安装并设置了密码。
使用以下命令测试连接Redis:redis-cli -h localhost -p 6379 -a yourpassword ping
如果一切正常,将看到回复 "PONG"。现在,已经成功在Ubuntu上安装了Redis并设置了密码。
redis监听的是127.0.0.1:6379,并不监听外网的请求,因此想要远程连接,还需要对redis.conf配置文件中的相关内容进行修改:
①将 bind 127.0.0.1 ::1 注释掉
②将 protected-mode 改成 no:
6、安装Nginx
安装命令:sudo apt-get install nginx
验证是否安装成功:nginx -v
6.1、相关存储位置
默认安装位置:
/usr/sbin/nginx:主程序
/etc/nginx:存放配置文件
/usr/share/nginx:存放静态文件
/var/log/nginx:存放日志
测试配置文件/etc/nginx/conf.d是否正确:
6.2、配置文件
nginx最重要的莫过于配置文件,其中:
主配置文件:/etc/nginx/nginx.conf
其他配置文件:/etc/nginx/conf.d/xxxx.conf
建议是一个主配置文件+多个其他配置文件协同工作,这样能更好的规范配置项,显得更有条理性
进入/etc/nginx目录:
主配置文件为:nginx.conf。
可以将 nginx.conf 配置文件分为三部分:
第一部分:全局块
worker_processes auto;
从配置文件开始到 events 块之间的内容,主要会设置一些影响 Nginx 服务器整体运行的配置指令,主要包括:配置运行 Nginx 服务器的用户(组)、允许生成的 worker process 数,进程 PID 存放路径、日志存放路径和类型以及配置文件的引入等。
上面这行 worker_processes 配置,这是 Nginx 服务器并发处理服务的关键配置,该值越大,可以支持的并发处理量也越多,但是会受到硬件、软件等设备的制约。
第二部分:events块
events {worker_connections 768;}
events 块涉及的指令主要影响 Nginx 服务器与用户的网络连接,常用的设置包括:是否开启对多 work process下的网络连接进行序列化,是否允许同时接收多个网络连接,选取哪种事件驱动模型来处理连接请求,每个 wordprocess 可以同时支持的最大连接数等。
上述例子就表示每个 work process 支持的最大连接数为 1024。这部分的配置对 Nginx 的性能影响较大,在实际中应该灵活配置。
第三部分:http块
http {sendfile on;tcp_nopush on;types_hash_max_size 2048;# server_tokens off;# server_names_hash_bucket_size 64;# server_name_in_redirect off;include /etc/nginx/mime.types;default_type application/octet-stream;ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3; # Dropping SSLv3, ref: POODLEssl_prefer_server_ciphers on;access_log /var/log/nginx/access.log;error_log /var/log/nginx/error.log;gzip on;# gzip_vary on;# gzip_proxied any;# gzip_comp_level 6;# gzip_buffers 16 8k;# gzip_http_version 1.1;# gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;### Virtual Host Configs##server {listen 80;server_name localhost;#charset koi8-r;#access_log logs/host.access.log main;location / {root html/sky;index index.html index.htm;}error_page 500 502 503 504 /50x.html;location = /50x.html {root html;}# 反向代理,处理管理端发送的请求location /api/ {proxy_pass http://localhost:8080/admin/;#proxy_pass http://webservers/admin/;}# 反向代理,处理用户端发送的请求location /user/ {proxy_pass http://localhost:8080/user/;}# WebSocketlocation /ws/ {proxy_pass http://localhost:8080/ws/;}}include /etc/nginx/conf.d/*.conf;include /etc/nginx/sites-enabled/*;
}
这部分是 Nginx 服务器配置中最频繁的部分,代理、缓存和日志定义等绝大多数功能和第三方模块的配置都在这里。
需要注意的是:http 块也可以包括 http 全局块、server 块。
下面的反向代理、动静分离、负载均衡都是在这部分中配置。
①、http 全局块
http 全局块配置的指令包括:文件引入、MIME-TYPE 定义、日志自定义、连接超时时间、单链接请求数上限等。
②、server 块
这块和虚拟主机有密切关系,虚拟主机从用户角度看,和一台独立的硬件主机是完全一样的,该技术的产生是为了节省互联网服务器硬件成本。
每个 http 块可以包括多个 server 块,而每个 server 块就相当于一个虚拟主机。
而每个 server 块也分为全局 server 块,以及可以同时包含多个 locaton 块:
全局 server 块:最常见的配置是本虚拟机主机的监听配置和本虚拟主机的名称或 IP 配置。
location 块:一个 server 块可以配置多个 location 块。这块的主要作用是基于 Nginx 服务器接收到的请求字符串(例如 server_name/uri-string),对虚拟主机名称(也可以是 IP 别名)之外的字符串(例如 前面的 /uri-string)进行匹配,对特定的请求进行处理。地址定向、数据缓存和应答控制等功能,还有许多第三方模块的配置也在这里进行。
反向代理:
在server中配置:
完整配置文件
主配置文件内容如下:
user www-data;
worker_processes auto;
pid /run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf;events {worker_connections 768;# multi_accept on;
}http {sendfile on;tcp_nopush on;types_hash_max_size 2048;# server_tokens off;# server_names_hash_bucket_size 64;# server_name_in_redirect off;include /etc/nginx/mime.types;default_type application/octet-stream;ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3; # Dropping SSLv3, ref: POODLEssl_prefer_server_ciphers on;access_log /var/log/nginx/access.log;error_log /var/log/nginx/error.log;gzip on;# gzip_vary on;# gzip_proxied any;# gzip_comp_level 6;# gzip_buffers 16 8k;# gzip_http_version 1.1;# gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;### Virtual Host Configs##server {listen 80;server_name localhost;#charset koi8-r;#access_log logs/host.access.log main;location / {root html/sky;index index.html index.htm;}error_page 500 502 503 504 /50x.html;location = /50x.html {root html;}# 反向代理,处理管理端发送的请求location /api/ {proxy_pass http://localhost:8080/admin/;#proxy_pass http://webservers/admin/;}# 反向代理,处理用户端发送的请求location /user/ {proxy_pass http://localhost:8080/user/;}# WebSocketlocation /ws/ {proxy_pass http://localhost:8080/ws/;}}include /etc/nginx/conf.d/*.conf;include /etc/nginx/sites-enabled/*;
}
80端口占用
在部署的过程中可以发现,当nginx.conf配置监听端口为非80端口时,访问nginx服务器的80端口依旧生效,会自动跳转到欢迎页面(welcome to nginx!) ,这是因为:
在/etc/nginx/sites-enabled这个目录下面有一个default文件,这个文件是默认加载的而配置文件:
编辑这个default文件,打开以后是这样的:
listen端口默认就是80,把它改为非80端口,就不会出现80端口被欢迎页面占用的情况。
6.3、部署前端项目
打包好的前端项目可以放在自定义的文件夹下面:
记得配置好相关路径:
监听端口默认80端口。
6.4、测试效果
部署完成可以开始测试:
在本地访问localhost,在阿里云则访问对应的ip地址:
可以看到,测试没有问题!
7、安装tomcat
这个步骤可以不需要,只是为了完善整套环境。
因为在第一部分"明确内容"的时候提到过,现在主流的都是SpringBoot项目,而SpringBoot是内嵌了tomcat容器的,如图:
项目使用的是SpringBoot2.X版本,所以内嵌的是tomcat9.0.65版本。
这里就安装对应的版本来测试一下即可。
安装:sudo apt install tomcat9
7.1、报错
这个环境下同时装了JDK17和tomcat9,不出意外的话,启动服务的时候是要报错的:
报错信息显示找不到JDK,但是实际上有JDK:
7.2、排错⭐
不出意外的话,这应该是一个老生常谈的"错误"了,就是tomcat9的某些配置文件不识别JDK17。
先查看tomcat9的安装路径(whereis tomcat9):
根据上面的报错信息,可以看到加载/lib/systemd/system/tomcat9.service失败。
下面进入/lib/systemd/system/,查看tomcat9.service文件:
可以看到Tomcat9的启动脚本是/usr/libexec/tomcat9/tomcat-start.sh,下面查看该脚本的内容:
可以发现,这里有一个脚本/usr/libexec/tomcat9/tomcat-locate-java.sh是用来寻找Java环境的,下面查看该脚本:
成功发现问题:这个脚本的内容不包括Java17
解决方案:加上Java17,如下:
像这样加入17,然后重启服务就可以了。
7.3、测试
systemctl restart tomcat9
systemctl status tomcat9
成功运行:
地址栏测试(访问8080端口)出现如下页面表示成功:
如果你在浏览器看到此页面,则表示tomcat成功运行
8、防火墙和安全组🔺
根据上面的七个步骤,整个项目的环境部署已经完成了,但是外部依旧无法访问。
此处有两个关键要点:①操作系统防火墙开放对应端口;②阿里云外部设置安全组策略
8.1、防火墙放行
放行命令:ufw allow [端口号]
查看防火墙:ufw status
8.2、阿里云安全组🔺
进入云服务器ECS控制台,找到"安全组":
点击管理规则:
点击手动添加入站规则:
至此,项目环境部署完成!
9、上传工程jar包
9.1、打包
打开开发工具IntelliJ IDEA,
第一步:跳过测试
第二步:在父模块下执行"clean":
第三步:在父模块执行"compile"编译
第四步:根据依赖关系依次执行"install"(依赖的内容越多,越慢执行"install")
这里的顺序就应该是:先"install"模块sky-pojo,再模块sky-common,最后"install"最核心的服务模块sky-server。最后打开"install"模块sky-server的jar包路径:
找到路径的target目录:
把这个jar包上传到阿里云服务器即可。
9.2、上云
利用远程连接工具连接阿里云服务器(如finalshell或Xshell):
10、测试项目
10.1、运行
连上阿里云操作系统:
在阿里云的Ubuntu系统上运行jar包即可,效果如图:
10.2、持续运行🔺
由于springboot内置了tomcat容器,我们通常会把项目打成jar或者war后直接使用java -jar xxx.jar命令去运行程序,但是当前ssh窗口被锁定或者按下ctrl+c又或者关闭了ssh窗口,那么程序就会被终止。
一旦退出操作系统,即使操作系统依旧在运行中,但是项目却无法访问了。
这是因为java -jar的命令只能在当前进程运行,我们需要的是在后台单独开一个进程,让它持续运行。
解决方案一:
java -jar xxx.jar &
&代表在后台运行。
特点:当前ssh窗口不被锁定,但是当窗口关闭时,程序中止运行。
解决方案二:
nohup java -jar SpringBootDemo.jar &
nohup 意思是不挂断运行命令,当账户退出或终端关闭时,程序仍然运行
当用 nohup 命令执行时,缺省情况下该进程的所有输出被重定向到nohup.out的文件中,除非另外指定了输出文件。
解决方案三:
nohup java -jar SpringBootDemo.jar >out.txt &
">out.txt"是将command的输出重定向到out.txt文件,即输出内容不打印到屏幕上,而是输出到out.txt文件中
推荐使用方案二或方案三!
这里只是做一个简单的样例展示,具体可以根据springBoot的日志技术,分层级分大小的去记录日志到本地文件