目录
一、Tomcat实现多虚拟主机
#安装Tomcat
[root@Rocky-test1 ~]# yum -y install java-1.8.0-openjdk-devel #安装Tomcat必须先装java
[root@Rocky-test1 ~]# yum -y install tomcat tomcat-admin-webapps tomcat-webapps tomcat-docs-webapp #包安装方法[root@Rocky-test1 ~]# tar xf apache-tomcat-9.0.75.tar.gz -C /usr/local/ #二进制安装
[root@Rocky-test1 local]# ln -s apache-tomcat-9.0.75/ tomcat #创建软连接
[root@Rocky-test1 local]# echo 'PATH=/usr/local/tomcat/bin:$PATH' > /etc/profile.d/tomcat.sh #添加环境变量
[root@Rocky-test1 local]# . /etc/profile.d/tomcat.sh #变量生效[root@Rocky-test1 local]# catalina.sh version #查看tomcat版本信息
Using CATALINA_BASE: /usr/local/tomcat
Using CATALINA_HOME: /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME: /usr
Using CLASSPATH: /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
Using CATALINA_OPTS:
Server version: Apache Tomcat/9.0.75
Server built: May 4 2023 13:04:05 UTC
Server number: 9.0.75.0
OS Name: Linux
OS Version: 4.18.0-372.9.1.el8.x86_64
Architecture: amd64
JVM Version: 1.8.0_422-b05
JVM Vendor: Red Hat, Inc.[root@Rocky-test1 local]# startup.sh #启动tomcat
#Tomcat配置service文件
[root@Rocky-test1 ~]# useradd -r -s /sbin/nologin tomcat #创建服务账号
[root@Rocky-test1 ~]# vim /usr/local/tomcat/conf/tomcat.conf #修改tomcat配置
JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.422.b05-2.el8.x86_64
[root@Rocky-test1 ~]# chown -R tomcat.tomcat /usr/local/tomcat/
[root@Rocky-test1 ~]# vim /lib/systemd/system/tomcat.service #创建service文件
[Unit]
Description=Tomcat
After=syslog.target network.target[Service]
Type=forking
EnvironmentFile=/usr/local/tomcat/conf/tomcat.conf
ExecStart=/usr/local/tomcat/bin/startup.sh
ExecStop=/usr/local/tomcat/bin/shutdown.sh
PrivateTmp=true
User=tomcat
Group=tomcat[Install]
WantedBy=multi-user.target
[root@Rocky-test1 ~]# systemctl enable --now tomcat.service#实现多虚拟主机
[root@Rocky-test1 conf]# cd /usr/local/tomcat/conf/
[root@Rocky-test1 conf]# vim server.xml #在配置文件内添加<host>元素指向虚拟主机,name代表主机名称,appbase代表应用程序目录类似于apache的html文件夹位置
<Host name="localhost" appBase="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" /></Host>
<Host name="www.wlm.com" appBase="/home/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" />
</Host>
[root@Rocky-test1 conf]# mkdir /home/webapps/ROOT -pv #创建网页根目录[root@Rocky-test1 webapps]# chown tomcat.tomcat -R /home/webapps/
[root@Rocky-test1 ROOT]# echo www.wlm.com > index.html
[root@Rocky-test1 ROOT]# systemctl restart tomcat.service[root@Rocky-test1 ROOT]# vim /etc/hosts
10.0.0.151 www.wlm.com
[root@Rocky-test1 ROOT]# curl www.wlm.com:8080
www.wlm.com
#搭建jpress
[root@Rocky-test1 ~]# cd /home/webapps/
[root@Rocky-test1 webapps]# mv /root/jpress-v5.0.7.war ./ROOT.war #将jpress的war包改名后放在webapps指定的目录下(注意:Jpress版本BUG只能解压至ROOT)[root@Rocky-test2 ~]# yum -y install mysql-server #准备数据库
[root@Rocky-test2 ~]# systemctl enable --now mysqld.service
[root@Rocky-test2 ~]# mysqlmysql> create database jpress;
Query OK, 1 row affected (0.00 sec)mysql> create user jpress@'10.0.0.%' identified with mysql_native_password by '123456';
Query OK, 0 rows affected (0.01 sec)mysql> grant all on jpress.* to jpress@'10.0.0.%';
Query OK, 0 rows affected (0.01 sec)
#按照网页提示配置jpress
#访问localhost(10.0.0.151)配置tomcat默认管理界面
[root@Rocky-test1 ~]# cd /usr/local/tomcat/webapps/manager/
[root@Rocky-test1 manager]# vim ./META-INF/context.xml
<Valve className="org.apache.catalina.valves.RemoteAddrValve"
allow="127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1|10\.0\.0\.\d+" />[root@Rocky-test1 manager]# vim ../host-manager/META-INF/context.xml
<Valve className="org.apache.catalina.valves.RemoteAddrValve"
allow="127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1|10\.0\.0\.\d+" />[root@Rocky-test1 manager]# cd ../../conf/
[root@Rocky-test1 conf]# vim tomcat-users.xml
.......<role rolename="manager-gui"/>
<role rolename="admin-gui"/>
<user username="tomcat" password="123456" roles="manager-gui,admin-gui"/></tomcat-users>
[root@Rocky-test1 conf]# systemctl restart tomcat.service#访问localhost(10.0.0.151)通过server_status和host_manager可以管控服务
#通过iptables策略实现端口重定向(可选)
[root@Rocky-test1 ~]# iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8080 #将指向该服务器的80端口请求转发至8080,80和8080端口都可访问web服务
[root@Rocky-test1 ~]# iptables -vnL -t nat
Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
0 0 REDIRECT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:80 redir ports 8080
二、Tomcat定制日志格式和反向代理
2.1,Tomcat定制日志格式
[root@Rocky-test1 tomcat]# cat ./conf/server.xml
........
<Host name="www.wlm.com" appBase="/home/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" />
</Host>#pattern定义了访问日志的格式,%h代表远程主机IP,%l %u代表远程用户验证信息,%t代表时间,"代表双引号,%r代表响应报文头,%s代表服务器响应码
官方日志格式解释: https://tomcat.apache.org/tomcat-9.0-doc/config/valve.html#Access_Logging
[root@Rocky-test1 tomcat]# vim ./conf/server.xml #定制日志json格式<Host name="www.wlm.com" appBase="/home/webapps"
unpackWARs="true" autoDeploy="true">
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="localhost_access_log" suffix=".txt"
pattern="{"clientip":"%h","ClientUser":"%l","authenticated":"%u","AccessTime":"%t","method":"%r","status":"%s","SendBytes":"%b","Query?string":"%q","partner":"%{Referer}i","AgentVersion":"%{User-Agent}i"}"/>[root@Rocky-test1 tomcat]# systemctl restart tomcat.service
[root@Rocky-test1 tomcat]# yum -y install jq #安装json解析工具[root@Rocky-test1 tomcat]# tail -n1 ./logs/localhost_access_log.2024-08-07.txt | jq
{
"clientip": "10.0.0.1",
"ClientUser": "-",
"authenticated": "-",
"AccessTime": "[07/Aug/2024:14:39:17 +0800]",
"method": "GET /commons/captcha HTTP/1.1",
"status": "200",
"SendBytes": "1995",
"Query?string": "",
"partner": "http://www.wlm.com/article/2",
"AgentVersion": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36 Edg/127.0.0.0"
}
2.2,Tomcat反向代理
#Rocky-test1做Nginx代理,Rocky-test2和3做Tomcat服务,在主机安装服务后启动
#配置nginx反向代理
[root@Rocky-test1 ~]# vim /etc/nginx/conf.d/wlm.conf
upstream tomcat {
server 10.0.0.152:8080;
server 10.0.0.153:8080;
}server{
listen 80;
server_name www.wlm.com;
location / {
proxy_pass http://tomcat;
}
}
[root@Rocky-test1 ~]# systemctl restart nginx.service#绑定客户端实现会话保持
[root@Rocky-test1 ~]# vim /etc/nginx/conf.d/wlm.conf
upstream tomcat {
#ip_hash; #会话绑定客户端IP前24位
#hash $remote_addr consistent; #会话绑定客户端IP
hash $cookie_jsessionid consistent; #会话绑定cookie
server 10.0.0.152:8080;
server 10.0.0.153:8080;
}
.........[root@Rocky-test1 ~]# systemctl reload nginx.service
[root@Rocky-test2 tomcat]# cat ./webapps/ROOT/session.jsp #jsp脚本可查看获取到的cookie
<%@ page language="java" %>
<html>
<head><title>Tomcat1</title></head>
<body>
<h1><font color="red">Tomcat1</font></h1>
<table align="centre" border="1">
<tr>
<td>Session ID</td>
<% session.setAttribute("username","wangxiaochun"); %>
<td><%= session.getId() %></td>
</tr>
<tr>
<td>Created on</td>
<td><%= session.getCreationTime() %></td>
</tr>
</table>
</body>
</html>#绑定客户端IP实现会话保持,同一个IP不同浏览器访问cookie相同;
#绑定客户端cookie实现会话保持,同一个客户端不同浏览器访问初次获取的cookie不同,访问的后端服务器不同
三、Tomcat实现MSM集群
会话保持方法 | 客户端绑定 | Session集群 | MSM |
优点 | 简单易配置 | 通过Tomcat自身实现复制集群,保证session保持 | 通过memcache或redis实现会话的保存,可实现高可用 |
缺点 | 若服务器故障易丢失session | Tomcat同步节点过多时会占用带宽,且每台Tomcat保存全部session内存损耗太多 | 不支持Tomcat 10及以上版本 |
3.1,Tomcat session集群搭建
[root@Rocky-test1 ~]# vim /etc/nginx/conf.d/wlm.conf
upstream tomcat {
#ip_hash; #会话绑定客户端IP前24位
#hash $remote_addr consistent; #会话绑定客户端IP
#hash $cookie_jsessionid consistent; #会话绑定cookie
server 10.0.0.152:8080;
server 10.0.0.153:8080;
}
.........[root@Rocky-test1 ~]# systemctl reload nginx.service
[root@Rocky-test2 tomcat]# vim ./conf/server.xml
<Manager className="org.apache.catalina.ha.session.DeltaManager"
expireSessionsOnShutdown="false"
notifyListenersOnReplication="true"/><Channel className="org.apache.catalina.tribes.group.GroupChannel">
<Membership className="org.apache.catalina.tribes.membership.McastService"
address="228.0.0.4"
port="45564"
frequency="500"
dropTime="3000"/>
<Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
address="10.0.0.152"
port="4000"
autoBind="100"
selectorTimeout="5000"
maxThreads="6"/><Sender className="org.apache.catalina.tribes.transport.ReplicationTransmitter">
<Transport className="org.apache.catalina.tribes.transport.nio.PooledParallelSender"/>
</Sender>
<Interceptor className="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector"/>
<Interceptor className="org.apache.catalina.tribes.group.interceptors.MessageDispatchInterceptor"/>
</Channel><Valve className="org.apache.catalina.ha.tcp.ReplicationValve"
filter=""/>
<Valve className="org.apache.catalina.ha.session.JvmRouteBinderValve"/><Deployer className="org.apache.catalina.ha.deploy.FarmWarDeployer"
tempDir="/tmp/war-temp/"
deployDir="/tmp/war-deploy/"
watchDir="/tmp/war-listen/"
watchEnabled="false"/><ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>
#按照官方手册修改主配置文件,Apache Tomcat 9 (9.0.93) - Clustering/Session Replication How-To[root@Rocky-test2 tomcat]# vim ./webapps/ROOT/WEB-INF/web.xml
.......</description>
<distributable/>
</web-app>[root@Rocky-test2 tomcat]# systemctl restart tomcat.service
#按照相同方式修改其他Tomcat服务器,出去服务后用户访问的会话不变,后端Tomcat服务器会依照配置轮询
3.2,MSM搭建
#在原有实验环境下清除session集群配置项,并在Rocky-test2和3安装memcached服务
#具体配置可参考官方链接--https://github.com/magro/memcached-session-manager/wiki/SetupAndConfiguration
#sticky 模式,当用户请求发送到Tomcat1时,Tomcat1会生成session并备份在memcached2内,只有memcached2服务故障才会将Tomcat1会生成session存放在memcached1内
[root@Rocky-test2 tomcat]# yum -y install memcached
[root@Rocky-test2 tomcat]# vim /etc/sysconfig/memcached
PORT="11211"
USER="memcached"
MAXCONN="10240"
CACHESIZE="64"
#OPTIONS="-l 127.0.0.1,::1"[root@Rocky-test2 tomcat]# systemctl enable --now memcached.service
#修改Tomcat配置
[root@Rocky-test2 tomcat]# vim ./conf/context.xml #在最后一行前添加下列内容
<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
memcachedNodes="n1:10.0.0.152:11211,n2:10.0.0.153:11211"
failoverNodes="n1"
requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"
/></Context>[root@Rocky-test2 tomcat]# ls ./lib/ #上传服务所需的jar包(下载链接见官方文档)
annotations-api.jar jasper.jar reflectasm-1.11.9.jar tomcat-i18n-ko.jar
asm-5.2.jar jaspic-api.jar servlet-api.jar tomcat-i18n-pt-BR.jar
catalina-ant.jar jedis-3.0.0.jar spymemcached-2.12.3.jar tomcat-i18n-ru.jar
catalina-ha.jar jsp-api.jar tomcat-api.jar tomcat-i18n-zh-CN.jar
catalina.jar kryo-3.0.3.jar tomcat-coyote.jar tomcat-jdbc.jar
catalina-ssi.jar kryo-serializers-0.45.jar tomcat-dbcp.jar tomcat-jni.jar
catalina-storeconfig.jar memcached-session-manager-2.3.2.jar tomcat-i18n-cs.jar tomcat-util.jar
catalina-tribes.jar memcached-session-manager-tc9-2.3.2.jar tomcat-i18n-de.jar tomcat-util-scan.jar
ecj-4.20.jar minlog-1.3.1.jar tomcat-i18n-es.jar tomcat-websocket.jar
el-api.jar msm-kryo-serializer-2.3.2.jar tomcat-i18n-fr.jar websocket-api.jar
jasper-el.jar objenesis-2.6.jar tomcat-i18n-ja.jar[root@Rocky-test2 tomcat]# systemctl restart tomcat.service
#Rocky-test3配置与Rocky-test2相同,仅需将context.xml的failoverNodes改为n2
[root@Rocky-test2 tomcat]# cat ./logs/catalina.out #配置成功后可在日志看到下列信息
- finished initialization:
- sticky: true
- operation timeout: 1000
- node ids: [n2]
- failover node ids: [n1]
- storage key prefix: null
- locking mode: null (expiration: 5s)#non-sticky 模式,当用户请求发送到Tomcat1时,Tomcat1会生成session并备份在memcached1和2服务内互为主备
#该模式配置与上一实验配置相似,仅需修改Rocky-test2和3的context.xml配置
[root@Rocky-test2 tomcat]# vim ./conf/context.xml
<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
memcachedNodes="n1:10.0.0.152:11211,n2:10.0.0.153:11211"
sticky="false"
sessionBackupAsync="false"
lockingMode="uriPattern:/path1|/path2"
requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"
/>
[root@Rocky-test2 tomcat]# systemctl restart tomcat.service
[root@Rocky-test2 tomcat]# cat ./logs/catalina.out- finished initialization:
- sticky: false
- operation timeout: 1000
- node ids: [n1, n2]
- failover node ids: []
- storage key prefix: null
- locking mode: uriPattern:/path1|/path2 (expiration: 5s)
四、MSM原理与memcache安装使用总结
4.1,MSM原理
一种 Tomcat 高可用性解决方案,将会话额外存储在 memcached 或redis 兼容的键值存储中,以便进行会话故障转移,同时从本地内存读取会话以实现最佳性能(对于sticky-session)。对于non-sticky-session,memcached 兼容的后端用作会话存储(在辅助 memcached 节点中保留会话的副本)。
4.2,memcached安装介绍
#memcached编译安装
[root@Rocky-test1 ~]# wget https://www.memcached.org/files/memcached-1.6.29.tar.gz #下载安装包
[root@Rocky-test1 ~]# ls
anaconda-ks.cfg memcached-1.6.29.tar.gz
[root@Rocky-test1 ~]# tar xvf memcached-1.6.29.tar.gz
[root@Rocky-test1 ~]# yum -y install gcc make libevent-devel #安装依赖包
[root@Rocky-test1 ~]# cd memcached-1.6.29/
[root@Rocky-test1 memcached-1.6.29]# mkdir /home/memcached[root@Rocky-test1 memcached-1.6.29]# ./configure --prefix=/home/memcached
[root@Rocky-test1 memcached-1.6.29]# make && make install
[root@Rocky-test1 memcached-1.6.29]# cd /home/memcached/
[root@Rocky-test1 memcached]# useradd -r -s /sbin/nologin memcached
[root@Rocky-test1 memcached]# echo 'PATH=/home/memcached/bin/memcached:$PATH' > /etc/sysconfig/memcachaed.sh[root@Rocky-test1 memcached]# . /etc/sysconfig/memcachaed.sh
[root@Rocky-test1 memcached]# vim /etc/sysconfig/memcached
PORT="11211"
USER="memcached"
MAXCONN="10240"
CACHESIZE="64"
#OPTIONS="-l 127.0.0.1,::1"[root@Rocky-test1 memcached]# vim /lib/systemd/system/memcached.service
[Unit]
Description=memcached daemon
Before=httpd.service
After=network.target[Service]
EnvironmentFile=/etc/sysconfig/memcachedExecStart=/home/memcached/bin/memcached -p ${PORT} -u ${USER} -m ${CACHESIZE} -c ${MAXCONN} $OPTIONS
[Install]
WantedBy=multi-user.target[root@Rocky-test1 memcached]# systemctl daemon-reload
[root@Rocky-test1 memcached]# systemctl enable --now memcached.service
4.3,memcached使用介绍
memcached是一款键值对数据库软件,只支持能序列化的数据类型,不支持持久化,基于Key-Value的内存缓存系,服务重启时数据就会丢失。memcached相比于redis的单机QRS高,适用于业务场景简单,追求高性能的场合。
memcached常见选项:
-u username 程序运行用户名,必须为普通用户-p 端口号,默认 11211-m num 最大内存,单位MB,默认 64MB-c num 最大连接数,默认1024-d 守护进程方式运行-f 增长因子 Growth Factor ,默认 1.25-v 详细信息, -vv 能看到详细信息-M 使用内存直到耗尽,不许 LRU-U 设置 UDP 监听端口, 0 表示禁用 UDP
五、JVM垃圾回收算法和分代
JVM(Java虚拟机)的垃圾收集(Garbage Collection, GC)是Java语言一个显著的特点。它提供了一种自动清理垃圾的方法,可以有效回收堆内不再使用的对象占用的内存,保证程序的正常运行。为了提高GC效率,JVM 使用了不同的垃圾回收算法和分代策略。
5.1,垃圾回收算法
算法 | 标记-清除 | 标记-压缩 | 复制 |
实现方式 | 将可访问对象标记完成后,对未标记对象逐一清除 | 将可访问对象标记完成后,清除垃圾时将对象向内存一端移动 |
先将内存分为大小相同A,B区域
,每次只用一块,A用完后,将存活对象复制到B连续内存,清理A整块
|
优点 | 算法简单 |
整理后内存空间连续分配,有大段的连续内存可分配,没有内存碎片
|
没有内存碎片,复制过程中保证对象使用连续空间
,回收效率相对高
|
缺点 | 会造成内存碎片,无法有效利用内存 |
内存整理过程有消耗
,
效率相对低下
|
浪费内存
,只能使用原来一半内存
|
算法总结:
效率: 复制算法> 标记清除算法 > 标记压缩算法内存整齐度: 复制算法 = 标记压缩算法 > 标记清除算法内存利用率: 标记压缩算法 = 标记清除算法 > 复制算法
5.2,分代策略
EdenSpace:只有一个,刚刚创建的对象
ServivorSpace:有两个from区和同to区,大小相等、地位相同,组成复制清除算法
老年代:长时间存活的对象
元数据:存储JAVA运行时的环境信
5.4,Tomcat优化
内存优化项:JAVA_OPTS="-server -Xms512m -Xmx512m -XX:NewSize=200m -XX:MaxNewSize=200m "-Xms:堆内存初始化大小-Xmx:堆内存空间上限-XX :NewSize= : 新生代空间初始化大小-XX :NewSize= : 新生代空间上限GC回收设置优化:1,侧重用户交互(多次执行、 短时回收):-XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=80-XX:+UseCMSCompactAtFullCollection -XX:CMSFullGCsBeforeCompaction=5-XX:CMSInitiatingOccupancyFraction=N,N为0-100整数表示达到老年代的大小的百分比多
少触发回收,默认为68-XX:CMSFullGCsBeforeCompaction=N, 设定N次 CMS 后,进行一次内存碎片整理2,侧重吞吐量(一次执行长时间回收):-XX:+UseParallelGC -XX:+UseParallelOldGC此为JVM1.8默认模式
[root@Rocky-test2 ~]# vim /usr/local/tomcat/bin/catalina.sh
# -----------------------------------------------------------------------------
JAVA_OPTS="-server -Xmx512m -Xms512m -XX:NewSize=200m -XX:MaxNewSize=200m -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=80 -XX:+UseCMSCompactAtFullCollection -XX:CMSFullGCsBeforeCompaction=5"
# OS specific support. $var _must_ be set to either true or false.
[root@Rocky-test2 ~]# vim /usr/local/tomcat/conf/server.xml #修改默认线程数
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443"
maxParameterCount="1000"
maxThreads="2000"
/>[root@Rocky-test2 ~]# systemctl restart tomcat.service
六、Nexus安装和私有仓库实现
6.1,Maven介绍
Maven是一个java项目管理工具,可以对java项目进行构建/解决打包依赖等。Maven基干项目对象模型(POM project object model),它可以通过一小段描述信息(项目依赖、插件、执行目标、项目构建 profile、项目版本、项目开发者列表用<packaging> 指定项目打包形式,jar或者war )来管理项目的构建;因而,每个maven项目都有一个pom.xml文件。
#包安装;安装Maven时若未无java,会自行安装java
[root@Rocky-test1 ~]# yum list maven
maven.noarch 1:3.5.4-5.module+el8.6.0+975+c0ed2db8
[root@Rocky-test1 ~]# yum -y install maven
[root@Rocky-test1 ~]# java -version
openjdk version "1.8.0_422"
[root@Rocky-test1 ~]# mvn -version
Apache Maven 3.5.4 (Red Hat 3.5.4-5)
Maven home: /usr/share/maven
Java version: 1.8.0_422, vendor: Red Hat, Inc., runtime: /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.422.b05-2.el8.x86_64/jre
Default locale: en_US, platform encoding: UTF-8
OS name: "linux", version: "4.18.0-372.9.1.el8.x86_64", arch: "amd64", family: "unix"
#二进制安装;先安装java,再安装maven,生产环境建议安装Oracle JDK而非Open JDK
root@ubuntu-test1:~# ls #下载二进制安装包至本地
apache-maven-3.9.2-bin.tar.gz jdk-8u371-linux-x64.tar.gz snaproot@ubuntu-test1:~# mkdir /home/app/
root@ubuntu-test1:~# tar xvf jdk-8u371-linux-x64.tar.gz -C /home/app/ #安装java
root@ubuntu-test1:~# ln -s /home/app/jdk1.8.0_371/ /home/app/jdk
root@ubuntu-test1:~# vim /etc/profile.d/jdk.sh
export JAVA_HOME=/home/app/jdk
export PATH=$PATH:$JAVA_HOME/bin
root@ubuntu-test1:~# . /etc/profile.d/jdk.sh
root@ubuntu-test1:~# java -version
java version "1.8.0_371"
Java(TM) SE Runtime Environment (build 1.8.0_371-b11)
Java HotSpot(TM) 64-Bit Server VM (build 25.371-b11, mixed mode)root@ubuntu-test1:~# tar xvf apache-maven-3.9.2-bin.tar.gz -C /home/app/ #安装maven
root@ubuntu-test1:~# ln -s /home/app/apache-maven-3.9.2/ /home/app/maven
root@ubuntu-test1:~# echo PATH=/home/app/maven/bin/:$PATH > /etc/profile.d/maven.sh
root@ubuntu-test1:~# . /etc/profile.d/maven.sh
root@ubuntu-test1:~# mvn -version
Apache Maven 3.9.2 (c9616018c7a021c1c39be70fb2843d6f5f9b8a1c)
Maven home: /home/app/mavenroot@ubuntu-test1:~# vim /home/app/maven/conf/settings.xml #配置国内镜像加速
<mirror>
<id>nexus-aliyun</id>
<mirrorOf>*</mirrorOf>
<name>nexus-aliyun</name>
<url> https://maven.aliyun.com/repository/public </url>
<blocked>true</blocked>
</mirror>
Maven工程构建的各个环节:clean: 以前编译得到的旧文件 class 字节码文件删除compile:将 java 源程序编译成 class 字节码文件test:自动测试 , 例如,自动调用 junit 程序report:报告测试程序执行的结果package:应用打包 , 动态 Web 工程打成 war 包 ,java 工程打成 jar 包install: 是指将打包得到的文件复制到仓库中指定的位置deploy:将动态 Web 工程生成的 war 包复制到 Servlet 容器下,使其可以运行
#Maven实例--Jpress编译(Jpress-v5.1.0支持maven-3.5.4基于JDK8的编译,不支持maven- 3.9.2和JDK8, 但可以运行在JDK8或JDK11上)[root@Rocky-test1 ~]# yum -y install git #红帽系统需安装git工具[root@Rocky-test1 ~]# git clone https://gitee.com/JPressProjects/jpress.git #下载官方源码[root@Rocky-test1 ~]# cd jpress/ #进入 包含有pom.xml的路径[root@Rocky-test1 jpress]# mvn clean install package -Dmaven.test.skip=true #编译java程序,Dmaven.test.skip=true跳过测试并且不编译测试下的源代码[root@Rocky-test1 jpress]# ll starter-tomcat/target/ #在target目录下可找到编译完成的war包
total 122572
drwxr-xr-x 2 root root 86 Aug 14 13:47 classes
drwxr-xr-x 2 root root 28 Aug 14 13:47 maven-archiver
drwxr-xr-x 6 root root 86 Aug 14 13:47 starter-tomcat-5.0
-rw-r--r-- 1 root root 4459 Aug 14 13:47 starter-tomcat-5.0-classes.jar
-rw-r--r-- 1 root root 125501868 Aug 14 13:47 starter-tomcat-5.0.war#Maven实例--俄罗斯方块编译[root@Rocky-test1 ~]# git clone https://gitee.com/DJCDNL/blockvs.git
[root@Rocky-test1 ~]# cd blockvs/[root@Rocky-test1 blockvs]# mvn clean install package -Dmaven.test.skip=true[root@Rocky-test1 blockvs]# cd target/[root@Rocky-test1 target]# lltotal 12312
drwxr-xr-x 2 root root 6 Aug 14 14:57 archive-tmp
-rw-r--r-- 1 root root 3832667 Aug 14 14:56 Block_VS-1.0-SNAPSHOT.jar
-rw-r--r-- 1 root root 8770010 Aug 14 14:57 Block_VS-1.0-SNAPSHOT-jar-with-dependencies.jar
drwxr-xr-x 4 root root 30 Aug 14 14:56 classes
drwxr-xr-x 3 root root 25 Aug 14 14:56 generated-sources
drwxr-xr-x 2 root root 28 Aug 14 14:56 maven-archiver
drwxr-xr-x 3 root root 35 Aug 14 14:56 maven-status
6.2,Nexus安装
#安装Nexus需要先安装JDK8,服务器内存需在4G以上
root@ubuntu-test1:~# tar xvf nexus-3.54.1-01-unix.tar.gz -C /home/app/
root@ubuntu-test1:~# ln -s /home/app/nexus-3.54.1-01/bin/nexus /usr/local/sbin/
root@ubuntu-test1:~# vim /home/app/nexus-3.54.1-01/bin/nexus.rc #配置运行用户
run_as_user="root"root@ubuntu-test1:~# vim /home/app/nexus-3.54.1-01/bin/nexus.vmoptions #调整使用服务内存避免超出服务器内存上限
-Xms2048m
-Xmx2048mroot@ubuntu-test1:~# nexus start #启动nexus服务
WARNING: ************************************************************
WARNING: Detected execution as "root" user. This is NOT recommended!
WARNING: ************************************************************
Starting nexus
root@ubuntu-test1:~# nexus stop
root@ubuntu-test1:~# vim /lib/systemd/system/nexus.service[Unit]
Description=nexus service
After=network.target[Service]
Type=forking
LimitNOFILE=65536
ExecStart=/usr/local/sbin/nexus start
ExecStop=/usr/local/sbin/nexus stop
User=root
Restart=on-abort[Install]
WantedBy=multi-user.targetroot@ubuntu-test1:~# vim /home/app/nexus-3.54.1-01/bin/nexus #取消下行注释并添加本地JDK路径,JDK使用包安装时无需修改该行即可启动服务
INSTALL4J_JAVA_HOME_OVERRIDE=/home/app/jdk
root@ubuntu-test1:~# systemctl daemon-reloadroot@ubuntu-test1:~# systemctl enable --now nexus.service
root@ubuntu-test1:~# cat /home/app/sonatype-work/nexus3/admin.password
a9f3de32-54ae-446a-82fc-9bad96d0dc15#访问服务器IP:8081并使用admin和初始密码即可登入nexus并进行初始化配置
6.3,私有仓库搭建
默认仓库类型
hosted: 本地仓库,部署自己的构建,如公司的第三方库
proxy: 代理仓库,用于代理远程的公告仓库
group: 仓库组,用于合并多个hosted、proxy仓库
#修改默认Maven仓库源至阿里云,构建Maven仓库
#构建Yum仓库
#创建自定义存储存放仓库数据
root@ubuntu-test1:~# mkdir /home/blobs
#正式创建仓库
#构建Apt仓库,配置步骤与Yum仓库相同
#Yum仓库测试
[root@Rocky-test1 ~]# vim /etc/yum.repos.d/baseos.repo #替换仓库源URL
[baseos]
name=nexus.BaseOS
baseurl=http://10.0.0.161:8081/repository/blobs-yum-rocky8/
gpgcheck=0[root@Rocky-test1 ~]# yum repolist
repo id repo name
baseos nexus.BaseOS[root@Rocky-test1 ~]# yum -y install python3-rpm #安装软件测试
#Apt仓库测试
root@ubuntu-test1:~# vim /etc/apt/sources.list.d/original.list #替换仓库源URL
deb http://10.0.0.161:8081/repository/blobs-apt-ubuntu2004 focal multiverse
deb http://10.0.0.161:8081/repository/blobs-apt-ubuntu2004 focal-updates multiverse
root@ubuntu-test1:~# apt updateGet:1 http://10.0.0.161:8081/repository/blobs-apt-ubuntu2004 focal InRelease [265 kB]
Get:2 http://10.0.0.161:8081/repository/blobs-apt-ubuntu2004 focal-updates InRelease [128 kB]