一.前言
学习了许久的Java,也参与开发了很多的Java项目,但一直没有系统的接触学习过项目部署,而我对项目部署也很有兴趣,于是便摸索学习了一番,在这里记录一下学习过程,参考博客,遇到的问题和解决办法,有需要会随时更新。
服务器使用的阿里云ECS云服务器,下面就开始一步步介绍如何从零开始部署一个Web项目。
二.建站流程
第一步:购买阿里云服务器
1.阿里云提供多种服务器类型的选择,这里主要介绍其中两款云服务器的区别:轻量应用服务器和云服务器ECS
1)轻量应用服务器:提供各种镜像安装,能够预装开发运行需要的应用环境,适合快速部署项目
2)云服务器ECS:只预装了基础的操作系统,其他软件需自己安装,适合学习
我这里选择购买了云服务器ECS,学生购买服务器是有优惠的,一年114,下面是学生优惠购买的地址
/ntms/act/campus.html?userCode=qhrfl7xv
购买过程中可以设置服务器密码,也可以购买完成后再设置。
购买完成后查看自己的云主机,里面包含两个ip(公网ip和私有ip):
1)公网ip:公网ip用于提供互联网的访问服务
2)私有ip:用于内网访问使用,同一个VPC下,并在同一个安全组下的ECS,默认内网互通,并且内网能实现快速互访,不受公网带宽的影响,内网IP地址常用于ECS与ECS之间的快速访问
第二步:购买域名
在阿里云的域名服务购买域名,配置DNS解析,指向我们服务器的公网ip。(这里注意,因为指向的是阿里云的服务器,属于大陆服务器,所以需要对域名进行备案,才能正常访问到服务器。如果仅仅想访问本机,不备案也可以)
第三步:域名备案
如果域名未备案的话,访问会出现如下界面
具体本案步骤可参考:/knowledge_detail/36925.html?spm=5176.11065259.1996646101.searchclickresult.7bab345eZzJDFy
第四步:ECS云服务器环境配置
Part 1 :下载Xshell和Xftp,用于操作服务器
下载链接:/s/17XCHaCs7viIUKsgrO0gydw 提取码:6scw
连接参数:1.ip为服务器公网ip
2.账号为root
3.密码为自己设置的云服务器密码
Part 2:安装JDK 1.8
安装到/usr/local/java目录下(CentOS一般软件都安装到/usr/local)
安装方法参照:/pdsu161530247/article/details/81582980
踩的坑:
1.使用wget方法下载jdk的时候无法解压,因为使用这种方法下载的包没有同意证书,所以不能解压。需要自己去官网下载好安装包然后传到服务器。
2.配好Java环境变量后报错。
可能原因:
1)CentOS自带了OpenJDK,自己再安装一个后,系统不知道用哪个。(ECS服务器实例中是没有安装OpenJDK的)
2)echo $PATH 环境变量配置了多个jdk。
出现这个的原因是export的最后一句,每次都会拼接上之前的path。
第一次vim /etc/profile,添加下面的配置,然后source /etc/profile:
export JAVA_HOME=/root/usr/local/java/jdk1.8.0_161/ #jdk安装目录export JRE_HOME=${JAVA_HOME}/jreexport CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib:$CLASSPATHexport JAVA_PATH=${JAVA_HOME}/bin:${JRE_HOME}/binexport PATH=$PATH:${JAVA_PATH}
因为配置错了,所以再次vim /etc/profile,删除上面的配置,添加下面的配置,然后source /etc/profile,出现问题,PATH加上了上一次的错误配置。
export JAVA_HOME=/usr/local/java/jdk1.8.0_161 #jdk安装目录export JRE_HOME=${JAVA_HOME}/jreexport CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib:$CLASSPATHexport JAVA_PATH=${JAVA_HOME}/bin:${JRE_HOME}/binexport PATH=$PATH:${JAVA_PATH}
解决方法:重置PATH变量,再重新配置Java环境变量。操作如下:
① vim /etc/profile 删除前面配置过的path,添加下面一条,再source /etc/profile就可以重置PATH
export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
② 再填入正确的环境变量,重新配置即可
3)JDK压缩包有问题。(调了一下午,尝试了各种方法,最后发现2中的bug是由于我从网上下的JDK安装包有问题,坑啊。从官网下了一个就不报错了)
JDK 1.8 下载链接:/s/1fZ91wKsPaA7ObjdFs8NX2A 提取码:dwsp
Part 3:安装Tomcat
解压,(如有需要修改参数配置),启动。具体参考:/xdp-gacl/p/4097608.html
踩的坑:
1.服务器Tomcat成功启动后,外部访问 “服务器ip:8080” 并不能访问到Tomcat,原因是阿里云服务器默认未开启8080端口的安全组,需要在:打开阿里云官网-->(管理)控制台-->云服务器ECS-->实例,然后点击右边的“更多”-->网络和安全组-->安全组配置 中配置安全组。
(补充:另外还有一种访问不了的原因是Linux系统的防火墙禁止了8080端口)
Tomcat 8 下载地址:/apache/tomcat/tomcat-8/v8.5.40/bin/
Part 4:安装Mysql
CentOS安装mysql有一下几种方式:
1.源码编译安装
2.二进制rpm包安装
3.yum安装(yum将自动从centos的镜像站点查找你指明的软件的最新二进制包,并检查软件包依赖关系,安装软件的同时自动安装其依赖的软件包。yum本身是不包含Mysql的库的,需要我们指定)
这里我们选择yum安装方式:
1)wget /mysql57-community-release-el7-10.noarch.rpm(下载yum包,貌似可省略)
2)sudorpm -Uvh mysql57-community-release-el7-10.noarch.rpm ( 安装repo源)
3)yum install -y mysql-community-server (真的是巨慢,应该可以通过清华源安装,后续摸索)
调试安装好的mysql:
1) 启动 MySQL(推荐第一组命令):
systemctl start mysqldsystemctl stop mysqldsystemctl restart mysqld//第二种,容易记,但是我用的时候报Unit not find的错误service msyqld startservice msyqld stopservice msyqld restart
2)设置开机启动 MySQL
systemctl enable mysqldsystemctl daemon-reload
3)修改 MySQL 密码(Mysql启动后会给root用户生成随机密码),使用下面命令可以查看
grep 'temporary password' /var/log/mysqld.log
4)登陆,并修改密码
mysql -u root -p
set password for 'root'@'localhost'=password('YourNewPassword123!');
因为 mysql 设置了密码安全检查插件,你的密码必须包含大小写英文,数字,字符且不小于8位,需注意,以英文分号结束。否则会报错。
5)设置远程连接(因为 root 用户默认禁止远程连接,所以你可以改变策略让 root 远程连接,或者创建新用户去远程连接。这里为了安全起见,新建用户 ppjun)
GRANT ALL PRIVILEGES ON *.* TO 'ppjun'@'%' IDENTIFIED BY 'YourNewPassword123!' WITH GRAN;
(这里的意思是让用户 ppjun 分配本机所有数据库所有表的权限,并且设置密码 YourNewPassword123!,我用的时候出错了)
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '123456' WITH GRANT OPTION;
(给root用户设置远程连接)
6)配置默认 UTF8 编码
vim /etc/f
在[mysqld]下面新增 character_set_server=utf8
7)重启mysql
停止命令:systemctl stop mysqld.service
启动命令:systemctl start mysqld.service
(可以使用show variables like 'character_set_%'; 查看字符集是否修改好)
Part 5:安装Redis
1)下载、解压、编译Redis
$ wget http://download.redis.io/releases/redis-5.0.4.tar.gz$ tar xzf redis-5.0.4.tar.gz$ cd redis-5.0.4$ make
2)进入:redis-5.0.4/src,将redis-server 和 redis-cli 移动到 redis-5.0.4中
cp redis-cli redis-server /usr/local/java/redis-5.0.4
3)配置redis配置文件redis.conf,在redis-5.0.4下。
daemonize yes (修改daemonize 为yes,是redis可以在后台运行)# bind 127.0.0.1(redis安全策略默认本机访问,所以远程访问的话需要将 bind 127.0.0.1加#注释掉)protected-mode no (修改protected-mode为no,使得可以远程访问)
4)添加安全组,开发阿里云服务器6379端口
5)启动redis服务器,在redis-5.0.4目录下输入如下命令
./redis-server redis.conf
启动成功即可通过ip+端口号连接redis了
Part 5:安装Nginx
参考:/u014209205/article/details/78921870
Part6:项目部署
部分方式有以下几种:
1.打成war包放到Tomcat的webapps目录下
报错:
21-Apr- 01:01:33.869 INFO [http-nio-8080-exec-3] org.apache.coyote.http11.Http11Processor.service Error parsing HTTP request headerNote: further occurrences of HTTP header parsing errors will be logged at DEBUG level.java.lang.IllegalArgumentException: Invalid character found in the request target. The valid characters are defined in RFC 7230 and RFC 3986at org.apache.coyote.http11.Http11InputBuffer.parseRequestLine(Http11InputBuffer.java:483)at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:684)at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:808)at org.apache..NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1498)at org.apache..SocketProcessorBase.run(SocketProcessorBase.java:49)at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)at java.lang.Thread.run(Thread.java:748)
原因是项目中使用了https请求,Tomcat的header缓冲区大小不够,只需要在server.xml中增加maxHttpHeaderSize字段即可:
<Connector connectionTimeout="20000" maxHttpHeaderSize="8999" port="8080" protocol="HTTP/1.1" redirectPort="8443"/>
2.打成jar包,使用java -jar运行jar包
1)进入到项目的根目录,打开命令行,输入打包命令打包
cmd窗口输入:mvn clean package -Dmaven.test.skip=true
PowerShell窗口输入:mvn clean package '-Dmaven.test.skip=true'
2)到项目target找到打包好的jar包,上传到服务器上
3)启动jar包,后台启动jar包
nohup java -jar sell.jar >log.txt & (>log.txt是日志输出到log.txt文件的意思)
nohup java -jar sell.jar -Dspring.profiles.active=prod >log.txt &
3.Docker镜像部署