Nginx

為什麼當我將 Nginx 用作 Nexus 3 Repository Manager 的反向代理時,它只提供索引標記?

  • September 18, 2018

我正在嘗試通過 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 時是一樣的。

我嘗試過使用管理 Nginx 配置的conf.dsites-available+技術。sites-enabled正如您在下面看到的那樣,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包含指向它的符號連結。

關係配置文件

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-Why-is-the-Nexus-user-interface-broken-

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

Nexus Repository OSS 反向代理

(還有更多,但由於代表低,我僅限於 8 個連結。)

但似乎沒有任何內容涉及我的具體問題,並且沒有任何修復對其產生任何影響。

一些解決方案建議直接從 Nginx 提供靜態內容,但是,除了 /public/ 目錄中的一些位以及一個招搖的界面外,我無法在 Nexus 目錄中找到靜態資源目錄。

所以我的問題是:有誰知道我的問題是否是我需要直接提供靜態內容,如果是,我該如何實現。

或者

您能看到導致資源無法載入的其他配置問題嗎?

感謝您提供任何指示和/或解決方案。

最終我在 Sonatype Nexus 板上找到了這個問題報告: https ://issues.sonatype.org/browse/NEXUS-11603

在非預設埠上執行 Nexus 需要額外的配置,有關 Nginx 設置的 Nexus 文件已省略。除了在 Nginx 的 proxy_set_header 指令中指定主機之外,還必須指定埠,如下所示:

proxy_set_header Host $host:$server_port;

這對我有用,我希望它能為其他人節省一些配置 Nginx 的痛苦

引用自:https://serverfault.com/questions/926144