1 Nexus介绍
Nexus 是一个强大的 Maven 仓库管理器,它极大地简化了自己内部仓库的维护和外部仓库的访问。通常在公司内部会搭建私有的maven仓库, 来存储java编译过程中需要的依赖包. 初次编译时, maven仓库会从官网下载依赖包到本地, 这样经过几次编译后, 本地就会存储大部分的依赖包, 如果本地没有, 那么maven仓库会去官网进行下载.
一般来说, 在公司内部会有专门的编译服务器, 这些服务器的内存和cpu都是配置很高的, 在代码上线时, 开发把代码提交到gitlab, 再由运维人员在jenkins触发编译和代码上线的任务. 编译过程中, 编译服务器会去本地的maven仓库下载依赖包, 如果本地没有, 再去官网下载, 以此来加速编译的速度
2 Nexus部署
maven 官方仓库: http://repo.maven.apache.org
Nexus官方下载页面: https://help.sonatype.com/repomanager3/download/download-archives---repository-manager-3
环境:
Ubuntu-1804 10.0.0.139 8G 4C, 官方提示最少4个CPU
Maven 3.6.3 二进制
Nexus 3.31.1
2.1 安装jdk
root@Nexus:~# apt -y install openjdk-8-jdk
2.2 安装Nexus
root@Nexus:~# mkdir /apps
root@Nexus:~# cd /apps
root@Nexus:/apps# ls
nexus-3.31.1-01-unix.tar.gz
root@Nexus:/apps# tar xf nexus-3.31.1-01-unix.tar.gz
root@Nexus:/apps# ln -sv nexus-3.31.1-01 nexus
'nexus' -> 'nexus-3.31.1-01'
root@Nexus:/apps# ll
total 188388
drwxr-xr-x 4 root root 4096 Jun 30 15:59 ./
drwxr-xr-x 25 root root 4096 Jun 30 15:58 ../
lrwxrwxrwx 1 root root 15 Jun 30 15:59 nexus -> nexus-3.31.1-01/
drwxr-xr-x 10 root root 4096 Jun 30 15:59 nexus-3.31.1-01/
-rw-r--r-- 1 root root 192890245 Jun 30 15:56 nexus-3.31.1-01-unix.tar.gz
drwxr-xr-x 3 root root 4096 Jun 30 15:59 sonatype-work/
2.3 启动Nexus
root@Nexus:~# cd /apps/nexus
root@Nexus:/apps/nexus# ./bin/nexus --help
WARNING: ************************************************************
WARNING: Detected execution as "root" user. This is NOT recommended!
WARNING: ************************************************************
Usage: ./bin/nexus {start|stop|run|run-redirect|status|restart|force-reload}
2.3 通过Service文件启动
root@Nexus:/apps/nexus# vim /lib/systemd/system/nexus.service
[Unit]
Description=nexus service
After=network.target
[Service]
Type=forking
LimitNOFILE=65536
ExecStart=/apps/nexus/bin/nexus start
ExecStop=/apps/nexus/bin/nexus stop
User=nexus
Restart=on-abort
TimeoutSec=600
[Install]
WantedBy=multi-user.target
root@Nexus:/apps/nexus# useradd nexus -r
root@Nexus:/apps/nexus# id nexus
uid=999(nexus) gid=999(nexus) groups=999(nexus)
root@Nexus:/apps/nexus# chown -R nexus.nexus /apps/nexus
root@Nexus:/apps/nexus# chown -R nexus.nexus /apps/nexus/
root@Nexus:/apps/nexus# chown -R nexus.nexus /apps/sonatype-work/
root@Nexus:/apps/nexus# systemctl daemon-reload
root@Nexus:/apps/nexus# systemctl start nexus
root@Nexus:/apps/nexus# systemctl enable --now nexus
Created symlink /etc/systemd/system/multi-user.target.wants/nexus.service → /lib/systemd/system/nexus.service.
root@Nexus:/apps/nexus# ll /apps
total 188388
drwxr-xr-x 4 root root 4096 Jun 30 15:59 ./
drwxr-xr-x 25 root root 4096 Jun 30 15:58 ../
lrwxrwxrwx 1 nexus nexus 15 Jun 30 15:59 nexus -> nexus-3.31.1-01/
drwxr-xr-x 10 nexus nexus 4096 Jun 30 15:59 nexus-3.31.1-01/
-rw-r--r-- 1 root root 192890245 Jun 30 15:56 nexus-3.31.1-01-unix.tar.gz
drwxr-xr-x 3 nexus nexus 4096 Jun 30 15:59 sonatype-work/
root@Nexus:/apps/nexus# ss -ntl
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 50 0.0.0.0:8081 # 监听8081端口 0.0.0.0:*
LISTEN 0 128 127.0.0.53%lo:53 0.0.0.0:*
LISTEN 0 128 0.0.0.0:22 0.0.0.0:*
LISTEN 0 1 127.0.0.1:44679 0.0.0.0:*
LISTEN 0 128 [::]:22 [::]:*
oot@Nexus:/apps/nexus# lsof -i:8081
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
java 13729 nexus 905u IPv4 55904 0t0 TCP *:tproxy (LISTEN)
2.5 web界面登陆
- 第一次登陆后, 需要初始化Nexus, 并且通过本地文件获取密码
- 密码会保存在服务器本地, 因此, 需要管理员能连接到服务器获取密码
root@Nexus:/apps/nexus# cat /apps/sonatype-work/nexus3/admin.password
1b2753ec-1751-4749-b696-e1df2cc77b1e
图片.png
图片.png
图片.png
图片.png
- 允许匿名访问, 这样编译服务器在访问Nexus时就不需要提供用户和密码, 直接就可以拉去依赖包
2.6 验证默认仓库
图片.pngHosted:本地仓库,通常我们会部署自己的构建到这一类型的仓库,比如公司的第三方库. 是公司自己制作的包, 比如自己制作的rpm, 这些不需要依赖互联网上的包
Proxy:代理仓库,它们被用来代理远程的公共仓库,如 maven 中央仓库(官方
仓库)。 这些仓库会存储一部分依赖包, 如果本地没有, 会去官方仓库下载
Group:仓库组,用来合并多个 hosted/proxy 仓库,当你的项目希望在多个repository 使用资源时就不需要多次引用了,只需要引用一个 group 即可。
3. 使用Nexus构建私有yum仓库
3.1 Nexus仓库配置
配置 nexus 作为公司内网 yum 仓库,通过清华大学镜像安装包, 为企业内部服务器提供Zabbix的rpm包下载
图片.png 图片.png 图片.png 图片.png 图片.png- 初次访问仓库是没有资源的, 因为还没有镜像下来
3.2 配置本地服务器使用Zabbix仓库
环境: 10.0.0.237 CentOS-7
默认情况CentOS官网没有提供zabbix-server
[17:43:11 root@CentOS-7-1 ~]#yum -y install zabbix-server
Loaded plugins: fastestmirror
Determining fastest mirrors
* BaseOS: mirrors.163.com
BaseOS | 3.6 kB 00:00:00
epel | 4.7 kB 00:00:00
extras | 2.9 kB 00:00:00
(1/5): epel/group_gz | 96 kB 00:00:00
(2/5): BaseOS/primary_db | 6.1 MB 00:00:00
(3/5): epel/updateinfo | 1.0 MB 00:00:00
(4/5): extras/primary_db | 242 kB 00:00:00
(5/5): epel/primary_db | 6.9 MB 00:00:04
No package zabbix-server available.
Error: Nothing to do
- 添加repo文件
[17:43:23 root@CentOS-7-1 ~]#vim /etc/yum.repos.d/zabbix.repo
[Zabbix]
name=zabbix-repo-proxy
baseurl=http://10.0.0.139:8081/repository/zabbix-repo-proxy/
enabled=1
gpgcheck=0
- 再次安装, 此时CentOS会去Nexus下载Zabbix安装包, 但是Nexus本地也是没有的, 因此, 会去配置的远程仓库, 这里就是清华源的仓库去下载安装包, 缓存到本地, 并且返回给CentOS
[17:50:04 root@CentOS-7-1 ~]#yum -y install zabbix-server
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
* BaseOS: mirrors.163.com
BaseOS | 3.6 kB 00:00:00
Zabbix | 1.5 kB 00:00:00
epel | 4.7 kB 00:00:00
extras | 2.9 kB 00:00:00
Zabbix/primary | 53 kB 00:00:00
Zabbix 471/471
Resolving Dependencies
--> Running transaction check
---> Package zabbix-server-mysql.x86_64 0:4.0.32-1.el7 will be installed
--> Processing Dependency: fping for package: zabbix-server-mysql-4.0.32-1.el7.x86_64
--> Processing Dependency: libnetsnmp.so.31()(64bit) for package: zabbix-server-mysql-4.0.32-1.el7.x86_64
--> Processing Dependency: libOpenIPMIposix.so.0()(64bit) for package: zabbix-server-mysql-4.0.32-1.el7.x86_64
--> Processing Dependency: libiksemel.so.3()(64bit) for package: zabbix-server-mysql-4.0.32-1.el7.x86_64
--> Processing Dependency: libOpenIPMI.so.0()(64bit) for package: zabbix-server-mysql-4.0.32-1.el7.x86_64
--> Processing Dependency: libodbc.so.2()(64bit) for package: zabbix-server-mysql-4.0.32-1.el7.x86_64
--> Running transaction check
---> Package OpenIPMI-libs.x86_64 0:2.0.27-1.el7 will be installed
--> Processing Dependency: OpenIPMI-modalias = 2.0.27-1.el7 for package: OpenIPMI-libs-2.0.27-1.el7.x86_64
---> Package fping.x86_64 0:3.10-4.el7 will be installed
---> Package net-snmp-libs.x86_64 1:5.7.2-49.el7 will be installed
---> Package unixODBC.x86_64 0:2.3.1-14.el7 will be installed
---> Package zabbix-server-mysql.x86_64 0:4.0.32-1.el7 will be installed
--> Processing Dependency: libiksemel.so.3()(64bit) for package: zabbix-server-mysql-4.0.32-1.el7.x86_64
--> Running transaction check
---> Package OpenIPMI-modalias.x86_64 0:2.0.27-1.el7 will be installed
--> Processing Dependency: OpenIPMI for package: OpenIPMI-modalias-2.0.27-1.el7.x86_64
---> Package zabbix-server-mysql.x86_64 0:4.0.32-1.el7 will be installed
--> Processing Dependency: libiksemel.so.3()(64bit) for package: zabbix-server-mysql-4.0.32-1.el7.x86_64
--> Running transaction check
---> Package OpenIPMI.x86_64 0:2.0.27-1.el7 will be installed
---> Package zabbix-server-mysql.x86_64 0:4.0.32-1.el7 will be installed
--> Processing Dependency: libiksemel.so.3()(64bit) for package: zabbix-server-mysql-4.0.32-1.el7.x86_64
--> Finished Dependency Resolution
Error: Package: zabbix-server-mysql-4.0.32-1.el7.x86_64 (Zabbix)
Requires: libiksemel.so.3()(64bit)
You could try using --skip-broken to work around the problem
You could try running: rpm -Va --nofiles --nodigest
- 下载依赖包
http://springdale.math.ias.edu/data/puias/unsupported/7/x86_64/iksemel-1.4-6.sdl7.x86_64.rpm
[18:50:32 root@CentOS-7-1 ~]#yum -y install iksemel-1.4-6.sdl7.x86_64.rpm
[18:51:10 root@CentOS-7-1 ~]#yum -y install zabbix-server
- 检查仓库, 会发现rpm包已经被保存到本地了
- 数据保存位置
默认使用的是default的blob store, 因此, 会存到default/content目录下
root@Nexus:/apps/sonatype-work/nexus3/blobs/default/content#tree
图片.png
3.3 配置Nexus数据保存目录
生产环境一般都会给Nexus的数据目录挂载一个单独的存储, 这里假定把数据都放到/data目录下
- 创建blob store
nexus需要对数据目录有权限, 否则无法创建blob store
root@Nexus:~# chown -R nexus.nexus /data/
图片.png
存储目录也会自动创建
root@Nexus:~# ll /data
total 12
drwxr-xr-x 3 nexus nexus 4096 Jun 30 19:12 ./
drwxr-xr-x 25 root root 4096 Jun 30 15:58 ../
drwxr-xr-x 3 nexus nexus 4096 Jun 30 19:12 zabbix-rpm/
图片.png
- 配置zabbix仓库使用创建的存储
由于仓库创建后无法修改, 因此, 需要把之前创建的zabbix仓库删除, 重新创建, 指定使用新建的zabbix-rpm路径
图片.png 图片.png- 修改CentOS上的镜像地址, 因为这里我改了zabbix仓库的名字为zabbix-blob-rpm
[19:18:09 root@CentOS-7-1 ~]#vim /etc/yum.repos.d/zabbix.repo
[Zabbix]
name=zabbix-repo-proxy
baseurl=http://10.0.0.139:8081/repository/zabbix-blob-rpm/
enabled=1
gpgcheck=0
- 再次在CentOS安装软件测试
[19:19:49 root@CentOS-7-1 ~]#yum -y install zabbix-get
图片.png
- rpm包的存放位置
root@Nexus:/data/zabbix-rpm/content/vol-30/chap-26# cat a74c0206-4afd-4d80-a490-3368b76fcc59.properties
#2021-06-30 19:19:58,491+0800
#Wed Jun 30 19:19:58 CST 2021
@BlobStore.created-by=anonymous
size=307176
@Bucket.repo-name=zabbix-blob-rpm
creationTime=1625051998491
@BlobStore.created-by-ip=10.0.0.237
@BlobStore.content-type=application/x-rpm
@BlobStore.blob-name=zabbix-get-4.0.32-1.el7.x86_64.rpm
sha1=e3776ad6fab425eec08407cf10d541e01e692a75
4. Nexus数据备份
Nexus的数据不像业务数据不能丢失, 因为其数据都是从官方源镜像下来的, 因此, 即使丢失了, 下载此安装软件时, 重新下载一次即可
4.1 手动备份
- 只需要把blob store的存储目录打包即可, 配置文件中可以指定数据的存储目录
4.2 使用Nexus提供的备份机制
Nexus 中普通数据信息(安装包)和元数据(properties文件)是分开存储的,普通数据是保存在 blob 中,而元数据保存在数据库中,所以在备份的时候必须同时进行备份普通数据和元数据,才能在后期恢复数据的时候保证数据的最终完整性。
blob 数据:
普通数据信息在 Nexus 中是保存在 blob 中的,所以此部分数据必须进行备份,blob 的典型配置中,此目录对应着 Nexus 的数据目录的 blobs 子目录。
元数据:
元数据在 Nexus 中是在数据库中进行保存的,为了保证数据的完整性,Nexus需要同时将数据库中的数据进行导出和备份
4.2.1 创建备份任务
图片.png 图片.png- 需要备份的内容
4.2.1.1 备份数据库
图片.png 图片.png- 修改备份数据库的权限, nexus账号需要对该目录有权限, 否则无法执行数据写入
root@Nexus:~# chown nexus.nexus /opt/
图片.png
任务运行后, 可以查看运行结果
图片.pngroot@Nexus:~# tree /opt
/opt
└── nexus-backup # 这个目录就是备份设定指定的数据库备份目录
├── component-2021-06-30-19-52-22-3.31.1-01.bak
├── config-2021-06-30-19-52-22-3.31.1-01.bak
└── security-2021-06-30-19-52-22-3.31.1-01.bak
1 directory, 3 files
4.2.2.2 备份blob
- 创建任务
- 创建blob的备份路径
4.2.2.3 数据还原
如果需要还原数据, 只需要把备份文件拷贝到指定的数据目录, 重启服务即可
root@Nexus:/apps/nexus/bin# vim nexus.vmoptions
-Dkaraf.data=../sonatype-work/nexus3
网友评论