请教 v2 大佬们以下 nginx 反向代理配置报错问题

2020-11-25 22:02:29 +08:00
 qwer666df

需求想的是,在访问 test.cc/sss 的时候转到 http://localhost:8001 地址

其中:

报错信息

2020/11/25 13:43:56 [error] 7#7: *3 connect() failed (111: Connection refused) while connecting to upstream, client: 172.19.0.1, server: test.cc, request: "GET /sss/list HTTP/1.1", upstream: "http://127.0.0.1:8001/sss/list", host: "test.cc"

nginx.conf

upstream websocket {
	ip_hash;
	server 127.0.0.1:3101 weight=1 max_fails=2 fail_timeout=30s;
	server 127.0.0.1:3102 weight=1 max_fails=2 fail_timeout=30s;
	server 127.0.0.1:3103 weight=1 max_fails=2 fail_timeout=30s;
}

server {
	listen 80;
	server_name test.cc;
	location ~ /sss/ {
		proxy_pass http://localhost:8001;
	}
}
4258 次点击
所在节点    NGINX
20 条回复
lrvinye
2020-11-25 23:40:45 +08:00
你这个写法,访问 test.cc/sss 实际上会反代到 localist:8001/sss
kidlj
2020-11-26 00:09:21 +08:00
SELinux 关掉了吗?

# sestatus 查看。
lpts007
2020-11-26 03:07:22 +08:00
postman 直接给 8001 发个请求试试,headers 的 Host 设置为 test.cc
37Y37
2020-11-26 08:15:34 +08:00
server 段还有其他 location 规则干扰了吧
ik
2020-11-26 08:15:59 +08:00
关闭 selinux

location ~ /sss/ 改成 location ~ /sss
ik
2020-11-26 08:16:44 +08:00
@ik 先关 selinux 看看吧
uselessVisitor
2020-11-26 08:27:02 +08:00
建议使用二级域名。。
uselessVisitor
2020-11-26 08:29:32 +08:00
或者这样试试
location ^~/sss/ {
rewrite ^/sss/(.*)$ /$1 break;
proxy_pass http://127.0.0.1:8081;
}
zliea
2020-11-26 08:47:06 +08:00
偷偷的问是不是 docker
todd7zhang
2020-11-26 08:54:02 +08:00
如果是 Django 的话,可以尝试看看是不是 ALLOWED_HOSTS 的问题
Kirsk
2020-11-26 09:24:42 +08:00
看一楼回复 location /sss/ {
proxy_pass http://localhost:8001
Vibra
2020-11-26 09:47:05 +08:00
@lrvinye 是的, 他应该写的是 proxy_pass http://websocket
qwer666df
2020-11-26 10:13:57 +08:00
@ztechstack #9 对是 docket
@lrvinye #1 但是我本地 hosts 里面 localhost 也指向到了 127.0.0.1
@lpts007 #3 8001 端口能直接访问没啥问题的
lpts007
2020-11-26 12:03:27 +08:00
@qwer666df 访问的时候 Host 设了吗
zliea
2020-11-26 12:27:18 +08:00
docker 的话,nginx 容器内部访问 127.0.0.1 是访问 nginx 容器自身;
如果需要访问 python 容器的话:
1. 在同一 docker 的 network 里,可以使用[python 容器名称]:[python 服务端口]。
2. 或者使用[宿主机 IP]:[python 容器映射宿主机端口]。
qwer666df
2020-11-26 13:28:11 +08:00
@lpts007 #14 host 设置了应该是 docker 的问题
qwer666df
2020-11-26 13:29:20 +08:00
@ztechstack #15 对, 我早上发现了, 也就是访问 nginx 的去了, 不是我的本机, 所以一直链接不上, 你说的这个方案.. 我还不太熟悉, 打算先看看 docker 在研究研究... 蛋疼
ziwen1943
2020-11-26 17:38:58 +08:00
这个问题大概率是 docker 引起的,如果使用 docker 的话,nginx 容器代理应该代理 python 容器名( docker 子网访问使用容器名,加对应端口,127.0.0.1 只是在 nginx 本容器内访问,)
一个简单的方法是,先用 python 的 debug 方法直接监听 0.0.0.0 ( ALLOW_HOST ),测试通过后再加 nginx 代理,而且这样代理还不行,应该把 python 容器的 Django 项目静态文件通过映射传递或者容器继承文件,让 nginx 来代理所有静态文件和 api,django 真正变成后端,不负责静态文件的路由和转发,django 的效率更高。
lrvinye
2020-11-26 22:30:45 +08:00
@qwer666df 我的意思是 location 使用正则时将会把 location 获取的完整 uri 加到反代的地址后面,而使用普通匹配时则情况不一样,建议搜索 nginx 反代斜杠用法
qwer666df
2020-11-27 11:00:11 +08:00
@lrvinye #19 谢谢大佬 学到了

@ziwen1943 #18 恩恩, 应该是这个问题, 我一开始只是拿 Python 启动测试一把没想到 docker 折腾有点复杂, 现在先不折腾了,,, 还有我的 Python 是装在本机的也不能代理. 有点蛋疼, 谢谢大佬讲解

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/729258

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX