帶有兩台伺服器的 nginx 反向代理 404
我的 NGINX 配置有問題。我有兩個在 Windows 伺服器上執行的網路伺服器。哪個是從外部呼叫的 443,然後應該轉發到帶有 41001 的伺服器。第二個伺服器塊應該稱為 FQDN,nginx 應該將它轉發到 FQDN.com/test。內部和外部。
在第一個伺服器塊上,這需要永遠載入,並且似乎沒有任何效果。使用第二個伺服器塊,我得到了 404。
這是我的配置和錯誤日誌的樣子
server { server_name test.example.com; return 301 http://test.example.com/test$request_uri; } server { listen 443 ssl http2; listen [::]:443 ssl http2; access_log /var/log/nginx/test_service_access.log; error_log /var/log/nginx/test_service_error.log; ssl_certificate /etc/nginx/ssl/test.com.pem; ssl_certificate_key /etc/nginx/ssl/test.key; ssl_session_timeout 1d; ssl_session_tickets off; ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-G> ssl_prefer_server_ciphers off; location /test { proxy_pass https://10.10.10.10/test/; } client_max_body_size 0; proxy_connect_timeout 90s; proxy_send_timeout 90s; proxy_read_timeout 90s; send_timeout 90; } server { server_name test2.example.com; # Redirect all HTTP requests to HTTPS with a 301 Moved Permanently response. return 301 https://test2.example.com$request_uri; } server { listen 443 ssl http2; listen [::]:443 ssl http2; server_name test2.example.com; access_log /var/log/nginx/test2_service_access.log; error_log /var/log/nginx/test2_service_error.log; ssl_certificate /etc/nginx/ssl/test2.example.com.pem; ssl_certificate_key /etc/nginx/ssl/test2example.key; # ssl_session_cache shared:SSL:50m; ssl_session_timeout 1d; ssl_session_tickets off; ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-G> ssl_prefer_server_ciphers off; add_header Strict-Transport-Security max-age=15768000; location / { # resolver 10.150.10.10 8.8.8.8; proxy_pass https://test2.example.com:41001/; proxy_redirect https://test2.example.com:41001/ https://test2.example.com/; client_max_body_size 0; proxy_connect_timeout 90s; proxy_send_timeout 90s; proxy_read_timeout 90s; send_timeout 90; } } }
我查看了error.logs,這就是出現的問題。
2022/02/13 12:54:58 [error] 2620#2620: *15 open() "/usr/share/nginx/html/DocuWare/Platform/LoginRedirect" failed (2: No such file or directory), client: xxx.xxx.xxx.xxx, server: , request: "GET /DocuWare/Platform/LoginRedirect?returnUrl=%2fdocuware%2fPlatform%2fWebClient%2f HTTP/2.0", host: "test2.domain.com", referrer: "https://test.domain.com/docuware/Platform/WebClient/" 2022/02/13 12:35:17 [error] 2541#2541: *1 upstream timed out (110: Connection timed out) while connecting to upstream, client:
關於第一個錯誤,我不明白到底是什麼問題
據我了解,我需要為埠 41001 的伺服器定義一個上游,對嗎?
我在這裡錯過了什麼嗎?
更新
我已經將我的配置調整到最小,以便我可以測試它。如下我的配置看起來像這樣
###################################################################### upstream abacus { server 10.120.50.11; } server { listen 80; server_name abacus.example.com; return 301 https://abacus.example.com$request_uri; } server { listen 443 ssl; server_name abacus.example.com; ssl_certificate /etc/nginx/ssl/xxx.com.pem; ssl_certificate_key /etc/nginx/ssl/xxx.key; ssl_protocols TLSv1.2 TLSv1.3; access_log /var/log/nginx/abacus_service_access.log; error_log /var/log/nginx/abacus_service_error.log; location / { proxy_pass http://abacus; } } ####################################################################### upstream docuware { server 10.120.50.10; } server { listen 80; server_name docuware.example.com; return 301 https://docuware.example.com$request_uri; } server { listen 443 ssl; server_name docuware.example.com; ssl_certificate /etc/nginx/ssl/xxx.pem; ssl_certificate_key /etc/nginx/ssl/xxx.key; ssl_protocols TLSv1.2 TLSv1.3; access_log /var/log/nginx/docuware_service_access.log; error_log /var/log/nginx/docuware_service_error.log; location / { proxy_pass http://docuware/docuware; } } }
當我訪問伺服器“abacus.example.com”時,我進入了 IIS 首頁。所以在這裡我必須定義我來自外部的 443 (HTTPS) 並且我被重定向到埠 23001。
如果我訪問伺服器“docuware.example.com/docuware”,我會收到 404 - 找不到文件或目錄。所以在這裡我必須以某種方式定義它可以使用子路徑訪問伺服器。
在內部網路中,這可以正常工作。我被重定向到“docuware.example.com/DocuWare/Platform/WebClient/ClientAccount/xxx”。
你看到這裡我需要調整什麼了嗎?幾個小時以來,我一直在努力反對它。
可能需要的一件事是為代理標頭設置正確的 Host 標頭:
對於算盤:
location / { proxy_set_header Host abacus.example.com; proxy_pass http://abacus; }
對於文件軟體:
location /docuware { proxy_set_header Host docuware.example.com; proxy_pass http://docuware/docuware/; }
第一個錯誤說 nginx 在他擁有的位置找不到特定文件。解決這個問題的一種方法是為 nginx 提供一個特定文件夾來存放所請求的文件。這就是網路伺服器的工作方式。
我不確定您是否可以將使用 nginx 的使用者從非 SSL 流量重定向到 SSL 流量。無論從使用者 Web 瀏覽器訪問目標伺服器有多少步驟,請求和響應都應該是相同的加密/非加密。
如果 nginx 進入循環,請查看 nginx 日誌,而請求將發送到被重定向的同一伺服器。