V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
NGINX
NGINX Trac
3rd Party Modules
Security Advisories
CHANGES
OpenResty
ngx_lua
Tengine
在线学习资源
NGINX 开发从入门到精通
NGINX Modules
ngx_echo
qwer666df
V2EX  ›  NGINX

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

  •  
  •   qwer666df · 2020-11-25 22:02:29 +08:00 · 4200 次点击
    这是一个创建于 1449 天前的主题,其中的信息可能已经有所发展或是发生改变。

    需求想的是,在访问 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: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;
    	}
    }
    
    第 1 条附言  ·  2020-11-26 13:30:35 +08:00
    揭帖: 原因大改就是因为 @ztechstack 说的原因 , 我是 nginx 是在 docker 上的, 访问的 127 实际上是在 docker 里面的不是我的本机 127, 但是我的 8001 端口又是在本机的, 所以访问不了
    20 条回复    2020-11-27 11:00:11 +08:00
    lrvinye
        1
    lrvinye  
       2020-11-25 23:40:45 +08:00 via iPhone
    你这个写法,访问 test.cc/sss 实际上会反代到 localist:8001/sss
    kidlj
        2
    kidlj  
       2020-11-26 00:09:21 +08:00 via iPhone
    SELinux 关掉了吗?

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

    location ~ /sss/ 改成 location ~ /sss
    ik
        6
    ik  
       2020-11-26 08:16:44 +08:00 via iPhone
    @ik 先关 selinux 看看吧
    uselessVisitor
        7
    uselessVisitor  
       2020-11-26 08:27:02 +08:00
    建议使用二级域名。。
    uselessVisitor
        8
    uselessVisitor  
       2020-11-26 08:29:32 +08:00
    或者这样试试
    location ^~/sss/ {
    rewrite ^/sss/(.*)$ /$1 break;
    proxy_pass http://127.0.0.1:8081;
    }
    zliea
        9
    zliea  
       2020-11-26 08:47:06 +08:00
    偷偷的问是不是 docker
    todd7zhang
        10
    todd7zhang  
       2020-11-26 08:54:02 +08:00
    如果是 Django 的话,可以尝试看看是不是 ALLOWED_HOSTS 的问题
    Kirsk
        11
    Kirsk  
       2020-11-26 09:24:42 +08:00 via Android
    看一楼回复 location /sss/ {
    proxy_pass http://localhost:8001
    Vibra
        12
    Vibra  
       2020-11-26 09:47:05 +08:00
    @lrvinye 是的, 他应该写的是 proxy_pass http://websocket
    qwer666df
        13
    qwer666df  
    OP
       2020-11-26 10:13:57 +08:00
    @ztechstack #9 对是 docket
    @lrvinye #1 但是我本地 hosts 里面 localhost 也指向到了 127.0.0.1
    @lpts007 #3 8001 端口能直接访问没啥问题的
    lpts007
        14
    lpts007  
       2020-11-26 12:03:27 +08:00 via Android
    @qwer666df 访问的时候 Host 设了吗
    zliea
        15
    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
        16
    qwer666df  
    OP
       2020-11-26 13:28:11 +08:00
    @lpts007 #14 host 设置了应该是 docker 的问题
    qwer666df
        17
    qwer666df  
    OP
       2020-11-26 13:29:20 +08:00
    @ztechstack #15 对, 我早上发现了, 也就是访问 nginx 的去了, 不是我的本机, 所以一直链接不上, 你说的这个方案.. 我还不太熟悉, 打算先看看 docker 在研究研究... 蛋疼
    ziwen1943
        18
    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
        19
    lrvinye  
       2020-11-26 22:30:45 +08:00 via iPhone
    @qwer666df 我的意思是 location 使用正则时将会把 location 获取的完整 uri 加到反代的地址后面,而使用普通匹配时则情况不一样,建议搜索 nginx 反代斜杠用法
    qwer666df
        20
    qwer666df  
    OP
       2020-11-27 11:00:11 +08:00
    @lrvinye #19 谢谢大佬 学到了

    @ziwen1943 #18 恩恩, 应该是这个问题, 我一开始只是拿 Python 启动测试一把没想到 docker 折腾有点复杂, 现在先不折腾了,,, 还有我的 Python 是装在本机的也不能代理. 有点蛋疼, 谢谢大佬讲解
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5591 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 37ms · UTC 03:38 · PVG 11:38 · LAX 19:38 · JFK 22:38
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.