我正在尝试通过 Nginx 反向代理提供 Nexus3 Repo Manager,但它仅提供索引标记。
我已经在 Azure RHEL (SELinux) 实例上设置了 Sonatype Nexus 3 存储库管理器。我一直试图将 Nginx(在同一个 RHEL 实例上)设置为 Nexus 的反向代理(并用作 SSL 端点),将来用于其他服务。
据我所知,这是一个相当常见的设置,所以我很惊讶我找不到任何有同样问题的人。(因此我想我一定是做了一些非常愚蠢的事情。)
我在 Azure 和 RHEL 实例上打开了端口 59906。Nexus UI 在单独启动时正常运行。当我在以下网址浏览时,它可以正确呈现http://nexus.mydomain.com:59906
然后我将 Nexus 更改为端口 59907,并将 Nginx 设置为监听端口 59906,将 proxy_pass 设置为 localhost:59907。现在,如果我尝试浏览该网站,我会看到 3 张损坏的图片、文本“正在初始化...”和一个空的 iframe(看起来索引标记按预期提供)。当我查看浏览器的“开发人员工具”->“网络”选项卡时,Chrome 报告除初始域之外的所有资源都加载失败...MS Edge 报告所有资源都获得了 200 OK 响应,但显示相同的无效图片、文本和空的 iframe。Firefox 显示资源没有状态,但在加载时间中有一个红条,并且在栏上有一个工具提示,指出它们已被阻止。据我了解,这表明浏览器打开了太多连接,正在等待一个连接空闲。一些资源也有一个 DNS 解析栏。
nginx 用户属于 nexus 组,因此权限应该不是问题。我已启用 SE Linux httpd_can_network_connect 标志,以允许 nginx 进程连接到 Nexus 套接字。
所有资源都有以下基本 URL: http://nexus.mydomain.com/static/rapture/resources/ 这与我在没有 Nginx 代理的情况下运行 Nexus 时的情况相同。
我尝试过使用conf.d
和sites-available
+sites-enabled
技术来管理 Nginx 配置。正如您在下文中看到的那样nginx.conf
,我目前已conf.d
评论使用它们来sites-enabled
代替。
nginx.conf
user nginx;
worker_processes 1;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
index index.html index.htm index.php;
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
#tcp_nopush on;
keepalive_timeout 65;
#gzip on;
# include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
}
这是我所拥有的配置sites-available
,sites-enabled
包含指向它的符号链接。
nexus.conf
server {
listen *:59906;
server_name nexus.mydomain.com;
error_log /var/log/nginx/error.log debug;
location / {
proxy_pass http://localhost:59907/;
proxy_set_header Host $host;
proxy_read_timeout 90s;
proxy_connect_timeout 90s;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Host "nexus.mydomain.com";
proxy_set_header X-Forwarded-Proto $scheme;
}
}
Nexus 的 nexus.properties 如下所示:
# Jetty section
application-port=59907
# application-host=127.0.0.1
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的jetty-http.xml是这样的:
<Call name="addConnector">
<Arg>
<New id="httpConnector" class="org.eclipse.jetty.server.ServerConnector">
<Arg name="server"><Ref refid="Server"/></Arg>
<Arg name="acceptors" type="int"><Property name="jetty.http.acceptors" default="-1"/></Arg>
<Arg name="selectors" type="int"><Property name="jetty.http.selectors" default="-1"/></Arg>
<Arg name="factories">
<Array type="org.eclipse.jetty.server.ConnectionFactory">
<!--<Item>
<New class="org.eclipse.jetty.server.ProxyConnectionFactory"/>
</Item>-->
<Item>
<New class="org.sonatype.nexus.bootstrap.jetty.InstrumentedConnectionFactory">
<Arg>
<New class="org.eclipse.jetty.server.HttpConnectionFactory">
<Arg name="config">
<Ref refid="httpConfig"/>
</Arg>
</New>
</Arg>
</New>
</Item>
</Array>
</Arg>
<Set name="host"><Property name="application-host" /></Set>
<Set name="port"><Property name="application-port"/></Set>
<Set name="idleTimeout"><Property name="jetty.http.timeout" default="30000"/></Set>
<Set name="soLingerTime"><Property name="jetty.http.soLingerTime" default="-1"/></Set>
<Set name="acceptorPriorityDelta"><Property name="jetty.http.acceptorPriorityDelta" default="0"/></Set>
<Set name="acceptQueueSize"><Property name="jetty.http.acceptQueueSize" default="0"/></Set>
</New>
</Arg>
</Call>
</Configure>
我也尝试过此配置,并且取消注释了“ProxyConnectionFactory”。
我已阅读了有关将 Nginx 配置为反向代理和常规配置的尽可能多的资料,包括:
https://www.nginx.com/resources/wiki/start/topics/tutorials/config_pitfalls/
https://docs.nginx.com/nginx/admin-guide/web-server/reverse-proxy/
https://www.nginx.com/resources/wiki/start/topics/examples/server_blocks/
https://www.nginx.com/resources/wiki/start/topics/examples/javaservers/
最后一个给了我一线希望。但据我所知,Nexus 中的 Jetty 实例不遵循标准设置。
我尝试找到一些针对我的特定问题的参考资料:
https://groups.google.com/a/glists.sonatype.com/forum/#!topic/nexus-users/HRBRpjU03b8
https://support.sonatype.com/hc/en-us/articles/213464728-为什么-Nexus-user-interface-broken-
https://stackoverflow.com/questions/10075304/nginx-fails-to-load-css-files
(还有更多,但由于声誉低,我只能提供 8 个链接。)
但似乎没有任何内容针对我的具体问题,并且所有修复都对其没有任何效果。
有几种解决方案建议直接从 Nginx 提供静态内容,但是,除了 /public/ 目录中的几个位以及 swagger 界面之外,我无法在 Nexus 目录中找到静态资源目录。
所以我的问题是:是否有人知道我的问题是否是我需要直接提供静态内容,如果是,我该如何实现。
或者
您是否看到导致资源无法加载的其他配置问题。
感谢任何指点和/或解决方案。
答案1
最终我在 Sonatype Nexus 论坛上找到了这个问题报告: https://issues.sonatype.org/browse/NEXUS-11603
在非默认端口上运行 Nexus 需要额外的配置,而有关 Nginx 设置的 Nexus 文档已省略此配置。您不仅需要在 Nginx 中的 proxy_set_header 指令中指定主机,还必须指定端口,如下所示:
proxy_set_header Host $host:$server_port;
这对我来说很有用,我希望它可以节省其他人配置 Nginx 的麻烦。