引言
有一段时间没有更新简书了,今天遇到些后端运维的问题,记录一下。
需求如下:
需要在已经部署了一个项目的linux 服务器上部署我自己的项目,互不干扰。
有两种解决方案:
① 一个容器 多个端口发布多个项目
② 多个容器 分别发布
linux下同一个tomcat用不同端口发布多个项目
一、修改tomcat的conf目录下的server.xml
配置service 节点,有几个项目就相应的配置几个service 节点;
注意修改Service name; Connector port; Engine name; Host appBase这四项内容
<?xml version='1.0' encoding='utf-8'?>
<Server port="8005" shutdown="SHUTDOWN">
<!-- Security listener. Documentation at /docs/config/listeners.html
<Listener className="org.apache.catalina.security.SecurityListener" />
-->
<!--APR library loader. Documentation at /docs/apr.html -->
<Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />
<!--Initialize Jasper prior to webapps are loaded. Documentation at /docs/jasper-howto.html -->
<Listener className="org.apache.catalina.core.JasperListener" />
<!-- Prevent memory leaks due to use of particular java/javax APIs-->
<Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />
<Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />
<Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" />
<GlobalNamingResources>
<Resource name="UserDatabase" auth="Container"
type="org.apache.catalina.UserDatabase"
description="User database that can be updated and saved"
factory="org.apache.catalina.users.MemoryUserDatabaseFactory"
pathname="conf/tomcat-users.xml" />
</GlobalNamingResources>
<Service name="Catalina1">
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
<Engine name="Catalina1" defaultHost="localhost">
<Realm className="org.apache.catalina.realm.LockOutRealm">
<Realm className="org.apache.catalina.realm.UserDatabaseRealm"
resourceName="UserDatabase"/>
</Realm>
<Host name="localhost" appBase="webapps1"
unpackWARs="true" autoDeploy="true">
<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="/route" reloadable="true" docBase="/home/develop/tomcat-7.0.54/flatrass"/>
</Host>
</Engine>
</Service>
<Service name="Catalina2">
<!--把port改成8081-->
<Connector port="8081" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="9543" /> <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
<Engine name="Catalina2" defaultHost="localhost">
<Realm className="org.apache.catalina.realm.LockOutRealm">
<Realm className="org.apache.catalina.realm.UserDatabaseRealm"
resourceName="UserDatabase"/>
</Realm>
<Host name="localhost" appBase="webapps2" ---这里要修改为修改后的webapps名称
unpackWARs="true" autoDeploy="true">
<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="/route" reloadable="true" docBase="/home/develop/tomcat-7.0.54/flatrasweats"/>
</Host>
</Engine>
</Service>
</Server>
上面的配置文件需要直接复制server.xml中的Service节点。从本文复制可能会出现Tomact启动不了的坑!!
二、先依照此配置文件配置,完成后在tomcat根目录下复制文件夹webapps,粘贴重命名为webapps1,webapps2,如下图:此文件夹就是分别用来部署项目的。
三、在tomcat根目录下的conf文件中,复制conf文件夹下的Catalina文件夹,粘贴并重命名为Catalina1,Catalina2,如图:
配置完成,现在可以把项目分别部署到配置好的两个文件夹webapps1和webapps2中;
启动tomcat,分别用不同的端口号8080和8081测试;
http://127.0.0.1:8080/项目名
http://127.0.0.1:8081/项目名
linux 上多个 tomcat 分别部署项目
一、下载 tomcat 解压成多个 文件夹供使用,比如这里将 tomcat 下载到 /opt 下,进行解压改名
tar -zxvf apache-tomcat-7.0.75.tar.gz
mv apache-tomcat-7.0.75 tomcat-8070
重复以上解压改名步骤,新增多个 tomcat,大致如下:
[root@vastio138 opt]# ls
apache-tomcat-7.0.75.tar.gz tomcat-8080
tomcat-8090 tomcat-8070
二、分别修改各个 tomcat 目录下的 config/server.xml 文件
server.xml 中修改如下三个端口:(vim 可以使用 / 进行查找修改)
保证修改的端口号不重复!
另,如果防火墙开启的话(service iptables status 查看),还需要修改 防火墙配置(centos 6.8),增加 tomcat 的端口号到配置文件中:
使用(yy 拷贝已有的端口号一行,然后 p 粘贴,最后 i 修改端口号)
[root@vastio138 /]# vim /etc/sysconfig/iptables
# Firewall configuration written by system-config-firewall
# Manual customization of this file is not recommended.
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 1521 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 8070 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 8080 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 8090 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT
~
保存退出后重启防火墙service iptables restart
或者 直接关闭防火墙 : service iptables stop
当然上面所说防火墙的IP白名单的问题其实也不太容易出现,一般情况都会选择Nginx作负载均衡,无需开启这么多端口。
附录Spring Boot项目打包成war包,并发布在tomact容器的示例。
步骤:
- 配置文件(本地部署)
- 启动类(war包部署)
- war包部署pom.xml添加
- maven命令生成war包(跳过测试)
- war部署到tomcat
配置文件(本地部署)
这里呢,是我们springboot的配置文件需要做的一些配置,即使似乎跟打包没有半毛钱关系,但是还是在这里强调一下,大多数情况下,maven是默认进行项目测试的,请确保在打包成war前,数据库配置正确,以免入坑。
user = name
spring.datasource.url = jdbc:mysql://127.0.0.1:3306/mj
spring.datasource.username = root
spring.datasource.password = 123456
spring.datasource.driverClassName = com.mysql.jdbc.Driver
spring.jpa.hibernate.ddl-auto = update
spring.jpa.show-sql = true
启动类(war包部署)
接下来呢,要想springboot项目知道我们的意图,我们要引导我们的项目,告诉他我们要打包成war包,在此我们需要继承SpringBootServletInitializer类重写他的configure方法。告诉他我们要怎样启动它,生成war包需要的相关文件
package com.job;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.servlet.ServletComponentScan;
import org.springframework.boot.web.support.SpringBootServletInitializer;
@SpringBootApplication
@ServletComponentScan
public class JobManagementApplication extends SpringBootServletInitializer{
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
return application.sources(JobManagementApplication.class);
}
public static void main(String[] args) {
SpringApplication.run(JobManagementApplication.class, args);
}
}
war包部署pom.xml添加
接下来,我们要为maven的pom.xml添加相关的依赖配置:
首先要把<packaging>jar</packaging>改为以下
<packaging>war</packaging>
必要的话可以选择打包的名字
<build>
<finalName>demo</finalName>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
其次还有添加以下依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>provided</scope>
</dependency>
maven命令生成war包(跳过测试)
mvn clean package -Dmaven.test.skip=true
war部署到tomcat
部署到tomcat的webapps文件目录下(确保webapps目录下没有其他同名文件夹)
tips:云服务器上部署时确保连接数据库配置正确,否则项目跑不起来。
总结
介绍到这里,应该是整个部署流程都已走完。
衷心希望大家能少走一些弯路。