JiaHe

相遇即是缘

Nexus

手动安装

Download Archives - Repitory Manager 3 (sonatype.com)

从链接中下载安装包后解压到/opt

最后得到的目录为

  • sonatype-work
  • nexus-3.xx.x

重命名nexus-3.xx.xnexus3

cd /opt
# 如果下载失败,就手动下载,然后上传到服务器
wget https://download.sonatype.com/nexus/3/nexus-3.67.1-01-java8-unix.tar.gz
tar -zxf nexus-3.67.1-01-java8-unix.tar.gz
mv nexus-3.67.1-01 nexus3

非root运行

useradd nexus
passwd nexus #密码也是nexus
chown -R nexus:nexus /opt/nexus3
su nexus #切换用户

修改配置

# 可以修改端口和访问路径
vim /opt/nexus3/etc/nexus-default.properties

# 可以修改jvm参数,内存不足的可以在这里修改
vim /opt/nexus3/bin/nexus.vmoptions

查看初始密码

# 启动后查看这个文件获取登录密码,用户名默认为admin
cat /opt/sonatype-work/nexus3/admin.password

前台运行

./nexus run

使用该 run 命令启动存储库管理器将使其在当前 shell 中运行并显示日志输出。可以在相应的控制台上停止正在 CTRL+C 运行的应用程序。

一旦日志显示消息“已启动Sonatype Nexus”,就可以访问该应用程序。

后台运行

nexus 脚本可用于使用 startstoprestartforce-reload status 命令将存储库管理器作为 OSX 和 Unix 上的后台应用程序进行管理。

要启动存储库管理器并在后台运行它,请执行以下操作:

./nexus start

在后台运行时,所有日志记录都将转到应用程序日志文件。

要停止存储库管理器在后台运行,请执行以下操作:

./nexus stop

Docker安装

https://hub.docker.com/r/sonatype/nexus3/

默认用户是 admin ,唯一生成的密码可以在卷内 admin.password 的文件中找到。有关卷的信息,请参阅持久性数据。

服务可能需要一些时间(2-3 分钟)才能在新容器中启动。您可以跟踪日志以确定Nexus何时准备就绪:

docker logs -f nexus

Nexus的安装目录是 /opt/sonatype/nexus

持久性目录 /nexus-data ,用于配置、日志和存储。此目录需要可由 Nexus 进程写入,该进程以 UID 200 的形式运行。

内存分配

有一个环境变量用于将 JVM 参数传递给启动脚本

  • INSTALL4J_ADD_VM_PARAMS ,传递给 Install4J 启动脚本。默认值为 -Xms2703m -Xmx2703m -XX:MaxDirectMemorySize=2703m -Djava.util.prefs.userRoot=${NEXUS_DATA}/javaprefs

这可以在运行时进行调整:

docker run -d -p 8081:8081 --name nexus -e INSTALL4J_ADD_VM_PARAMS="-Xms2703m -Xmx2703m -XX:MaxDirectMemorySize=2703m -Djava.util.prefs.userRoot=/some-other-dir" sonatype/nexus3

特别值得注意的是, -Djava.util.prefs.userRoot=/some-other-dir 可以设置为持久路径,如果容器重新启动,该路径将保持已安装的Sonatype Nexus存储库许可证。

在决定分配多少堆和直接内存时,请务必检查内存要求。

另一个环境变量可用于控制 Nexus 上下文路径

  • NEXUS_CONTEXT ,默认为 /

这可以在运行时提供:

docker run -d -p 8081:8081 --name nexus -e NEXUS_CONTEXT=nexus sonatype/nexus3

数据持久化

使用 Docker 处理持久存储需求有两种通用方法。有关更多信息,请参阅管理容器中的数据。

  1. 使用 Docker 卷。由于 docker 卷是持久性的,因此可以专门为此目的创建卷。这是推荐的方法。
docker volume create --name nexus-data
  1. 挂载主机目录作为卷。这是不可移植的,因为它依赖于在主机上具有正确权限的现有目录。但是,在某些情况下,当需要将此卷分配给某些特定的底层存储时,它可能很有用。
mkdir /some/dir/nexus-data && chown -R 200 /some/dir/nexus-data

docker run -d -p 8081:8081 --name nexus -v /some/dir/nexus-data:/nexus-data sonatype/nexus3
version: '3.9'
services:
nexus:
image: sonatype/nexus3:latest
container_name: nexus3
restart: always
ports:
- 10240:8081
volumes:
- nexus-data:/nexus-data

迁移和备份

Linux
  • 仓库迁移

Nexus的构件仓库都保存在sonatype-work目录中,该目录的位置由nexus/bin/nexus.vmoptions配置文件指定。仓库迁移需要两个过程:备份和还原。

  • 备份仓库

将sonatype-work文件夹整体备份即可。

  • 还原仓库

将备份好的sonatype-work文件拷贝到新的服务器中。然后修改nexus/bin/nexus.vmoptions配置文件,重新指定仓库的目录。

Windows
  • 仓库迁移

Nexus的构件仓库都保存在sonatype-work目录中,该目录的位置由bin/nexus.vmoptions配置文件指定(Dkaraf.data)。仓库迁移需要两个过程:备份和还原

  • 备份仓库

sonatype-work文件夹整体备份即可。

  • 还原仓库

将备份好的sonatype-work文件拷贝到新的服务器中。然后修改bin/nexus.vmoptions配置文件,重新指定仓库的目录。

问题报错

Return code is: 413, ReasonPhrase: Request Entity Too Large.

  1. 可能是因为用了nginx反向代理,默认的请求体大小有限制,可以修改client_max_body_size大小。

Failed to deploy artifacts 部署文件失败

Failed to transfer file 文件传输失败

with status code 400 400部署异常

401 Unauthorized 未经授权的

以上几种错误可能是

  1. 项目pom.xml文件distributionManagement标签的id和maven配置文件setting.xmlserver的id没有保持一致

  2. 如果没有开启匿名访问,则需要在settings.xml中配置server,username和password

  3. distributionManagement下url的路径名称写错了,需要与nexus中创建的hosted类型的maven仓库名一模一样

Invalid maven-metadata.xml GAV

  1. 最后我发现是groupId写错了,不小心多打了一个点

从远端下载jar失败,报错401。

  1. server下的id要与mirror中的id保持一致。

HTTPS 配置

nginx反向代理

先生成证书和密钥

openssl req \
-newkey rsa:4096 -nodes -sha256 \
-keyout nexus.jiahe.com.key \
-x509 -days 36500 \
-out nexus.jiahe.com.crt

添加nginx配置

/etc/nginx/conf.d/nexus.conf
server {
listen 80;
listen 443 ssl;
server_name nexus.jiahe.com;
ssl_certificate /etc/nginx/conf.d/certs/nexus.jiahe.com.crt;
ssl_certificate_key /etc/nginx/conf.d/certs/nexus.jiahe.com.key;
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers ECDH:AESGCM:HIGH:!RC4:!DH:!MD5:!3DES:!aNULL:!eNULL;
ssl_prefer_server_ciphers on;
location / {
proxy_pass http://192.168.56.32:8081;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto "https";
client_max_body_size 300M;
}
}

防火墙开放https

firewall-cmd --add-service=https --permanent --zone=public
firewall-cmd --reload

客户端添加hosts

192.168.56.32 nexus.jiahe.com

直接访问

官方文档有说明 https://help.sonatype.com/en/configuring-ssl.html#serving-ssl-directly

Docker仓库 HTTPS访问

  1. 使用openssl生成证书和密钥
cd /etc/nginx/conf.d
git clone git@github.com:iamxiaojianzheng/ssl.git
cd ssl
# 生成证书、密钥、根证书
./gen.cert.sh docker.nexus.jiahe.com
# docker.nexus.jiahe.com.bundle.crt
# docker.nexus.jiahe.com.crt
# docker.nexus.jiahe.com.key.pem
# root.crt
  1. 在nginx中添加关于该域名的ssl配置
server {
listen 80;
listen 443 ssl;
server_name docker.nexus.jiahe.com;

ssl_certificate /etc/nginx/conf.d/ssl/out/docker.nexus.jiahe.com/docker.nexus.jiahe.com.crt;
ssl_certificate_key /etc/nginx/conf.d/ssl/out/docker.nexus.jiahe.com/docker.nexus.jiahe.com.key.pem;

ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers ECDH:AESGCM:HIGH:!RC4:!DH:!MD5:!3DES:!aNULL:!eNULL;
ssl_prefer_server_ciphers on;

location / {
proxy_pass http://192.168.56.31:8082;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto "https";
client_max_body_size 300M;
}
}
  1. 配置根证书到docker
mkdir -p /etc/docker/certs.d
# 注意路径中的域名
ln -s /etc/nginx/conf.d/ssl/out/docker.nexus.jiahe.com/root.crt /etc/docker/certs.d/docker.nexus.jiahe.com/root.crt
  1. 验证是否可以成功访问
docker login -u admin -p admin docker.nexus.jiahe.com

# Login Succeeded 这个提示说明成功了

tls: failed to verify certificate: x509: certificate is valid for *.jiahe.com, jiahe.com, not docker.nexus.jiahe.com

这个报错就是说 用ssl生成的时候要写具体的域名,不要只写一级域名 例如 jiahe.com

tls: failed to verify certificate: x509: certificate signed by unknown authority

这个报错大概率就是 /etc/docker/certs.d/docker.nexus.jiahe.com/root.crt 这个文件有问题

可以尝试使用以下方式获取根证书

# 注意修改成你自己的域名
echo -n | openssl s_client -showcerts -connect docker.nexus.jiahe.com:443 2>/dev/null | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > /etc/docker/certs.d/docker.nexus.jiahe.com/root.crt