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的产品帮助文档和与下载链接:

  通读一遍官方帮助文档后,我们得到以下重要信息:

  1. 部署Nexus的服务器至少要有4个CPU(一个四核的CPU也可以)和至少8G的物理内存;
  2. 如果是Unix/Linux版本的Nexus包是不含JDK的,需要自行安装并配置好相应版本的JDK;
  3. Nexus在Unix/Linux上表现最佳;
  4. 在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服务功能和性能的地方,各参数的配置方式和作用请自行参考官方文档。

posted @ 2020-06-09 01:23  岁月已走远  阅读(1415)  评论(0编辑  收藏  举报