当我将 Nginx 用作 Nexus 3 Repository Manager 的反向代理时,为什么 Nginx 仅提供索引标记?

当我将 Nginx 用作 Nexus 3 Repository Manager 的反向代理时,为什么 Nginx 仅提供索引标记?

我正在尝试通过 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.dsites-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-availablesites-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

Nexus Repository OSS 反向代理

(还有更多,但由于声誉低,我只能提供 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 的麻烦。

相关内容