对于刚毕业的大学生或者刚进入工作的职场新人来说,写代码已经是非常常见的事情了,但是部署项目的经理确是少之又少,尤其是在llinux上部署会显得更加陌生。目前我也是在经历这样的一个困境,所以这两天在网上学习了一些关于linux部署的经验分享给大家。
一、为什么部署服务大多数都是在linux系统上,相较于windows他有什么优势呢
通过在网上搜寻找到并总结了以下几点:
1. 开源性质
可查看和修改源代码,使用免费,低配置老旧的电脑也能平稳运行。
2. 安全性更高
严格的用户权限管理机制、内置强大的防火墙工具(如 iptables 或 nftables),以及活跃的开源社区支持。一旦发现系统漏洞,开发者可以快速发布补丁,无需中断服务器运行即可完成修复。相比其他系统,Linux 社区对 bug 的响应速度更快,从发现问题到解决问题的时间周期更短,大大提升了系统的稳定性和安全性。
3.Linux 非常适合程序员
内置强大终端、支持 Git 和 SSH,包管理器让软件安装更轻松。同时它高度可定制,拥有大量针对不同用途设计的发行版,用户可以根据需求自由选择。更重要的是,Linux 几乎不收集用户信息,隐私更有保障。
总结一下:使用 Linux 操作系统更加经济实惠且安全性更高。它不仅开源免费,无需支付授权费用,还对硬件配置要求较低,适合老旧设备使用。同时,Linux 通常不会像其他系统那样大量收集用户数据,因此在隐私保护方面也更具优势。
二、windows上下载Linux虚拟机
安装方面我是跟着这个文章进行安装的,其次我们部署主要都是使用远程连接的方式部署,所以本文是基于远程连接的实战(本文默认使用的远程连接软件是winscp,自己如果有其他的远程软件也可以)
tips:
1.VMware workstation可以直接在联想应用商店(app或官网)下载,可以直接省略前面繁琐的官网下载步骤
安装可能遇见的问题:
1.如果虚拟机网络连接不上,可以将虚拟机的网络适配器更改为桥接模式 (在VMware中目标虚拟机的虚拟机设置里改),如何测试网络是否连接可以使用这个命令来验证
ping -c 4 google.com
2.执行安装虚拟机最后一部时,无法正确安装,一直提示找不到问题,先使用这个命令,之后再次执行未成功的命令(最后一步不做也可以,因为我们是基于远程连接部署所以用不到这个功能)
sudo apt update
3.在远程连接时ip地址不能写为localhost或127.0.0.1,必须写为虚拟机ip,通过输入这个命令来查看ip
ip a
三、linux部署项目
Tips:
在 Windows 中下载并运行 Linux 虚拟机就像是“在一个电脑中的另一个电脑”,这意味着你实际上是在同一个物理机器上运行两个独立的操作系统环境。这两个系统(Windows 和 Linux 虚拟机)之间具有天然的隔离性,因此,在 Linux 虚拟机中进行的操作通常不会影响到 Windows 系统本身的数据。
- 默认情况下,Linux 虚拟机与 Windows 主机是完全隔离的。你在 Linux 中安装软件、删除文件或进行其他任何操作都不会对 Windows 系统造成影响。
- 但是,如果你手动设置了共享文件夹或其他形式的数据交换机制(例如通过网络共享),那么在其中一个系统中对共享资源所做的更改可能会反映在另一个系统中。在这种情况下,需要谨慎处理以避免数据丢失或错误覆盖。
总之,除非特别配置了共享功能,默认状态下 Linux 虚拟机和 Windows 系统之间是相互独立且安全隔离的。
现在我们已经有了一个崭新的linux服务器,接下来我们开始对搭建部署项目所必须要有的环境(这里我们用的是java项目)
1.环境准备(第一种方法,推荐使用第二种方法)
1.将jdk8.zip通过winscp将文件粘贴到项目内,并调用该命令对jdk进行解压
cd /usr/local #注意:在运行该命令前,一定要将路径切到压缩包所在位置
unzip jdk8.zip #解压
2.将jdk设置到环境变量,这里我们使用到vim编辑器
sudo apt install vim #下载vim编辑器,有的可以跳过这一步, 通过使用 vim --version 验证
#进入文件之后按下‘i’开始编辑
#在内容末尾加上
export JAVA_HOME=/home/xiaoxun/usr/local/jdk1.8.0_422 #JDK地址
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export JRE_HOME=$JAVA_HOME
#在修改结束后按Esc 输入 ':wq' 保存退出 或 输入 ':q!' 不保存退出 或 若无修改 输入':q' 退出
注意:在修改环境变量时会出现修改失败之类的问题,这绝大可能是我们目前用户的权限不够,遇到这种问题我们可以通过切换角色的方式,将身份切换到root身份
su - #使用 su 命令直接切换到 root 用户 #这将提示你输入 root 用户的密码。注意,如果你从未设置过 root 密码,可能需要先设置一个。 sudo passwd root #如果你还没有设置 root 密码,可以通过以下命令来设置: #然后根据提示输入并确认新的 root 密码。
添加完之后大概是这个样子
3.使用命令让profile文件立刻生效
source /etc/profile
4.测试jdk是否安装成功
2.环境准备(第二种方法)
#执行命令下载linux版本jdk8
wget https://corretto.aws/downloads/latest/amazon-corretto-8-x64-linux-jdk.tar.gz
#解压
tar -xzvf amazon-corretto-8-x64-linux-jdk.tar.gz
#配置环境变量
sudo apt install vim #下载vim编辑器,有的可以跳过这一步, 通过使用 vim --version 验证
#进入文件之后按下‘i’开始编辑
#在内容末尾加上
export JAVA_HOME=/home/xiaoxun/usr/local/jdk1.8.0_422 #jdk地址
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export JRE_HOME=$JAVA_HOME
#在修改结束后按Esc 输入 ':wq' 保存退出 或 输入 ':q!' 不保存退出 或 若无修改 输入':q' 退出
#使用命令让配置文件立即生效
source /etc/profile
#测试jdk是否正常
java -version
3. 下载mysql
因为我创建的这个虚拟机内存较小,所以在虚拟机内我们只部署mysql项目,就不涉及到达梦或Oracle项目。
这里我们选择直接用命令去下载mysql服务,如果想自定义版本,跟我们配置jdk的步骤挺像的
#使用命令下载mysql服务
sudo apt install mysql-server
#测试mysql是否下载成功 我这里下载好的是5.7版本
mysql --version
#启动mysql服务
sudo systemctl start mysql
#检验是否运行 之后还是老样子:q退出
sudo systemctl status mysql
运行成功大概就是这个样子
现在我们要创建一个用于远程连接的用户
#创建用户 如果遇到密码不合适的报错,那就更改合适的密码,或者跟着最下面的要求临时更改密码规则
CREATE USER 'xiaoxun'@'%' IDENTIFIED BY '123456';
#设置用户权限
grant all privileges on *.* to 'xiaoxun'@'%';
#刷新权限
flush privileges;
#退出mysql窗口
exit;
#临时更改密码规则(针对mysql5.7)
#设置策略为 LOW
SET GLOBAL validate_password_policy = LOW;
#设置最小长度为 4(可选)
SET GLOBAL validate_password_length = 4;
现在我们测试连接navciat,如果显示连接失败,我们就需要设置mysql的配置文件,使其允许远程连接
#进入到mysql的配置文件中(只针对5.7,其他版本的配置可能不在这里)
sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf
#修改[mysqld]内的bind-address
bind-address = 0.0.0.0
#修改完成之后Ctrl+O保存 回车确认 Ctrl+X退出
#然后我们重启mysql
sudo systemctl restart mysql
#重启mysql服务
sudo systemctl restart mysql
#去navicat测试连接
4.下载redis
因为我们虚拟机使用的是Ubuntu,所以我们这里使用包管理器安装redis
#个人建议在每次下载前都切换到root账号,并经路径切换到工具路径
su -
cd /usr/local
#输入命令安装redis
sudo apt install redis-server
#检查redis服务是否启动
sudo systemctl status redis-server
#我个人是喜欢每次使用都手动开启,如果有些人喜欢开机自动启动可以运行以下命令
sudo systemctl enable redis-server
#有需要进行远程连接redis的可以修改配置
#注意通过指令下载的redis,一般会存到/etc文件夹内
cd /etc/redis
vim ./redis.conf
#然后将bind的部分注释掉,在将protected-mode设置为no(图片在下面)
#最后重启一下redis
sudo systemctl restart redis-server
运行成功样式 修改配置文件的地方,修改好我们重启之后用redis可视化工具连接一下
5.下载一个tomcat进去试部署一下
还是老样子,将tomcat打包放到linux中解压一下
#解压tomcat压缩包
unzip tomcat9_8080
#导航到tomcat的bin下
cd tomcat9_8080/bin
#启动tomcat
sh startup.sh
#如果出现 Cannot find ./catalina.sh 请给文件赋予权限,然后再次运行sh startup.sh
chmod +x *.sh
运行之后出现这样的显示那么我们tomcat就运行成功了
输入ip+端口,查看我们的tomcat主页是否加载,如果加载出来那就成功了
6.配置nigix
如何我们的项目是javaweb项目,到此已经算是成功了,接下来只需要将sql导入,war包放入到tomcat的webapp下重启tomcat项目就算是部署成功了。但是,我要演示的项目是前后端分离的项目所以我们继续配置。
nginx: download nigix官网
#下载nginx,我这里下载的是1.28版本,想下载其他版本可以去官网上找
#记得在下载前先切换到指定路径,方便管理(我一般是放在和jdk一个文件夹下)
wget https://nginx.org/download/nginx-1.28.0.tar.gz
#解压
tar -zxvf nginx-1.28.0.tar.gz
#配置nginx,如果出现 error: C compiler cc is not found报错那么就需要装一下c编译器(gcc),安装在最下方
cd nginx-1.28.0
./configure
#编译和安装nginx
make&&make instal
#c编译器(gcc)安装
sudo apt install build-essential
#如果你的linux也是新装的那你也要安装一下这个包,也是使用./configure命令的必须加载包
sudo apt install libpcre3 libpcre3-dev
sudo apt install zlib1g zlib1g-dev
安装成功之后大概是这个样子
最后启动nginx
#将目录切换到/usr/local/nginx/sbin
#注意make&&make install运行后会在/usr/local下生成nginx文件(如果不在那就在你的nginx1.28.0文件夹附近找找)
cd /usr/local/nginx/sbin
#运行nginx
./nginx
#运行ls查看nginx是否运行
ls
这样就运行成功了
输入网址验证一下
7.放入项目开始部署实战
首先将打包好的项目放入到nginx中的html目录下
tips:
如何可视化操作显示权限不足,可以先存到当前用户有权限的文件夹内,然后再通过命令的形式切换到root用户,将这两个文件转移到目标文件夹下
#切换方式还是老样子 su - #然后根据提示输入密码
(至于如何直接用root登录,或者给自己的角色更高的权限我还在研究中...)
然后配置ngiinx.conf,下面是我自己的一个配置,主要新增了server部分(只新增了管理后台和用户前台,其他地方不变)
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server {
listen 80;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
root html;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
#============================新增部分===============================
# 管理后台
server {
listen 81;
server_name localhost;
root /usr/local/nginx/html/dist1;
index index.html;
location / {
try_files $uri $uri/ /index.html;
}
# 后端API接口
location /prod-api/ {
proxy_pass http://localhost:8080/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
# 用户前台
server {
listen 70;
server_name localhost;
root /usr/local/nginx/html/dist;
index index.html;
location / {
try_files $uri $uri/ /index.html;
}
# 后端API接口
location /prod-api/ {
proxy_pass http://localhost:8080/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
#=========================结束新增====================================
}
注:如果有粘贴的需求,尽量自己选中一个server粘贴,因为我删掉了一部分注释,现在的配置格式是否正确没有测试过
#########################如果想让两个前端共用一个监听端口示例##############################
server {
listen 80;
server_name your.server.ip.address; # 替换为你的实际 IP 地址或域名
# 管理端应用
location /admin/ {
alias /usr/local/nginx/html/admin/dist;
try_files $uri $uri/ /admin/index.html;
}
# 用户端应用
location /user/ {
alias /usr/local/nginx/html/user/dist1;
try_files $uri $uri/ /user/index.html;
}
# 后端API接口
location /prod-api/ {
proxy_pass http://localhost:8080/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
#这样我们就可以通过切换路由来实现切换平台
这是我对nginx.conf的内容做的一个注释,部署的小伙伴可以根据注释自己diy
# 全局块:影响整个 Nginx 进程
user nginx; # 指定运行 Nginx 的用户,默认为 nginx 用户
worker_processes auto; # 工作进程数,通常设为 CPU 核心数(auto 表示自动检测)
# events 块:控制连接处理相关参数
events {
worker_connections 1024; # 每个 worker 进程最大连接数
use epoll; # 使用 epoll 模型(Linux 推荐)
multi_accept on; # 启用一次接收多个新连接请求
}
# http 块:所有 HTTP 相关配置
http {
include mime.types; # 引入 MIME 类型定义
default_type application/octet-stream; # 默认 MIME 类型
# 日志格式定义
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log logs/access.log main; # 访问日志路径及格式
error_log logs/error.log; # 错误日志路径
sendfile on; # 开启高效文件传输模式
keepalive_timeout 65; # 客户端连接超时时间(秒)
gzip on; # 启用 GZIP 压缩
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
# server 块:虚拟主机配置,一个 server 对应一个网站或服务
server {
listen 80; # 监听的端口
server_name localhost; # 主机名或域名,也可以是 IP 地址
# location 块:匹配 URI 路径
location / {
root html; # 网站根目录,即静态资源存放路径
index index.html index.htm; # 默认首页文件
try_files $uri $uri/ =404; # 如果找不到文件,返回 404 或 index.html(用于前端路由)
}
# 错误页面自定义
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
# 可以添加更多 server 块来部署多个网站
# 示例:另一个前端项目
server {
listen 80;
server_name example.com;
location / {
root /data/www/my-vue-app/dist;
index index.html;
try_files $uri $uri/ /index.html;
}
}
}
ok,修改完配置文件,先效验一下配置文件是否有误
#效验配置文件
cd ...... #先将路径切换到/usr/local/nginx/sbin
sudo ./nginx -t
#效验没问题之后重启服务
sudo ./nginx -s reload
效验结果正确大概是这个样子
最后我们输入网址测试一下,前端是否正常
由此可见前端已经正常运行了
- war:如果是war包, war包导入到linux的tomcat的webapps中,然后重启tomcat服务
- jar: 如果是jar包,那么将jar包导入到linux中,然后cd切换路径,再用java -jar 包名.jar 启动
这里我用的是jar包,代码运行结果如下,接下来我们看看项目是否正常
四、进阶配置负载均衡
其实配置nginx负载均衡也很简单,下面是我nginx配置的一个负载均衡,其实就是加了一个backend_servers,在backend_servers中进行配置和设置一些其他服务器路径,最后将后端接口的代理路径更改为backend_servers就好了
注:tomcat配置多个服务流程还是一样的注意改tomcat端口就行,这里讲一下jar包的多个服务,除了修改项目配置文件的端口以外,在使用命令方面推荐大家使用nohup的方式,这个意思是指在后台运行,就不会在控制太输出日志
nohup java -jar app1.jar --server.port=8081 > app1.log 2>&1 & nohup java -jar app2.jar --server.port=8082 > app2.log 2>&1 &
http {
upstream backend_servers {
# 使用最少连接算法
least_conn;
# 定义后端服务器列表
server localhost:8080 max_fails=3 fail_timeout=30s;
server localhost:8081 max_fails=3 fail_timeout=30s;
# 如果有更多服务器,可以继续添加
# server localhost:8082 backup; # 可选:作为备用服务器
}
server {
listen 81;
server_name localhost;
root /usr/local/nginx/html/dist1;
index index.html;
location / {
try_files $uri $uri/ /index.html;
}
# 管理端应用
location /admin/ {
alias /usr/local/nginx/html/admin/dist/;
try_files $uri $uri/ /admin/index.html;
}
# 用户端应用
location /user/ {
alias /usr/local/nginx/html/user/dist/;
try_files $uri $uri/ /user/index.html;
}
# 后端API接口
location /prod-api/ {
proxy_pass http://backend_servers;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
}
好啦,讲到这里我们整个项目部署工作也算完成了,我这里讲得是tomcat的部署方式,像docker部署我还不是很熟悉,等我工作中啥时候docker很常用了,我在考虑出一期docker教程。
我的第二篇博客就此完成,完结撒花!!!