Я пытаюсь обслуживать 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.