為什麼當我將 Nginx 用作 Nexus 3 Repository Manager 的反向代理時,它只提供索引標記?
我正在嘗試通過 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.d
和sites-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-available
,sites-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
(還有更多,但由於代表低,我僅限於 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 的痛苦