Назад | Перейти на главную страницу

Почему Nginx обслуживает только разметку индекса, когда я использую его в качестве обратного прокси для Nexus 3 Repository Manager?

Я пытаюсь обслуживать Nexus3 Repo Manager через обратный прокси-сервер Nginx, но он обслуживает только разметку индекса.

Я настроил диспетчер репозитория Sonatype Nexus 3 на экземпляре Azure RHEL (SELinux). Я пытался настроить Nginx (на том же экземпляре RHEL) в качестве обратного прокси (и использовать в качестве конечной точки SSL) для Nexus изначально и для других сервисов в будущем.

Насколько я понимаю, это довольно распространенная установка, поэтому я удивлен, что не могу найти никого с такой же проблемой. (Следовательно, я думаю, что должен делать что-то действительно глупое.)

У меня открыт порт 59906 в Azure и на экземпляре RHEL. Пользовательский интерфейс Nexus работает правильно при самостоятельном запуске. Он отображается правильно, когда я просматриваю его на 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, поэтому с разрешениями проблем быть не должно. Я включил флаг httpd_can_network_connect в SE Linux, чтобы разрешить процессу nginx подключаться к сокету Nexus.

Все ресурсы имеют базовые URL-адреса: http://nexus.mydomain.com/static/rapture/resources/ То же самое, когда я запускаю Nexus без проксирования Nginx.

Я пробовал использовать как 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.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-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/

Этот последний подарил мне проблеск надежды. Но из того, что я вижу, экземпляр Jetty внутри Nexus не соответствует стандартной настройке.

И я попытался найти ссылку на мою конкретную проблему:

https://groups.google.com/a/glists.sonatype.com/forum/#!topic/nexus-users/HRBRpjU03b8

https://support.sonatype.com/hc/en-us/articles/213464728-Why-is-the-Nexus-user-interface-broken-

https://stackoverflow.com/questions/10075304/nginx-fails-to-load-css-files

Обратный прокси-сервер OSS репозитория Nexus

(и многое другое, но я ограничен 8 ссылками из-за низкой репутации.)

Но, похоже, ничто не касается моей конкретной проблемы, и ни одно из исправлений не повлияло на нее.

Некоторые решения предлагают обслуживать статический контент непосредственно из Nginx, однако мне не удалось найти каталог статических ресурсов в каталогах Nexus, кроме нескольких битов в каталоге / public / вместе с интерфейсом swagger.

Итак, мой вопрос: знает ли кто-нибудь, что моя проблема в том, что мне нужно напрямую обслуживать статический контент, и если да, то как мне этого добиться.

ИЛИ

Вы видите другую проблему конфигурации, из-за которой ресурсы не загружаются?

Спасибо за любые указатели и / или решения.

В конце концов я нашел этот отчет о проблеме на платах Sonatype Nexus: https://issues.sonatype.org/browse/NEXUS-11603

Для запуска Nexus на нестандартном порте требуется дополнительная конфигурация, которая пропущена в документации Nexus, касающейся настройки Nginx. Вместо того, чтобы просто указывать хост в директиве proxy_set_header в Nginx, вы также должны указать порт, например:

proxy_set_header Host $host:$server_port;

Это сработало для меня, и я надеюсь, что это избавит кого-то от боли при настройке Nginx.