系统是 CentOS Linux release 7.5.1804 x84-64:cat /etc/redhat-release
,由于腾讯云服务器的镜像环境需要付费使用,因此手动安装 Java1.8,Tomcat9,MySQL8,Redis5。
这里安装的是Oracle JDK1.8 而非 OpenJDK 1.8,实际使用没有多大区别,不过前者只供个人使用,后者可以供商业使用。由于Oracle官网需要登陆,没从官网获取对应的二进制包,而是找到对应的网盘资源 (提取码:f2y8),上传到服务器。
mkdir /usr/local/java8 mv jdk-8u212-linux-x64.tar.gz /usr/local/java/ tar -zxvf jdk-8u212-linux-x64.tar.gz -C /usr/local/java8/ // 配置环境变量 vim /etc/profile //在末尾添加 export JAVA_HOME=/usr/local/java8/jdk1.8.0_212 export JRE_HOME=${JAVA_HOME}/jre expor CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib export PATH=${JAVA_HOME}/bin:$PATH //生效 source /etc/profile //验证 java -version //还可以添加软连接(并不必须) ln -s /usr/local/java8/jdk1.8.0_212/bin/java /usr/bin/java
SpringBoot已经内置了Tomcat服务器,为什么还要安装呢?这引出了我这两天未能解决的问题:用 jar包方式 未能成功上线运行,留到后面章节再说。
这里为了和 SpringBoot 2.2.1 适配,版本是 apache-tomcat-9.0.48 。官网:下载 binary Distributions→ Core→ tar.gz 或 zip ,上传至服务器。
mkdir /usr/local/tomcat9 tar -zxvf apache-tomcat-9.0.48.tar.gz -C /usr/local/tomcat9 //启动 cd /usr/local/tomcat9/apache-tomcat-9.0.48/bin ./startup.sh //可以查看 8080端口是否监听和占用 netstat -tuplpn | grep 8080 lsof -i :8080
安装完成后,可以通过修改 conf/server.xml 来自定义配置Tomcat,其中可以配置其默认端口 从 8080 改为 80
<Connector port="80" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" /> .....
同时因为我的项目是SpringBoot 打成 mall-0.0.1-SNAPSHOT.war,因此 如果要访问 应该是 http://[IP]:[port]/mall-0.0.1-SNAPSHOT。同样可以通过修改配置文件,避免在URL中写项目名的麻烦:
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="localhost_access_log" suffix=".txt" pattern="%h %l %u %t "%r" %s %b" /> <!--添加如下代码--> <Context path="" docBase="mall-0.0.1-SNAPSHOT" debug="0"/>
将 http://{my-IP}:{my-Port}/mall-0.0.1-SNAPSHOT 映射为 http://[my-IP]:[my-Port]/
但是此时还无法在网页上访问,需要配置 腾讯云服务器外层安全组和自身的防火墙,将80端口开发。安全组设置参考官网文档 ,重点介绍一下开放防火墙指定端口:
// 查看防火墙设置 firewall-cmd --state // 如果没有开启,就开启 systemctl start firewalld.service // 设置开机自启 systemctl enable firewalld.service //永久设置开放80端口 firewall-cmd --zone=public --add-port=80/tcp --permanent firewall-cmd --reload // 查看哪些端口是开启状态 firewall-cmd --list-port
这样端口开放后,就可以通过 访问 http://{my-IP}:80访问项目(如果没有对前面的项目URL映射,访问的应该是Tomcat的页面)。
参考之前的帖子
参考 长沙大鹏 -Linux安装部署Redis(超级详细),关键命令如下:
各个版本的下载地址
wget https://download.redis.io/releases/redis-5.0.2.tar.gz // 安装依赖 yum install -y gcc-c++ mkdir /usr/local/redis tar -zxvf redis-5.0.2.tar.gz -C /usr/local/redis cd /usr/local/redis/redis-5.0.2 //编译 make //安装 cd ../ mkdir {bin,etc,data} cd redis-5.0.2/src make PREFIX=/usr/local/redis install //结果安装的redis程序保存/usr/local/redis/bin中 cp /usr/local/redis/redis-5.0.2/redis.conf /usr/local/redis/etc/ // 修改 redis.conf,具体可以参考 https://www.cnblogs.com/hunanzp/p/12304622.html vi redis.conf ///////主要是修改以下内容 daemonize yes //1.可以后台运行 supervised systemd //2.这样后面可以用 systemctl 控制 # bind 127.0.0.1 ::1 protected-mode no //3.这两行保证 可以从外网访问redis requirepass 1234567 //4.自行设置是否需要设置密码,默认是注释掉的 logfile "/usr/local/redis/redis_6379.log" //5.redis日志保存文件,需要自己手动创建 touch /usr/local/redis/redis_6379.log //开启redis bin/redis-server etc/redis.conf lsof -i:6379 //关闭redis bin/redis-cli -a your-password shutdown
SpringBoot版本:2.2.1
本来 SpringBoot 自带 Tomcat,直接打成 jar包就可以运行了。但是不知为何,我运行之后出现问题:一直报错:显示端口被占用
为此我在 StackOverflow上提问 。似乎是作者之一回答让我更新到2.2.7版本,看是否能解决,因为之前的版本似乎有这方面的bug。我试过,结果打包之后直接 Tomcat无法运行,郁闷了一下午。最后尝试不用内置的,而使用独立的Tomcat来运行,这样出什么问题,在日志上都能显示出来,而不像一个黑盒子。
参考SpringBoot学习日记-部署与监控 和 Spring Boot 2 实战:以 War 包的形式部署
1.修改 pom文件
<!--1. 显式声明打 war包,如果之前没写,默认应该是jar包--> <packaging>war</packaging> <!--2. 排除内置的 Tomcat,关键是 provided,表面打包的时候不会带上--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> <scope>provided</scope> </dependency> <!--3. 打包时跳过 test,可加可不加--> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <version>2.4.2</version> <configuration> <skipTests>true</skipTests> </configuration> </plugin>
2.将原来的 入口类 projectApplication.java
修改为继承 SpringBootServletInitializer
抽象类
原来的入口类:
public class MallApplication { public static void main(String[] args) { SpringApplication.run(MallApplication.class, args); } }
现在的入口类:
public class MallApplication extends SpringBootServletInitializer { @Override protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { return application.sources(MallApplication.class); } public static void main(String[] args) { SpringApplication.run(MallApplication.class, args); } }
然后在IDEA编辑器中 可以先 Build→Build Project ,然后使用Maven工具中 clean package 两个命令,直接获得 war包,然后上传到 Tomcat服务器中的 webapps
。当Tomcat启动后,war包会自动解压成包。
由于是独立的Tomcat的服务器,因此 application.properties
中的一些设置,比如 server.port
,比如文件映射。但是可以在Tomcat server.xml
中可以如同前面映射项目名一样设置。参考spring boot更改tomcat的静态资源路径
<Context path="/images" docBase="/root/imooc_mall/images" reloadable="true" debug="0"/>
这样 http://{ip}:80/images
映射到 /root/imooc_mall/images
。
最后部署成功,访问 http://101.34.56.200/ 就可以访问部署的项目了,花了几天的时间终于成功部署了自己做的项目。
后续的一些问题亟待解决: