服务器问答

请教 v2 大佬们以下 nginx 反向代理配置报错问题
0
2021-05-18 17:52:09
idczone

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

其中:

  • http://127.0.0.1:8001/sss/list 这个地址是可以正常访问的
  • 防火墙已经关闭
  • 是 Python 项目, 不是 php 项目, , 因为 Google 了一圈发现都是说 php-fpm+nginx 的问题

报错信息

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:8美国服务器001/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;
	}
}

你这个写法,访问 test.cc/sss 实际上会反代到 localist:8001/sss

SELinux 关掉了吗?
sestatus 查看。

postman 直接给 8001 发个请求试试,headers 的 Host 设置为 test.cc

server 段还有其他 location 规则干扰了吧

关闭 selinux
location ~ /sss/ 改成 location ~ /sss

先关 selinux 看看吧

建议使用二级域名。。

或者这样试试
location ^~/sss/ {
rewrite ^/sss/(.*)$ /$1 break;
proxy_pass http://127.0.0.1:8081;
}

偷偷的问是不是 docker

如果是 Django 的话,可以尝试看看是不是 ALLOWED_HOSTS 的问题

看一楼回复 location /sss/ {
proxy_pass http://localhost:8001

是的, 他应该写的是 proxy_pass http://websocket

对是 docket
但是我本地 hosts 里面 localhost 也指向到了 127.0.0.1
8001 端口能直接访问没啥问题的

访问的时候 Host 设了吗

docker 的话,nginx 容器内部访问 127.0.0.1 是访问 nginx 容器自身;
如果需要访问 python 容器的话:
1. 在同一 docker 的 network 里,可以使用[python 容器名称]:[python 服务端口]。
2. 或者使用[宿主机 IP]:[python 容器映射宿主机端口]。

host 设置了应该是 docker 的问题

对, 我早上发现了, 也就是访问 nginx 的去了, 不是我的本机, 所以一直链接不上, 你说的这个方案.. 我还不太熟悉, 打算先看看 docker 在研究研究... 蛋疼

这个问题大概率是 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 的效率更高。

我的意思是 location 使用正则时将会把 location 获取的完整 uri 加到反代的地址后面,而使用普通匹配时则情况不一样,建议搜索 nginx 反代斜杠用法

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

数据地带为您的网站提供全球顶级IDC资源
在线咨询
专属客服