百人共用企业maven私服nexus迁移搭建手记

标签: 架构研究 nexus | 发表时间:2013-11-01 18:35 | 作者:54chen
出处:http://www.54chen.com

以下内容由 [五四陈科学院]提供

nexus

三年前,小米的第一个nexus(版本1.8.0)在一台dell的办公机上安装完成。域名为http://www.a.com。

三年后,a.com时不时已经慢得不行了。特别一到周一,大家都在update snapshot的时候,完全陷入一种无尽的痛苦中。

然后弄来了一台专业server做这事情,域名为http://www.b.com。版本到官网一看,已经2.64了。日新月异!

看升级文档顿时没了兴趣考虑升级,全新从零安装。

最后的办法是,在新机器上安装新的,把老的仓库挑出来设置为proxy类型。然后启用了ldap,同时保障大家都有deploy权限的同时,最大保障大家的密码不明文出现,同时通过代理ngx来限制最大上传的包,同时规定了snapshot的使用规则,防止在线上使用snapshot。以下是详细记录:

一、下载安装nexus和配置nginx

找个磁盘分区不小的:

wget http://sxrelease.n.miliao.com/nexus-2.6.4-02-bundle.zip

unzip nexus-2.6.4-02-bundle.zip

bin/nexus start

然后就能用了。http://www.a.com:8081已经启动了。当然了,如果还不能访问,应该是iptables在捣乱,试一下iptables -F。

[nginx安装忽略]

然后再在此机器上配置一个nginx代理到8081端口上。只举是为了:1.分担jetty的访问压力,毕竟公司人已经越来越多了。2.好做后续更多的事情。

server {
listen       80;
server_name  b.com;
location / {
rewrite ^/(.*)$  http://www.b.com/nexus/$1  permanent;
}
access_log  logs/nexus.access.log  main;
location /nexus {
proxy_pass         http://127.0.0.1:8081;
proxy_redirect     off;
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_read_timeout  5m;
client_max_body_size       30m;
}
}
server {
listen       443;
server_name  b.com;
ssl on;
ssl_certificate ../ssl/b.com.crt;
ssl_certificate_key ../ssl/b.com.key;
....

配置中,启用了443的https代理,有安全意识的工程师使用ldap的时候传输密码要安全一点。

proxy_read_timeout设置5分钟,是因为在下载包时,有可能需要去国外拉一些没见过的包,设长一点以防出现504。

client_max_body_size设置30m,如果再有巨大的奇怪包要deploy,不这么容易了,用来防止不明真相的群众往maven库里传乱七八糟的东西。

二、设置nexus

第一个设置,为了防止仓库爆仓。

login->scheduled tasks->add,添加一个定时清理目录的计划任务即可。最后一个选项“remove if released”需要慎重,平时开发可能不是特别正规的时候可能会snapshot和release都需要。

第二个设置,打开LDAP支持,让每个人都有权限。

login->security->ldap configuration,填写各种惨无人道的ldap参数,[此处需要求助IT部门],然后security->roles->add->External Role Mapping,Realm选择LDAP,Role里如果没有数据,说明ldap没设置好,Role里选择一个组,点击create mapping。

然后在configuration中选择add,添加两个权限,一个是Nexus deployment role,一个是All maven repositories (Full control)。

然后在对应组的小伙伴们就有权限了。

三、设置本地settings.xml

把原来的settings文件的url从a.com改为b.com,普通的小伙伴即可使用新的仓库了。

要发包的小伙伴,因为ldap用户名密码明文写在文件里不好,于是就用下面的办法:

step 1.先随意定义一个种子

 localhost:54chen 54chen$ mvn --encrypt-master-password 123asdadfafdadf
 {BHe/qKN8q30HBG3bAGbYLOVLnAqVRkzjb9/7yWs+Ks0=}
 vim ~/.m2/settings-security.xml

写入内容:

 <?xml version="1.0" encoding="UTF-8"?>
<settingsSecurity>
   <master>{BHe/qKN8q30HBG3bAGbYLOVLnAqVRkzjb9/7yWs+Ks0=}</master>
</settingsSecurity>

step 2.最终生成

mvn --encrypt-password 你的邮箱密码
{RxLx1asdfiafrjIHfXZDadfwveda23avsdv=}

然后修改:

vim ~/.m2/settings.xml
<server>
     <id>internal</id>
     <username>54chen</username>
     <password>{RxLx1asdfiafrjIHfXZDadfwveda23avsdv=}</password>
</server>

当然了,mvn的版本要在2.1.0以上才行。

然后对deploy过程中明文传输有顾虑的小伙伴,直接上https即可。

四、在a.com中存在的包,在b.com中没有怎么办?

其实很简单,先在a.com中定位404的包在什么repo中,复制下来在a中的repo位置,在b.com中新加一个repo,类型为proxy,同时将remote storage location写成a的。同时, 单击public repositories,调整刚加的repo到ordered repo中去,即可。

[后记]

标题有点大,解释一下,百人共用的保障,主要还是在nginx上,挡这一层之后,可以做很多事情,比如再加点cache之类的,实际情况下,所有用户减少过度的snapshot使用,也有一定帮助。



想快点找到作者也可以到Twitter上留言: @54chen
或者你懒得带梯子上墙,请到新浪微博: @54chen

相关 [企业 maven 私服] 推荐:

百人共用企业maven私服nexus迁移搭建手记

- - 五四陈科学院-坚信科学,分享技术
以下内容由 [五四陈科学院]提供. 三年前,小米的第一个nexus(版本1.8.0)在一台dell的办公机上安装完成. 域名为http://www.a.com. 三年后,a.com时不时已经慢得不行了. 特别一到周一,大家都在update snapshot的时候,完全陷入一种无尽的痛苦中. 然后弄来了一台专业server做这事情,域名为http://www.b.com.

maven学习之maven与eclipse集成

- - ITeye博客
    在上一篇博文中讲到了maven的配置,今天要讲maven与eclipse的集成. 现在在java开发中,eclipse占据了绝大部分的市场份额. 其他的关于NetBeans,IDEA中的关于maven的配置,读者可参阅相关资料. (注:关于IDEA,据说是款非常强大的集成开发环境,但是据说对svn的支持不是很好,道听途说而已).

maven工程下整合spring+mybatis+freemarker

- - CSDN博客架构设计推荐文章
博客地址:http://zhengyinhui.com/?p=142. 由于工作主要是前端开发,做后端的项目比较少,最近自己做个项目,发觉好多的都忘了,这里写篇博客整理下maven工程下整合spring+mybatis+freemarker相关内容. 新建个Archetype为maven-archetype-webapp的maven项目(安装maven插件:http://download.eclipse.org/technology/m2e/releases),在pom文件添加相关依赖:.

Maven最佳实践:划分模块

- - 企业架构 - ITeye博客
“分天下为三十六郡,郡置守,尉,监” —— 《史记·秦始皇本纪》. 所有用Maven管理的真实的项目都应该是分模块的,每个模块都对应着一个pom.xml. 它们之间通过继承和聚合(也称作多模块,multi- module)相互关联. 我们明明在开发一个项目,划分模块后,导入Eclipse变成了N个项目,这会带来复杂度,给开发带来 不便.

从Maven仓库中导出jar包

- - 企业架构 - ITeye博客
从Maven仓库中导出jar包:进入工程pom.xml 所在的目录下,. 输入以下命令:mvn dependency:copy-dependencies -DoutputDirectory=lib. 更简单的  mvn dependency:copy-dependencies    会导出到target\dependency 下面.

Maven 3 入门 -- 核心概念

- - 开源软件 - ITeye博客
例如上篇helloworld的pom.xml配置文件中的. 其实就是坐标,那么Maven的坐标元素包括groupId、artifactId、version、packaging、classifier. 当一个项目通过依赖,插件或者父项目引用与另外一个项目关联的时候,Maven通过坐标来精确定位一个项目.

简单的Maven模块结构

- - 研发管理 - ITeye博客
简单的Maven模块结构是这样的:. 上述简单示意图中,有一个父项目(app-parent)聚合很多子项目(app-util, app-dao, app-service, app-web). 每个项目,不管是父子,都含有一个pom.xml文件. 而且要注意的是,小括号中标出了每个项目的打包类型. 父项目是pom,也只能是pom.

maven导出项目依赖的jar包

- - 互联网 - ITeye博客
在进行项目部署时,需要将maven项目所依赖的jar导出到指定目录,本文讲解如何导出项目依赖的jar包. 一、导出到默认目录 targed/dependency .     从Maven项目中导出项目依赖的jar包:进入工程pom.xml 所在的目录下,执行如下命令:.        或在eclipse中,选择项目的pom.xml文件,点击右键菜单中的Run As,见下图红框中,在弹出的Configuration窗口中,输入  dependency:copy-dependencies 后,点击运行.

Maven使用archetype生成项目

- -
Archtype指项目的骨架, Maven中的 maven-archetype-plugin插件使用户可以方便的生成所需的项目骨架.. ###1.命令行调用maven插件. 如果不加任何参数,命令窗口显示的会有上千中项目骨架可够选择,我们可以使用 -DarchetypeCatalog, -Dfilter选择过滤项目骨架,参数赋值的格式跟JAVA设置系统属性一样 -D=.

eclispe中对maven工程进行本地debug

- - ITeye博客
1、在eclipse安装了m2eclipse插件,并在工程的pom.xml中配置好maven-tomcat-plugin后,单击Eclipse菜单“Run”中的“Run Configurations”. 2、在弹出的对话框中的左侧树中找“到Maven Build”,在其上点击右键并单击“New”. 3、在右侧的“Name”一栏填入自定义的名称.