Nginx

帶有兩台伺服器的 nginx 反向代理 404

  • February 14, 2022

我的 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 日誌,而請求將發送到被重定向的同一伺服器。

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