![nginx 反向代理 404 有两台服务器](https://linux22.com/image/774934/nginx%20%E5%8F%8D%E5%90%91%E4%BB%A3%E7%90%86%20404%20%E6%9C%89%E4%B8%A4%E5%8F%B0%E6%9C%8D%E5%8A%A1%E5%99%A8.png)
我的 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 日志。