目录
作为程序员,打代码是远远不够的,还要对项目进行部署,也就是上线。将本地开发好的项目部署在远程服务器上,使得任何机器都可以通过我们远程服务器的公网ip或者域名加上端口号访问到我们项目。本篇博客将详细讲解不同的项目部署方法,看完这篇文章,你一定会有所收获!
首先项目部署分一下几个步骤:
环境搭建:以springboot项目为例,需要将项目打成jar包,想要让jar包在服务器跑起来的话需要搭建环境,也就是jdk环境。tomcat不要安装,springboot自带。
数据库部署:在本地开发时,我们本地代码里的数据库连接的是本机的数据库且为localhost,这个项目只能访问自己电脑,只有自己能够访问;但如果项目部署到远程服务器上时,要想访问到数据库,应该先部署数据库,至于数据库连接就不能是本地数据库了,这里我部署的是云数据库。
以上方法实现后就可以把项目的jar包上传到服务器上执行java项目即可。
部署前的准备就不详细讲解了,本文主要讲解项目部署的方法!
请求地址
开发环境:localhost:8080
线上环境:userManager-backend.code-nav.cn
启动方式
开发环境:npm run start(本地启动,监听端口,自动更新)
线上环境:npm run build(项目构建打包,可以使用server工具启动:npm i-g serve)
不同项目(框架)都有不同的配置文件,本次项目使用的是umi框架,其配置文件是config,可以在配置文件后添加对应环境名称后缀来区分开发环境和生产环境。
项目配置
开发环境:config-dev.ts
生产环境:config-prod.ts
公共配置:config.ts 不带后缀
本次项目为springboot项目,springboot项目是通过application.yaml添加不同后缀名来区分配置文件
可以通过项目启动时传入环境变量:
java -jar .\user-center-backend-0.0.1-SNAPSHOT.jar --spring.profiles.active=prod
后端主要是更改:
依赖的环境地址
数据库地址
缓存地址
消息队列地址
项目端口号
服务器配置

后端搭建好后,我们可以来测试一下是否可以运行项目,通过mvn打包:

在target内找到打包的项目,在该路径下的控制台内输入:
java -jar./user-center-backend-0.0.1-SNAPSHOT.jar --spring.profiles.active=prod

到这里,就可以看到后端代码是可以显示的啦!
前后端准备好后,我们就开始最后的部署吧!!!
本次部署使用的服务器为linux服务器,建议是CentOS 8+ 或者7.6以上版本
所有环境都是自己部署!!
使用web服务器:Nginx、Apache、tomcat(本次使用的为Nginx服务器)
安装Nginx服务器:
用系统自带的软件包管理器快速安装,比如 centos 的 yum
到官网安装
#下载Nginx安装包
curl -o nginx-1.21.6.tar.gz http://nginx.org/download/nginx-1.21.6.tar.gz
#解压
tar -zxvf nginx-1.21.6.tar.gz
#跳转至解压后端Nginx包里下载相关包
yum install pcre pcre-devel -y
yum install openssl openssl-devel -y
#设置系统配置参数
./configure --with-http_ssl_module --with-http_v2_module --with-stream
#开始编译
make
#安装
make install
#加入环境变量
ls /usr/local/nginx/sbin/nginx
vim /etc/profile
#在最后一行添加
export PATH=$PATH:/usr/local/nginx/sbin
#使文件生效
source /etc/profile
#最后输入命令nginx即可
nginx
#查看启动情况
netstat -ntlp

把Nginx搭建好后,我们就可以将前端项目放进服务器然后运行啦!!!
将打包好的项目传入服务器(在根目录下执行)
unzip dist.zip -d user-center-front
#将dist内的文件全部移到user-center-front目录下
mv * ../
修改Nginx的配置文件:nginx.conf
将开启的用户设为root用户

将项目地址填入root后面

执行项目
nginx -s reload 在自己的浏览器输入自己服务器的IP地址即可进入,但会发现以下问题

这是因为修改的nginx.conf是没有执行成功的,运行nginx时,使用的是默认的nginx.conf配置文件,路径是不一样的,所以得修改默认路径下的nginx.conf!

项目成功启动啦!!!
配置java环境:jdk、maven
#安装jdk
yum install -y java-1.8.0-openjdk*
#安下载maven包
curl -o apache-maven-3.8.5-bin.tar.gz https://dlcdn.apache.org/maven/maven-3/3.8.5/binaries/apache-maven-3.8.5-bin.tar.gz
#解压
tar -zxvf apache-maven-3.8.5-bin.tar.gz
#进入解压后的maven文件跳转到bin文件可以看到该文件内的mvn执行文件
#复制其地址
/root/env/apache-maven-3.8.5/bin
#配置环境变量
vim /etc/profile
#在最后一行的路径后面添加 : + 路径
export PATH=$PATH:/usr/local/nginx/sbin:/root/env/apache-maven-3.8.5/bin
#刷新环境
source /etc/profile
#测试mvn是否搭建成功
mvn -v
Apache Maven 3.8.5 (3599d3414f046de2324203b78ddcf9b5e4388aa0)
Maven home: /root/env/apache-maven-3.8.5
#将后端项目传入服务器内
#将项目打包构建,并跳过测试
mvn package -DskipTests
#打包完成后在target文件下可以看到user-center-backend-0.0.1-SNAPSHOT.jar
#在当前目录下执行该jar包
java -jar user-center-backend-0.0.1-SNAPSHOT.jar --spring.profile.active=prod
#注意这样运行的话窗口会卡死,所以应该使其在后台运行
nohup java -jar user-center-backend-0.0.1-SNAPSHOT.jar --spring.profile.active=prod &
#执行后会看到运行该项目的端口号,然后按回车即可

到此,我们的原始部署已经完成了!!!
如果是腾讯云的轻量应用服务器的话是自带宝塔Linux的,我用的是华为云的服务器,所以得从官网下载并配置。官网地址(宝塔面板下载,免费全能的服务器运维软件)
#Centos安装脚本
yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && sh install.sh ed8484bec
#堡塔云控平台安装脚本
curl http://download.bt.cn/coll_free/install.sh|bash
安装完成后会显示控制面板的地址和账户密码,首先要先添加服务器的安全组,设置入栈规则允许访问该地址,然后在登录宝塔修改密码!!
进来后你会发现这简直就是新天地啊,全都是可视化界面了,想装什么就去搜一键安装!!!
nginx安装:

tomcat安装:

在宝塔的控制页面直接点解网站,创建站点

创建完成之后,如图点击进入其目录

删除所有默认文件

将前端打包好的文件直接全部拖入该文件下

然后项目就部署完成啦!!!!太快了

在宝塔控制面板点击文件,新建一个后端文件

点击网站,点击Java项目,添加java项目。项目执行路径一定要注意了!

注意,如果提交时报端口重复,大概率是tomcat占用了8080端口,只需要另起一个宝塔页面,在软件商店内搜索tomcat,然后将其关闭即可!

还没有解决的话,可以通过:netstat -tunlp 用于显示 tcp,udp 的端口和进程等相关情况。在查到端口占用的进程后,如果你要杀掉对应的进程可以使用 kill 命令 :kill -9 PID
启动成功!

启动成功后要去看一下服务器有没有开启8080端口,如果没有的话就要去开启,宝塔内也要开启8080端口!!


Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux或Windows操作系统的机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。
简单的说,docker就是一个容器,可以将项目的环境(比如java、nginx)和项目的代码一起打包成镜像,所有人都可以下载镜像,更加容易分发和移植。在启动项目时就不再需要敲过多命令,而是直接下载镜像,启动镜像即可。相当于软件的安装包!
Docker安装:
直接使用宝塔软件商店进行安装
用于指定构建Docker镜像的方法是通过Dockerfile文件来完成的,Dockerfile一般都是去cv下来的,不需要太深入理解。
Dockerfile 编写:
FROM 依赖的基础镜像
WORKDIR 工作目录
COPY 从本机复制文件
RUN 执行命令
CMD / ENTRYPOINT(附加额外参数)指定运行容器时默认执行的命令
#后端Dockfile
FROM maven:3.5-jdk-8-alpine as builder
# Copy local code to the container image.
WORKDIR /app
COPY pom.xml .
COPY src ./src
# Build a release artifact.
RUN mvn package -DskipTests
# Run the web service on container startup.
CMD ["java","-jar","/app/target/user-center-backend-0.0.1-SNAPSHOT.jar","--spring.profiles.active=prod"]
#前端的Dockfile
FROM nginx
WORKDIR /usr/share/nginx/html/
USER root
COPY ./docker/nginx.conf /etc/nginx/conf.d/default.conf
#./dist 前端构建的代码包
COPY ./dist /usr/share/nginx/html/
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]
直接在项目的根目录下创建该文件即可

根据 Dockerfile 构建镜像:
添加新文件后需要重新打包并重新上传打包好的项目
# 后端
docker build -t user-center-backend:v0.0.1 .
# 前端
docker build -t user-center-frontend:v0.0.1 .


docker run 启动
# 前端
docker run -p 80:80 -d user-center-frontend:v0.0.1
# 后端
docker run -p 8080:8080 user-center-backend:v0.0.1
虚拟化
端口映射:把本机的资源(实际访问地址)和容器内部的资源(应用启动端口)进行关联
目录映射:把本机的端口和容器应用的端口进行关联
前端项目访问:
用户输入网址 => 域名解析服务器(把网址解析为 ip 地址 / 交给其他的域名解析服务) => 服务器 =>(防火墙)=> nginx 接收请求,找到对应的文件,返回文件给前端 => 前端加载文件到浏览器中(js、css) => 渲染页面
后端项目访问:用户输入网址 => 域名解析服务器 => 服务器 => nginx 接收请求 => 后端项目(比如 8080端口)
如何在buildr项目中使用Ruby?我在很多不同的项目中使用过Ruby、JRuby、Java和Clojure。我目前正在使用我的标准Ruby开发一个模拟应用程序,我想尝试使用Clojure后端(我确实喜欢功能代码)以及JRubygui和测试套件。我还可以看到在未来的不同项目中使用Scala作为后端。我想我要为我的项目尝试一下buildr(http://buildr.apache.org/),但我注意到buildr似乎没有设置为在项目中使用JRuby代码本身!这看起来有点傻,因为该工具旨在统一通用的JVM语言并且是在ruby中构建的。除了将输出的jar包含在一个独特的、仅限ruby
我在我的Rails项目中使用Pow和powifygem。现在我尝试升级我的ruby版本(从1.9.3到2.0.0,我使用RVM)当我切换ruby版本、安装所有gem依赖项时,我通过运行railss并访问localhost:3000确保该应用程序正常运行以前,我通过使用pow访问http://my_app.dev来浏览我的应用程序。升级后,由于错误Bundler::RubyVersionMismatch:YourRubyversionis1.9.3,butyourGemfilespecified2.0.0,此url不起作用我尝试过的:重新创建pow应用程序重启pow服务器更新战俘
我已经像这样安装了一个新的Rails项目:$railsnewsite它执行并到达:bundleinstall但是当它似乎尝试安装依赖项时我得到了这个错误Gem::Ext::BuildError:ERROR:Failedtobuildgemnativeextension./System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/bin/rubyextconf.rbcheckingforlibkern/OSAtomic.h...yescreatingMakefilemake"DESTDIR="cleanmake"DESTDIR="
假设我有这个范围:("aaaaa".."zzzzz")如何在不事先/每次生成整个项目的情况下从范围中获取第N个项目? 最佳答案 一种快速简便的方法:("aaaaa".."zzzzz").first(42).last#==>"aaabp"如果出于某种原因你不得不一遍又一遍地这样做,或者如果你需要避免为前N个元素构建中间数组,你可以这样写:moduleEnumerabledefskip(n)returnto_enum:skip,nunlessblock_given?each_with_indexdo|item,index|yieldit
我正在尝试创建一个带有项目符号字符的Ruby1.9.3字符串。str="•"+"helloworld"但是,当我输入它时,我收到有关非ASCII字符的语法错误。我该怎么做? 最佳答案 你可以把Unicode字符放在那里。str="\u2022"+"helloworld" 关于ruby-如何在Ruby字符串中插入项目符号字符?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/1195
我的Rails站点使用了一个确实不是很好的gem。每次我需要做一些新的事情时,我最终不得不花费与向实际Rails项目添加代码一样多的时间来为gem添加功能。但我不介意,我将我的Gemfile设置为指向我的gem的GitHub分支(我尝试提交PR,但维护者似乎已经下台)。问题是我真的没有找到一种合理的方法来测试我添加到gem的新东西。在railsc中测试它会特别好,但我能想到的唯一方法是a)更改~/.rvm/gems/.../foo。rb,这看起来不对或者b)升级版本,推送到Github,然后运行bundleup,这除了耗时之外显然是一场灾难,因为我不确定我所做的promise是否正
我一直在尝试使用nanoc用于生成静态网站。我需要组织一个复杂的排列页面,我想让我的内容保持干燥。包含或合并的概念在nanoc系统中如何运作?我已阅读文档,但似乎找不到我想要的内容。例如:我如何获取两个部分内容项并将它们合并到一个新的内容项中。在staticmatic您可以在您的页面中执行以下操作。=partial('partials/shared/navigation')类似的约定在nanoc中如何运作? 最佳答案 这里是nanoc的作者。在nanoc中,部分是布局。因此,您可以拥有layouts/partials/shared/
我安装了ruby、yeoman,当我运行我的项目时,出现了这个错误:Warning:Running"compass:dist"(compass)taskWarning:YouneedtohaveRubyandCompassinstalledthistasktowork.Moreinfo:https://github.com/gruUse--forcetocontinue.Use--forcetocontinue.我有进入可变session目标的路径,但它不起作用。谁能帮帮我? 最佳答案 我必须运行这个:geminstallcom
我有一个包含多个组件的存储库,其中大部分是用JavaScript(Node.js)编写的,一个是用Ruby(RubyonRails)编写的。我想要一个.travis.yml文件来触发一个运行每个组件的所有测试的构建。根据thisTravisCIGoogleGroupthread,目前还没有官方支持。我的目录结构是这样的:.├──构建服务器├──核心├──扩展├──网络应用├──流浪文件├──package.json├──.travis.yml└──生成文件我希望能够运行特定版本的Ruby(2.2.2)和Node.js(0.12.2)。我已经有了一个make目标,所以maketest在每
前面一篇关于智能合约翻译文讲到了,是一种计算机程序,既然是程序,那就可以使用程序语言去编写智能合约了。而若想玩区块链上的项目,大部分区块链项目都是开源的,能看得懂智能合约代码,或找出其中的漏洞,那么,学习Solidity这门高级的智能合约语言是有必要的,当然,这都得在公链``````以太坊上,毕竟国内的联盟链有些是不兼容Solidity。Solidity是一种面向对象的高级语言,用于实现智能合约。智能合约是管理以太坊状态下的账户行为的程序。Solidity是运行在以太坊(Ethereum)虚拟机(EVM)上,其语法受到了c++、python、javascript影响。Solidity是静态类型