CentOS8.1中搭建Nexus3服务器
今天做Java开发的同学应该都用过Maven,知道Maven中有仓库这个角色的存在,比如Maven官方中央仓库(http://repo1.maven.org/maven2)、国内阿里云中央仓库(http://maven.aliyun.com/nexus/content/groups/public),日常开发也经常从这些国内外的中央仓库中下载jar包(国外的仓库由于网络原因一般都非常慢,所以国内的一些公司提供了国际库的镜像仓库)。有些公司也会搭一个自己公司的私有仓库,一来可以统一管理全公司的jar包获取与下发,二来也方便自己公司开发的jar包的内部分发。今天就来讲一下Maven仓库管理器服务的搭建!Maven仓库管理器有很多,接下来要讲的就是这众多仓库管理器中的独秀——Nexus Repository Manager。如果你认真看过刚刚阿里云中央仓库的地址,你会发现其中也有一个nexus!没有错,阿里云中央仓库就是使用Nexus搭建的(新地址:https://maven.aliyun.com/repository/public)!
Nexus是Sonatype公司的一个产品,我们试着去打开它的官网首页发现很难打开的,但是它的官方帮助文档首页却能打开,里面有Nexus的产品帮助文档和与下载链接:
通读一遍官方帮助文档后,我们得到以下重要信息:
- 部署Nexus的服务器至少要有4个CPU(一个四核的CPU也可以)和至少8G的物理内存;
- 如果是Unix/Linux版本的Nexus包是不含JDK的,需要自行安装并配置好相应版本的JDK;
- Nexus在Unix/Linux上表现最佳;
- 在Unix/Linux上为了安全起见,不要使用root账号运行Nexus服务;
官方都建议将Nexus部署在Unix/Linux上,那我们就来在Linux上部署一下!
第一步:新建并配置好一台4核、8G内存和60G硬盘的CentOS8.1虚拟机(CentOS8.1的基本安装和配置);
第二步:安装JDK,可以使用包管理工具安装(例如yum包管理器),也可以使用二进制包手工安装:
- 通过yum包管理器安装JDK
可以先通过 # yum list java* 命令查看一下系统yum源识别到的JDK有哪些:
# yum list java* Last metadata expiration check: 0:59:24 ago on Mon 08 Jun 2020 09:44:52 PM CST. Available Packages java-1.8.0-openjdk.x86_64 1:1.8.0.252.b09-2.el8_1 AppStream java-1.8.0-openjdk-accessibility.x86_64 1:1.8.0.252.b09-2.el8_1 AppStream java-1.8.0-openjdk-demo.x86_64 1:1.8.0.252.b09-2.el8_1 AppStream java-1.8.0-openjdk-devel.x86_64 1:1.8.0.252.b09-2.el8_1 AppStream java-1.8.0-openjdk-headless.x86_64 1:1.8.0.252.b09-2.el8_1 AppStream java-1.8.0-openjdk-javadoc.noarch 1:1.8.0.252.b09-2.el8_1 AppStream java-1.8.0-openjdk-javadoc-zip.noarch 1:1.8.0.252.b09-2.el8_1 AppStream java-1.8.0-openjdk-src.x86_64 1:1.8.0.252.b09-2.el8_1 AppStream java-11-openjdk.x86_64 1:11.0.7.10-1.el8_1 AppStream java-11-openjdk-demo.x86_64 1:11.0.7.10-1.el8_1 AppStream java-11-openjdk-devel.x86_64 1:11.0.7.10-1.el8_1 AppStream java-11-openjdk-headless.x86_64 1:11.0.7.10-1.el8_1 AppStream java-11-openjdk-javadoc.x86_64 1:11.0.7.10-1.el8_1 AppStream java-11-openjdk-javadoc-zip.x86_64 1:11.0.7.10-1.el8_1 AppStream java-11-openjdk-jmods.x86_64 1:11.0.7.10-1.el8_1 AppStream java-11-openjdk-src.x86_64 1:11.0.7.10-1.el8_1 AppStream java-atk-wrapper.x86_64 0.33.2-6.el8 AppStream javapackages-filesystem.noarch 5.3.0-1.module_el8.0.0+11+5b8c10bd AppStream javapackages-tools.noarch 5.3.0-1.module_el8.0.0+11+5b8c10bd AppStream
发现都是openjdk系列的版本,因为openjdk开源免费,而Oracle JDK在jdk-8u201之后的版本就开始收费了~
如果确认使用openjdk的话(其实功能上与Oracle JDK相应的版本没啥区别),只要使用命令# yum -y install XXX 安装相应的版本就可以了:
# yum -y install java-1.8.0-openjdk.x86_64
由yum包管理工具会将JDK直接安装到 /usr/lib/jvm 目录下,并在/usr/bin目录中创建java可执行程序的软链接, 而/usr/bin目录是操作系统PATH变量中预设的值,所以装完之后就不需要再做环境变量配置就能使用了!
装完即可通过 # java -version查看一下是否安装成功:
# java -version openjdk version "1.8.0_252" OpenJDK Runtime Environment (build 1.8.0_252-b09) OpenJDK 64-Bit Server VM (build 25.252-b09, mixed mode)
可以看到,已经装好了!yum包管理工具安装JDK简单方便,但它是需要服务器能联网来下载JDK包的,如果服务器不能联网,那就得用事先下载好的离线二进制JDK包进行手工安装了!
一会我们再演示一下手工通过离线二进制包来安装JDK的方法,先将前面yum包管理工具安装的JDK卸载(参数最后的*号是匹配所有的):
# yum -y remove java-1.8.0-openjdk*
同样,卸载完后你也可以 # java -version查看一下是否真的卸载完成了:
# java -version -bash: /usr/bin/java: No such file or directory
#或者查看一下安装了那些JDK
yum list installed | grep java
- 手工通过离线二进制包来安装JDK
这次我们使用Oracle最后一个免费版的JDK(jdk-8u201)来做安装演示,先在服务器的 /usr/local 目录下创java目录:
# mkdir /usr/local/java
然后上传下载好的JDK包(jdk-8u201-linux-x64.tar.gz)到服务器的 /usr/local/java目录下,并使用 tar 命令解压:
# tar -vxf /usr/local/java/jdk-8u201-linux-x64.tar.gz -C /usr/local/java
解压完后,用vi或vim打开 /etc/profile 文件配置系统环境变量,在文件的最后新加三行:
export JAVA_HOME=/usr/local/java/jdk1.8.0_201 export CLASSPATH=$:CLASSPATH:$JAVA_HOME/lib/ export PATH=$PATH:$JAVA_HOME/bin
保存并退 /etc/profile 文件,接着使用 source 命令使配置生效:
# source /etc/profile
最后,同样可通过 # java -version查看一下是否安装完成:
# java -version java version "1.8.0_201" Java(TM) SE Runtime Environment (build 1.8.0_201-b09) Java HotSpot(TM) 64-Bit Server VM (build 25.201-b09, mixed mode)
第三步:将下载好的Linux版本的Nexus安装包(latest-unix.tar.gz)上传到服务器的 /opt 目录下(Linux服务器文件上传与下载、Linux系统目录说明);
第四步:使用 tar 命令解压 latest-unix.tar.gz ,得到 nexus-3.23.0-03和sonatype-work两个目录,前者为Nexus软件本身,后者为Nexus工作目录:
# tar -vxf /opt/latest-unix.tar.gz
第五步:新建nexus用户组和nexus用户,并授以其第四步中解压出来的Nexus相关目录的权限:
# groupadd nexus # useradd nexus -d /home/nexus -s /bin/sh -g nexus # chown -R nexus:nexus /opt/nexus-3.23.0-03 # chmod -R 750 /opt/nexus-3.23.0-03/ # chown -R nexus:nexus /opt/sonatype-work/ # chmod -R 750 /opt/sonatype-work/
第六步:配置Nexus以新建的nexus用户来运行服务(否则将以root账号运行),编辑Nexus的解压安装目录下的 bin/nexus.rc 运行配置文件,指明运行Nexus服务的用户:
# vim /opt/nexus-3.23.0-03/bin/nexus.rc run_as_user="nexus"
第七步:配置Nexus使用的JDK或JRE路径,该配置项的参数名为 INSTALL4J_JAVA_HOME_OVERRIDE ,它就在Nexus的可执行文件bin/nexus中 ,该文件非常大,不方便直接用vi或vim编辑目标参数项,所以先用grep命令筛选一下
# grep -i "INSTALL4J_JAVA_HOME_OVERRIDE" /opt/nexus-3.23.0-03/bin/nexus # INSTALL4J_JAVA_HOME_OVERRIDE= test_jvm "$INSTALL4J_JAVA_HOME_OVERRIDE"
从结果中可以看出就是被注释掉的那行 # INSTALL4J_JAVA_HOME_OVERRIDE= ,我们将其替换成去掉注释并带上参数值便可,但替换前我们得先备份一下(养成高风险操作前备份的习惯):
# cp /opt/nexus-3.23.0-03/bin/nexus /opt/nexus-3.23.0-03/bin/nexus.bak
确认备份好后,接着用sed命令以替换字符串的方式改变配置(sed参数字符串表达式里的分隔符有多种,比如%、#,要视情况用),并重新过滤INSTALL4J_JAVA_HOME_OVERRIDE参数相关内容,发现已经替换好了:
# sed -i "s%# INSTALL4J_JAVA_HOME_OVERRIDE=%INSTALL4J_JAVA_HOME_OVERRIDE=/usr/local/java/jdk1.8.0_201%g" /opt/nexus-3.23.0-03/bin/nexus
# grep -i "INSTALL4J_JAVA_HOME_OVERRIDE" /opt/nexus-3.23.0-03/bin/nexus INSTALL4J_JAVA_HOME_OVERRIDE=/usr/local/java/jdk1.8.0_201 test_jvm "$INSTALL4J_JAVA_HOME_OVERRIDE"
第八步:将Nexus服务配置为操作系统systemd类的服务:
使用命令 # vim /etc/systemd/system/nexus.service 创建Nexus服务单元配置文件,并填入以下配置信息,注意ExecStart和ExecStop的值是你自己的nexus可执行程序路径:
[Unit] Description=nexus service After=network.target [Service] Type=forking LimitNOFILE=65536 ExecStart=/opt/nexus-3.23.0-03/bin/nexus start ExecStop=/opt/nexus-3.23.0-03/bin/nexus stop User=nexus Restart=on-abort TimeoutSec=600 [Install] WantedBy=multi-user.target
第九步:重新载入 systemctl 控制器并启用nexus.service服务单元,最后尝试启动nexus.service服务(注意Nexus服务启动很花时间,要多等等):
# systemctl daemon-reload # systemctl enable nexus.service # systemctl start nexus.service
如果发现启动命令瞬间完成,也没有任何输出,可以到 /opt/sonatype-work/nexus3/log/ 目录看看是否有nexus.log日志文件生成,如果没有,那么可能是Nexus服务的PID文件无法写入的原因,Nexus服务的PID文件生成在系统的 /tmp 目录中,文件名的格式是下面的形式:
文件名前缀:"i4jdaemon_"
文件名后缀:是nexus可执行程序完整路径将斜杠替换为下划线形成的字符串,例如:opt_nexus_nexus-3.14.0-04_bin_nexus
最后形成的Nexus服务的PID文件名可能是这形式的 i4jdaemon__opt_nexus-3.23.0-03_bin_nexus
将该文件删除,再使用命令 # systemctl start nexus.service 重新尝试启动!
再次查看 /opt/sonatype-work/nexus3/log/ 中是否有nexus.log日志文件生成,如果有,那么查看下该文件的末尾(注意Nexus服务启动很花时间,要多等等):
# tail -f /opt/sonatype-work/nexus3/log/nexus.log
-------------------------------------------------
Started Sonatype Nexus OSS 3.23.0-03
-------------------------------------------------
如果能看到 “Started Sonatype Nexus OSS”字样(日常启动时也可能看到“state change RUNNING -> WAITING (OK)”),则表示Nexus服务启动成功了!默认的访问端口是8081!不要忘了将你使用的端口在防火墙中开放:
# firewall-cmd --add-port=8081/tcp --permanent success # firewall-cmd --reload
现在可以从外部宿主机访问一下我们的Nexus仓库管理器了:
首次访问会在登录框上面提示我们admin用户的密码保存的位置,该密码是系统生成的初始密码,后面用其登录后会立即要求修改密码,我们打开密码保存文件看看:
# cat /opt/sonatype-work/nexus3/admin.password 0901b086-a97f-4039-bc6d-0d6d561e7895
使用该密码登录,按着向导修改初始密码就可以了!
Nexus服务的默认访问端口由数据目录下的nexus属性配置文件($data-dir/etc/nexus.properties)的 application-port 配置项配置,而数据目录又由Nexus服务的JVM配置文件($install-dir/bin/nexus.vmoptions)中的-Dkaraf.data参数指定:
# ls /opt/nexus-3.23.0-03/bin/ contrib nexus nexus.bak nexus.rc nexus.vmoptions # cat /opt/nexus-3.23.0-03/bin/nexus.vmoptions -Xms2703m -Xmx2703m -XX:MaxDirectMemorySize=2703m -XX:+UnlockDiagnosticVMOptions -XX:+LogVMOutput -XX:LogFile=../sonatype-work/nexus3/log/jvm.log -XX:-OmitStackTraceInFastThrow -Djava.net.preferIPv4Stack=true -Dkaraf.home=. -Dkaraf.base=. -Dkaraf.etc=etc/karaf -Djava.util.logging.config.file=etc/karaf/java.util.logging.properties -Dkaraf.data=../sonatype-work/nexus3 -Dkaraf.log=../sonatype-work/nexus3/log -Djava.io.tmpdir=../sonatype-work/nexus3/tmp -Dkaraf.startLocalConsole=false # # additional vmoptions needed for Java9+ # # --add-reads=java.xml=java.logging # --add-exports=java.base/org.apache.karaf.specs.locator=java.xml,ALL-UNNAMED # --patch-module=java.base=lib/endorsed/org.apache.karaf.specs.locator-4.2.6.jar # --patch-module=java.xml=lib/endorsed/org.apache.karaf.specs.java.xml-4.2.6.jar # --add-opens=java.base/java.security=ALL-UNNAMED # --add-opens=java.base/java.net=ALL-UNNAMED # --add-opens=java.base/java.lang=ALL-UNNAMED # --add-opens=java.base/java.util=ALL-UNNAMED # --add-opens=java.naming/javax.naming.spi=ALL-UNNAMED # --add-opens=java.rmi/sun.rmi.transport.tcp=ALL-UNNAMED # --add-exports=java.base/sun.net.www.protocol.http=ALL-UNNAMED # --add-exports=java.base/sun.net.www.protocol.https=ALL-UNNAMED # --add-exports=java.base/sun.net.www.protocol.jar=ALL-UNNAMED # --add-exports=jdk.xml.dom/org.w3c.dom.html=ALL-UNNAMED # --add-exports=jdk.naming.rmi/com.sun.jndi.url.rmi=ALL-UNNAMED # # comment out this vmoption when using Java9+ # -Djava.endorsed.dirs=lib/endorsed
# ls /opt/sonatype-work/nexus3/etc/ logback nexus.properties # cat /opt/sonatype-work/nexus3/etc/nexus.properties # Jetty section # application-port=8081 # application-host=0.0.0.0 # nexus-args=${jetty.etc}/jetty.xml,${jetty.etc}/jetty-http.xml,${jetty.etc}/jetty-requestlog.xml # nexus-context-path=/ # Nexus section # nexus-edition=nexus-pro-edition # nexus-features=\ # nexus-pro-feature # nexus.hazelcast.discovery.isEnabled=true
$install-dir/bin/nexus.vmoptions配置文件和$data-dir/etc/nexus.properties配置文件是Nexus服务的主要配置文件,是调节Nexus服务功能和性能的地方,各参数的配置方式和作用请自行参考官方文档。