nginx 反向代理 404 有两台服务器

nginx 反向代理 404 有两台服务器

我的 NGINX 配置有问题。我在 Windows 服务器上运行了两个 Web 服务器。其中一个从外部使用 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”。

你知道我需要调整什么吗?我已经为此绞尽脑汁好几个小时了。

答案1

可能需要做的一件事是为代理标头设置适当的主机标头:

对于算盘:

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/;
}

答案2

第一个错误表示 nginx 无法在其所在位置找到特定文件。解决该问题的一种方法是为 nginx 提供所请求文件的特定文件夹。这就是 Web 服务器的工作原理。

我不确定您是否可以使用 nginx 将用户从非 SSL 流量重定向到 SSL 流量。无论从用户 Web 浏览器访问目标服务器有多少步骤,请求和响应都应该是相同的加密/非加密。

如果 nginx 进入循环,而请求又发往重定向的同一服务器,则查看 nginx 日志。

相关内容