网站和接口在同一个服务器接口无法访问nginx该如何配置?

前端和服务端都部署在同一个服务器上,使用nginx进行转发接口的请求,但是报错,

[error] 15880#15880: *57 connect() failed (111: Connection refused) while connecting to upstream, client: 172.8.203.147, server: , request: "GET /v1/user/list?pageIndex=0&pageSize=18&text= HTTP/1.1", upstream: "https://127.0.0.1:3000/v1", host: "www.test.cn", referrer: "https://www.test.cn/"

我请求的连接是如下

https://www.test.cn/v1/user/list?pageIndex=0&pageSize=18&text=

我想的是,通过test.cn域名会访问到服务器默认端口上,然后让nginx转发到对应的服务端口上,比如我的配置是转到了3000端口上

location \v1{
 proxy_pass "https://127.0.0.1:300/v1";
}

结果就报上面的错误,这个该如何解决,或者我这种部署方式咋弄比价好呢?


我的配置如下:

location ~* /v1/ {
                         set $backend "https://127.0.0.1:3100/v1";   # 默认的后端服务器地址

                         if ($scheme = http) {                      # 判断请求的协议为 HTTP
                                set $backend "http://127.0.0.1:3100/v1";       # 将$backend设置为对应的后端服务器地址
                        }

                        proxy_pass $backend;     # 使用$backend作为proxy_pass的参数
                        # add_header Cache-Control "no-store, no-cache, must-revalidate, proxy-revalidate";
                        add_header Content-Type "application/json";
                }
阅读 1.4k
avatarAI BotBETA

根据你的问题描述和错误日志,看起来nginx无法连接到你的后端服务,这可能是由于后端服务并未在你预期的端口(这里是3000端口)上运行,或者nginx没有权限访问这个端口。

首先,你需要确认你的后端服务(可能是Node.js、Python Flask、Django等)确实在3000端口上运行。你可以使用如下命令来检查:

netstat -tuln | grep 3000

如果这个命令没有返回任何结果,那就说明你的后端服务并未在3000端口上运行。你需要启动你的后端服务,并确保它在正确的端口上运行。

如果后端服务确实在3000端口上运行,那么问题可能出在nginx的权限上。nginx可能没有足够的权限去访问这个端口。你可以尝试以root权限运行nginx,或者更改nginx的用户权限,使其有足够的权限去访问3000端口。

此外,你的nginx配置也有些许问题。在你的location块中,你应该使用~~*来匹配URI,而不是\\~用于区分大小写的匹配,而\~*用于不区分大小写的匹配。同时,proxy_pass的URL中不应该包含被匹配的部分。所以你的配置应该改为:

location ~* ^/v1/ {
    proxy_pass "https://127.0.0.1:3000/";
}

这样,任何以/v1/开头的请求都会被转发到https://127.0.0.1:3000/

最后,确保你的nginx已经重新加载或重启,以应用新的配置。你可以使用如下命令来重新加载nginx配置:

sudo nginx -s reload

如果以上步骤都无法解决问题,你可能需要更深入地检查你的后端服务和nginx的配置,看看是否有其他的问题。

1 个回答

proxy这么改:

location ^~/v1/ {
        proxy_pass https://127.0.0.1:300/v1/;
        proxy_set_header  Host $host;
        proxy_set_header  X-Real-IP $remote_addr;
        proxy_set_header  X-Forwarded-Proto https;
        proxy_set_header  X-NginX-Proxy true;
        proxy_buffers 256 4k;
        proxy_max_temp_file_size 0k;
        proxy_connect_timeout 30;
        proxy_send_timeout 60;
        proxy_read_timeout 60;
        proxy_next_upstream error timeout invalid_header http_502;            
    }

Nginx - proxy_pass路径的唯一拼接规则

推荐问题