nexus 3.x 必须使用 java 11 或 17(不支持21+),需创建非root用户nexus并配置systemd服务,设limitnofile=65536及workingdirectory,启动后等待karaf.log出现“started jetty server”再访问。

安装 Nexus 前先确认 Java 版本是否匹配
Nexus 3.x 要求 Java 11 或 Java 17(官方明确不支持 Java 21+),装错版本会导致 java.lang.UnsupportedClassVersionError 或服务启动后立即退出。别信“有 JDK 就能跑”的直觉——查清楚 Nexus 版本对应的 JDK 要求,比反复重装快得多。
实操建议:
- 运行
java -version确认输出含11.0.或17.0.,且是64-bit Server VM - 若系统默认是 OpenJDK 8 或 21,用
update-alternatives --config java切换,或直接在nexus.rc中硬编码JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64 - 别用
apt install default-jdk—— Ubuntu 的这个包现在常指向 Java 17+,但某些 Nexus 3.52.x 小版本会因 JVM 参数报错,稳妥起见手动下载 Oracle/OpenJDK 17u 带hotspot的构建
解压后必须改 run_as_user 否则启动失败
Nexus 默认拒绝以 root 用户运行,即使你用 sudo ./nexus start,也会在日志里看到 ERROR [o.e.j.u.component.AbstractLifeCycle] FAILED Server@12345678: java.lang.RuntimeException: Cannot run Nexus as root。这不是警告,是硬性拦截,改配置前服务根本起不来。
实操建议:
- 创建专用用户:
sudo useradd -r -m -U -d /opt/nexus -s /bin/false nexus - 修改
/opt/nexus/bin/nexus.rc,取消注释并设为run_as_user="nexus" - 同步改权限:
sudo chown -R nexus:nexus /opt/nexus和sudo chown -R nexus:nexus /opt/sonatype-work(后者是数据目录,常被忽略) - 别把
nexus用户加进sudo组——它只需要读写自身目录,提权反而触发 SELinux 或 systemd 限制
用 systemd 托管时注意 LimitNOFILE 和工作目录
直接执行 ./nexus start 可能暂时跑起来,但重启后失效、日志不落盘、文件句柄打满就假死。systemd 是生产环境唯一靠谱的托管方式,但默认 unit 文件缺两个关键项:打开文件数限制和显式指定 WorkingDirectory。
实操建议:
- 写
/etc/systemd/system/nexus.service,其中必须包含:[Service]<br>LimitNOFILE=65536<br>WorkingDirectory=/opt/nexus/bin
-
Type=forking必须配PIDFile=/opt/nexus/bin/nexus.pid,否则 systemctl status 永远显示 inactive - 启动前务必运行
sudo systemctl daemon-reload,否则改了 unit 文件也无效 - 检查是否生效:
sudo systemctl show nexus | grep LimitNOFILE,输出应为LimitNOFILE=65536
首次访问页面卡在 “Initializing…” 不是网络问题而是端口没放开
浏览器打开 http://your-ip:8081 卡住,curl -v http://localhost:8081 也超时,第一反应常是防火墙——但更大概率是 Nexus 还没真正监听到端口。日志里搜 Started @ 行,没这行说明进程没完成初始化;有这行却连不上,才是防火墙或绑定地址问题。
实操建议:
- 盯紧
/opt/sonatype-work/nexus3/log/karaf.log,等出现Started Jetty Server和Started @时间戳再刷页面 - 若等 5 分钟还没这行,立刻看上一行的 ERROR,常见是
Port 8081 is already in use(Docker 或其他 Java 进程占了)或Permission denied writing to /opt/sonatype-work(权限没给够) - 确认监听:
sudo -u nexus ss -tlnp | grep :8081,输出应含java进程,不含则服务未真正跑起来 - 云服务器记得开安全组端口,别只关本地 firewalld
karaf.log 里的时间戳和 ERROR 行,比刷新浏览器有用十倍。











