nexus s 4g:在 Linux 系统上安装 nexus 私库的相关理解和详细操作记录(主要依据官方文档) 2024-04-19 22:41:22 0 0 文章目录1 系统需求2 关于安装2.1 作为服务来运行2.2 配置内存2.3 修改 HTTP 端口2.4 修改 Context Path2.5 配置数据目录2.6 配置临时目录2.7 使用反向代理2.8 访问用户页面2.9 安装后检查清单3 Nginx 安装步骤4 Nexus 安装步骤5 Apache Maven 配置6 采坑问题 Nexus 官网文档地址:https://help.sonatype.com/repomanager3 Nexus 版本包括收费版 Nexus Repository Manager PRO 和 开源免费版 Nexus Repository Manager OSS,本文使用 开源免费 OSS 版。 当前最先版本:Latest Version: 3.27.0-03 本文中目录相关的引用说明 nexus tar 包文件解压之后,会有两个文件夹,分别$intall-dir 对应 nexus-3.27.0-03$data-dir 对应 sonatype-work/nexus3 1 系统需求wget https://sonatype-download.global.ssl.fastly.net/repository/downloads-prod-group/3/nexus-3.27.0-03-unix.tar.gz 执行时,4G 和公司网络均无法连接到下载地址,最后通过迅雷下载工具曲线实现下载,然后上传到服务器的。 官方建议新建并使用专用账户 nexus 来运行,不要使用 root 用户。useradd nexus Nexus 需要消耗比系统用户默认值更多的 file handler,在运行 nexus 之前需要将 open files descriptors 限制提高到 65536 或者更高。 在 /etc/security/limits.conf 添加如下内容,nexus 为用户IDnexus - nofile 65536 上面的修改,nexus 进程下次重启有效。 最小 CPUs 4 个,建议CPUs 8 个。 查看CPU信息:cat /proc/cpuinfo| grep "physical id"| sort| uniq| wc -l2cat /proc/cpuinfo | grep "cpu cores" | uniqcpu cores: 4cat /proc/cpuinfo| grep "processor"| wc -l8 必须设置 jvm heap memory 的最小值(-Xms)和最大值(-Xmx),且值大小必须相等,最大值不超过 4G。 内存设置通用指南:最小主机物理内存 8G堆内存最小值(-Xms)和最大值(-Xmx)必须相等最小堆内存 2703MB最大堆内存 <= 4G最小直接内存(-XX:MaxDirectMemorySize)大小 2703MB最小未分配物理/RAM内存应不小于总物理RAM的1/3,以允许进行虚拟内存交换最大堆内存 + 最大直接内存 <= 总物理内存 * 2/3 最大内存配置示例:Physical/RAM MemoryExample Maximum Memory Configuration8GB-Xms2703M -Xmx2703M -XX:MaxDirectMemorySize=2703M12GB-Xms4G -Xmx4G -XX:MaxDirectMemorySize=4014M16GB-Xms4G -Xmx4G -XX:MaxDirectMemorySize=6717M32GB-Xms4G -Xmx4G -XX:MaxDirectMemorySize=17530M64GB-Xms4G -Xmx4G -XX:MaxDirectMemorySize=39158M 2 关于安装 不建议安装并运行在用户目录,而是建议使用 /opt 目录。 第一步,解压下载好的 nexus-3.27.0-03-unix.tar.gz 到 /opt/nexus 目录;tar zxvf nexus-3.27.0-03-unix.tar.gz 第二步,在 nexus bin 目录下运行./nexus run 上面的命令会在当前 shell 启动 nexus 并显示日志输出。“Started Sonatype Nexus” 日志输出显示之后,就可以访问 nexus 服务了。CTRL + C 可以结束停止 nexus 服务。 除了上面的 run 命令,也可以使用 nexus 脚本的 start、stop、restart、force-reload 和 status 命令,让 nexus 作为后台应用服务来管理。 2.1 作为服务来运行 生产环境一般将 nexus 作为服务或者后台进程来运行,服务器重启时,nexus 也重启。nexus 发行包不包括运行服务的配置。与操作系统无关的三步如下:创建专用的操作系统用户,用于将 nexus 作为服务来运行;确认安装了正确的 Java 运行环境;配置服务确保其在操作系统启动时启动; 在 bin/nexus.rc 中指定专用用户:run_as_user="nexus" 创建 $intall-dir/bin/nexus 到 /etc/init.d/nexus 软链接sudo ln -s /opt/nexus-3.15.2-01/bin/nexus /etc/init.d/nexus 使用 chkconfig,使 init.d 中的初始化脚本运行 nexus 服务,运行下面的命令脚本激活服务cd /etc/init.dsudo chkconfig --add nexussudo chkconfig --levels 345 nexus onsudo service nexus start chkconfig 管理 /etc/rc[0-6].d 中的文件软链接,当操作系统重启或者切换运行级别的时候,这些软链接控制服务的启动和停止 2.2 配置内存打开 $install-dir/bin/nexus.vmoptions找到下面配置内存的行-Xms2703M-Xmx2703M-XX:MaxDirectMemorySize=2703M用如下格式修改配置项的值,数字size数值和字母单位(大小写均可) -Xmssize[g|G|m|M|k|K] -Xmxsize[g|G|m|M|k|K] -XX:MaxDirectMemorySize=size[g|G|m|M|k|K]保存文件,并确保 运行 nexus 服务的用户拥有文件权限和所有权 2.3 修改 HTTP 端口 默认端口是 8081,编辑 $data-dir/etc/nexus.properties 文件,修改配置项 application-portapplication-port=9081 2.4 修改 Context Path 编辑 $data-dir/etc/nexus.properties 文件,修改默认值 nexus-context-path=/nexus-context-path=/components/ 2.5 配置数据目录 我们可以在文件 $install-dir/bin/nexus.vmoptions 中配置新数据目录位置。相关配置项 -Dkaraf.data,-Djava.io.tmpdir,-Dkaraf.log 和 -XX:LogFile,例如-Dkaraf.data=/opt/sonatype-work/nexus3-Djava.io.tmpdir=/opt/sonatype-work/nexus3/tmp-XX:LogFile=/opt/sonatype-work/nexus3/log/jvm.log-Dkaraf.log=/opt/sonatype-work/nexus3/log 2.6 配置临时目录 Nexus 临时目录默认使用 java 虚拟机临时目录来存储重要的运行时文件。 建议临时目录设置在 nexus 数据目录中的 $data-dir/tmp,同时必须满足nexus 服务运行用户必须是文件拥有者并具有运行权限,否则启动 nexus 会报错;不要处理任何临时目录中的文件,尤其是在服务运行时;确保文件目录所在磁盘拥有 1GB 以上的剩余空间; 修改临时目录,打开并编辑 $install-dir/bin/nexus.vmoptions 文件,修改 -Djava.io.tmpdir=…/sonatype-work/nexus3/tmp 所在行的值,可以是绝对目录或者 $install-dir/bin 的相对目录。 2.7 使用反向代理 在公司的服务器上,出于某些原因,nexus 需要运行在反向代理后面,比如只统一开放 80 端口等。 nginx 反向代理配置示例http { proxy_send_timeout 120; proxy_read_timeout 300; proxy_buffering off; keepalive_timeout 5 5; tcp_nodelay on; server { listen *:80; server_name www.example.com; # allow large uploads of files client_max_body_size 1G; # optimize downloading files larger than 1G #proxy_max_temp_file_size 2G; location / { # Use IPv4 upstream address instead of DNS name to avoid attempts by nginx to use IPv6 DNS lookup proxy_pass http://127.0.0.1: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; } }} 2.8 访问用户页面 Nexus 拥有具有完全访问权限的管理用户 admin,初始密码在 $data-dir 目录的 admin.password 文件中。可以通过点击用户页面右上角的 Sign in 按钮来登录。 2.9 安装后检查清单修改 admin 密码 Nexus 在安装后启动时,为 admin 用户生成一个随机密码,写入 $data-dir 下的 admin.password 文件中。配置匿名访问修改管理员邮箱地址配置 SMTP 设置配置 HTTP 反向代理为服务器做备份设置 3 Nginx 安装步骤 下载和安装 pcre 到 /usr/local/src/,支持正则表达式,nginx core 和 rewrite 依赖wget https://jaist.dl.sourceforge.net/project/pcre/pcre/8.44/pcre-8.44.tar.gztar zxf pcre-8.44.tar.gz./configuremakemake install 下载和安装 zlib 到 /usr/local/src/,支持 header 压缩,nginx Gzip 依赖wget wget http://zlib.net/zlib-1.2.11.tar.gztar zxf zlib-1.2.11.tar.gz ./configure makemake install 下载安装包 nginx-1.18.0.tar.gz 到 /usr/local/src/ 解压安装包到 /usr/local/ 进入 /usr/local/nginx-1.18.0/./configure --sbin-path=/usr/local/nginx/nginx --conf-path=/usr/local/nginx/nginx.conf --pid-path=/usr/local/nginx/nginx.pid --with-pcre=../pcre-8.44 --with-zlib=../zlib-1.2.11 --with-http_ssl_module --with-stream --with-mailmakemake install 启动并验证 nginx 服务/usr/local/nginx/nginx 访问显示欢迎页面 4 Nexus 安装步骤 第一步,新建操作系统用户 nexususeradd nexus 查看用户所属组groups nexus 第二步,创建目录 /opt/nexus-work,并将目录拥有者修改 nexusmkdir /opt/nexus-workchown nexus:nexus /opt/nexus-work 第三步,切换到 nexus 用户,解压安装包到 /opt/nexus-work 下su nexus # 不是 su - nexustar zxf /usr/local/src/nexus-3.27.0-03-unix.tar.gz -C /opt/nexus-work 第四步,切换到用户 root,编辑 /etc/security/limits.conf,修改系统默认 open file descriptors 最大值nexus - nofile 65536 [nofile] - max number of open file descriptors 第五步,创建连接,编辑 /opt/nexus-work/nexus/bin/nexus.vmoptions# 进入目录 /opt/nexus-work/,创建 nexus -> nexus-3.27.0-03 连接ln -s nexus-3.27.0-03 nexus# 当前目录 /opt/nexus-work/nexus,编辑 bin/nexus.vmoptionsvim bin/nexus.vmoptions 编辑后的相关项配置内容如下,没有出现的项采用默认值-Xms2703m-Xmx2703m-XX:MaxDirectMemorySize=2703m-XX:LogFile=/opt/nexus-work/sonatype-work/nexus3/log/jvm.log-Dkaraf.data=/opt/nexus-work/sonatype-work/nexus3-Dkaraf.log=/opt/nexus-work/sonatype-work/nexus3/log-Djava.io.tmpdir=/opt/nexus-work/sonatype-work/nexus3/tmp 编辑 /opt/nexus-work/nexus/bin/nexus.rc,指定服务运行用户 nexus(带双引号)run_as_user="nexus" 第六步,新增配置文件 /opt/nexus-work/sonatype-work/etc/nexus.properties,添加如下配置application-port=9081nexus-context-path=/nexus3/ 第七步,配置 nginx 反向代理配置http { proxy_send_timeout 120; proxy_read_timeout 300; proxy_buffering off; keepalive_timeout 5 5; tcp_nodelay on; server { listen *:80; server_name 192.168.3.37; # allow large uploads of files client_max_body_size 1G; # optimize downloading files larger than 1G #proxy_max_temp_file_size 2G; location /nexus3 { # Use IPv4 upstream address instead of DNS name to avoid attempts by nginx to use IPv6 DNS lookup proxy_pass http://127.0.0.1:9081/nexus3; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } }} 第八步,配置 nexus 和 nginx 开机启动,并启动运行 使用 systemd 运行 nexus 服务,在 /etc/systemd/system/ 目录下创建文件 nexus.service,添加如下内容[Unit]Description=nexus serviceAfter=network.target [Service]Type=forkingLimitNOFILE=65536ExecStart=/opt/nexus-work/nexus/bin/nexus startExecStop=/opt/nexus-work/nexus/bin/nexus stopUser=nexusRestart=on-abortTimeoutSec=600 [Install]WantedBy=multi-user.target 给 nexus 添加 sudo 权限# 添加 write 权限chmod u+w /etc/sudoers# 编辑vim /etc/sudoers# 添加如下内容nexus ALL=(ALL) NOPASSWD: /usr/bin/systemctl# 保存并恢复权限状态chmod u-w /etc/sudoers [nexus@yxftest nexus-work]$ sudo systemctl enable nexus.service Created symlink from /etc/systemd/system/multi-user.target.wants/nexus.service to /etc/systemd/system/nexus.service. 使用下面的命令激活服务sudo systemctl daemon-reload# 设置开机启动sudo systemctl enable nexus.service# 启动服务sudo systemctl start nexus.service 使用 systemd 运行 nginx 服务,在 /etc/systemd/system/ 目录下创建文件 nginx.service,添加如下内容[Unit]Description=nginxAfter=network.target[Service]Type=forkingExecStart= /usr/local/nginx/nginxExecReload= /usr/local/nginx/nginx reloadExecStop= /usr/local/nginx/nginx quitPrivateTmp= true[Install]WantedBy=multi-user.target 设置开机启动systemctl enable nginx.servicesystemctl start nginx.service 【systemd】 字母 d 是守护进程 daemon 的缩写,自我理解是系统守护进程管理 启动 nexus 服务sudo systemctl start nexus.service 查看日志 /opt/nexus-work/sonatype-work/nexus3/log/nexus.log,启动之后最后会显示如下内容2020-09-23 10:39:24,946+0800 INFO [jetty-main-1] *SYSTEM org.sonatype.nexus.bootstrap.jetty.JettyServer - -------------------------------------------------Started Sonatype Nexus OSS 3.27.0-03------------------------------------------------- 第九步,访问 nexus http://192.168.3.37/nexus3,开始进行系统设置 在首页点击 Sign in 按钮进行登录 根据弹出框提示位置,查看 admin 初始密码,进行登录 向导 1/4,点击 Next 向导 2/4,修改 admin 帐号初始密码 向导 3/4,允许匿名访问,选中如图标示选项,Next 向导 4/4,完成,点击 Finish 第十步,添加阿里云 maven 代理仓库,依赖下载优先请求阿里云 maven 三种仓库类型proxy - 远程仓库的代理,当用户向这个仓库请求依赖包,它会先在本地查找,如果找不到的话,就会从远程仓库下载,然后返回给用户hosted - 宿主仓库,用户可以 deploy 到 hosted 仓库中,也可以手工上传依赖组件到 hosted 仓库里,在 远程代理仓库中获取不到的依赖组件包,就需要手工上传到 hosted 仓库里group - 仓库组,将 多个 proxy 或者 hosted 类型仓库聚合,对用户暴露统一的访问地址,使多个仓库可以通过同一个地址对外提供服务 现有仓库maven-central - maven 远程中心仓库代理(proxy),会从远程中心仓库中下载依赖maven-releases - 宿主仓库(hosted),只存储 release 版的文件,我们 deploy 自己项目的时候,会上传存储到该位置,供其余用户依赖使用maven-snapshots - 宿主仓库(hosted),和 maven-releases 类似,唯一不同的是该库只针对 snapshot 版本的操作maven-public - 仓库组(group),是多个仓库的组合,这里是 maven-central、maven-releases、maven-snapshots 三个仓库的组合,提供统一的对外访问地址,方便多个仓库同时对外提供服务 选择 maven2(proxy) 按照下图所示输入 自定义仓库名(Name)、阿里云 maven 库地址(Remote storage) 等 阿里云 maven 仓库地址:http://maven.aliyun.com/nexus/content/groups/public/ 最后点击 Create repository 按钮 第十一步,添加 3rd-party 仓库,用于上传第三方依赖组件包(公司购买的商业组件包,公共仓库中不存在的部分依赖包文件) 输入页面 1/2 输入页面 2/2 第十二步,将上面两步添加的阿里云maven代理仓库和第三方组件仓库添加到 maven-public 仓库组,通过统一的 url 对外提供访问服务 添加后调整顺序如下,保存 第十三步,根据需要添加用户和角色,来控制仓库的访问权限 添加 role nx-developer,赋予匿名权限、依赖组件包上传权限和3rd-party、maven-releases、maven-snapshots 三个仓库 add|browse|edit|read 权限,可以根据需要和实践进行调整 添加用户 yuandian,并分配 nx-anonymous 和 nx-devoloper 角色 nexus 是典型的给 role 赋予具体资源的权限,然后通过给 user 分配 role 来控制用户的资源的访问权限 nexus 配置和部署到此基本完成。 5 Apache Maven 配置 要结合 maven 访问部署的 nexus 服务,需要对 maven 的配置进行修改,配置如下<settings> <localRepository>/path/to/your/localRepository</localRepository> <servers><server> <!-- id 与 下面的 repository/mirror 的 id 匹配,username 和 password 为 nexus 服务的访问帐号 --> <id>nexus-xxx</id> <username>username</username> <password>password</password> </server> </servers> <mirrors><mirror> <!-- 此 id 与 server id 匹配,以便连接 mirror 时从 server 配置获取凭证 --> <id>nexus-xxx</id> <!-- * 表示对任何仓库的请求,都会统一重定向到配置的 url 指向的统一的 仓库组 --> <mirrorOf>*</mirrorOf> <url>http://192.168.3.37/nexus3/repository/maven-public/</url> <name>nexus-public</name> </mirror> </mirrors> <profiles> <profile> <id>nexus</id> <!-- 仓库 --> <repositories> <repository> <!-- 统一开启 仓库的 snapshot 功能,nexus-xxx 已被 mirror 通过 * 统一映射到 http://192.168.3.37/nexus3/repository/maven-public/,所以该处的 url 会被覆盖掉 --> <id>nexus-xxx</id> <url>http://nexus-xxx</url> <releases> <enabled>true</enabled> </releases> <snapshots> <enabled>true</enabled> </snapshots> </repository> </repositories> <!-- 插件仓库,配置同上 --> <pluginRepositories> <pluginRepository> <id>nexus-xxx</id> <url>http://nexus-xxx</url> <releases> <enabled>true</enabled> </releases> <snapshots> <enabled>true</enabled> </snapshots> </pluginRepository> </pluginRepositories> </profile> </profiles> <activeProfiles> <!-- 激活上面的 profile --> <activeProfile>nexus</activeProfile> </activeProfiles> </settings> 在项目 pom 文件中配置 maven,指定 release 和 snapshot 仓库地址<distributionManagement> <repository> <id>nexus-xxx</id> <name>Nexus Releases</name> <url>http://192.168.3.37/nexus3/repository/maven-releases</url> </repository> <snapshotRepository> <id>nexus-xxx</id> <name>Nexus Snapshot</name> <url>http://192.168.3.37/nexus3/repository/maven-snapshots</url> </snapshotRepository> </distributionManagement> 6 采坑问题 nexus 启动之后,报异常如下org.apache.http.conn.ConnectTimeoutException: Connect to sonatype-download.global.ssl.fastly.net:443 [sonatype-download.global.ssl.fastly.net/128.242.240.20] failed: connect timed outat org.apache.http.impl.conn.DefaultHttpClientConnectionOperator.connect(DefaultHttpClientConnectionOperator.java:151)at org.apache.http.impl.conn.PoolingHttpClientConnectionManager.connect(PoolingHttpClientConnectionManager.java:376)at org.apache.http.impl.execchain.MainClientExec.establishRoute(MainClientExec.java:393)at org.apache.http.impl.execchain.MainClientExec.execute(MainClientExec.java:236)at org.apache.http.impl.execchain.ProtocolExec.execute(ProtocolExec.java:186)at org.apache.http.impl.execchain.RetryExec.execute(RetryExec.java:89)at org.apache.http.impl.execchain.RedirectExec.execute(RedirectExec.java:110)at org.apache.http.impl.client.InternalHttpClient.doExecute(InternalHttpClient.java:185)at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:83)at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:108)at com.sonatype.nexus.plugins.outreach.internal.outreach.OutreachConnector.get(OutreachConnector.java:136)at com.sonatype.nexus.plugins.outreach.internal.outreach.SonatypeOutreach.remote(SonatypeOutreach.java:273)at com.sonatype.nexus.plugins.outreach.internal.outreach.SonatypeOutreach.getOutreachBundle(SonatypeOutreach.java:158)at com.sonatype.nexus.plugins.outreach.internal.outreach.SonatypeOutreach.getPageBundle(SonatypeOutreach.java:147)at com.sonatype.nexus.plugins.outreach.Outreach$getPageBundle$0.call(Unknown Source)at com.sonatype.nexus.plugins.outreach.internal.ui.OutreachComponent.readStatus(OutreachComponent.groovy:62)at com.sonatype.nexus.plugins.outreach.internal.ui.OutreachComponent$$EnhancerByGuice$$6d40061b.CGLIB$readStatus$6(<generated>)at com.sonatype.nexus.plugins.outreach.internal.ui.OutreachComponent$$EnhancerByGuice$$6d40061b$$FastClassByGuice$$30bfbcc8.invoke(<generated>)at com.google.inject.internal.cglib.proxy.$MethodProxy.invokeSuper(MethodProxy.java:228)at com.google.inject.internal.InterceptorStackCallback$InterceptedMethodInvocation.proceed(InterceptorStackCallback.java:76)at com.palominolabs.metrics.guice.ExceptionMeteredInterceptor.invoke(ExceptionMeteredInterceptor.java:23)at com.google.inject.internal.InterceptorStackCallback$InterceptedMethodInvocation.proceed(InterceptorStackCallback.java:78)at com.palominolabs.metrics.guice.TimedInterceptor.invoke(TimedInterceptor.java:26)at com.google.inject.internal.InterceptorStackCallback$InterceptedMethodInvocation.proceed(InterceptorStackCallback.java:78)at com.google.inject.internal.InterceptorStackCallback.intercept(InterceptorStackCallback.java:54)at com.sonatype.nexus.plugins.outreach.internal.ui.OutreachComponent$$EnhancerByGuice$$6d40061b.readStatus(<generated>)at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 解决办法 admin 登录 nexus,进入如下图页面 点击 Disable 按钮,将 Outreach:Management 状态 设为不可用 个人理解为访问部分的国外地址不可达,从而报超时错误,关了就不访问了 ~~~~~~~~ 已到底线 ~~~~~~~~ 收藏(0)