V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
PMinV2
V2EX  ›  程序员

Nginx + supervisord 怎么配置可以实现公网域名访问

  •  
  •   PMinV2 · 2018-02-01 09:34:00 +08:00 · 5313 次点击
    这是一个创建于 2488 天前的主题,其中的信息可能已经有所发展或是发生改变。
    1. supervisord config
    [unix_http_server]
    file=/tmp/supervisor.sock   ; the path to the socket file
    ;chmod=0700                 ; socket file mode (default 0700)
    ;chown=nobody:nogroup       ; socket file uid:gid owner
    ;username=test              ; default is no username (open server)
    ;password=test               ; default is no password (open server)
    
    [inet_http_server]         ; inet (TCP) server disabled by default
    port=0.0.0.0:9001        ; ip_address:port specifier, *:port for all iface
    username=test              ; default is no username (open server)
    password=test             ; default is no password (open server)
    
    
    1. Nginx config
    
    upstream uwsgi_backend {
        server 127.0.0.1:8002;
    }
    
    server {
        listen   80;
        server_name mydomain.com;
    
        location ^~ /.git {
            deny all;
        }
    
        location ^~ /static {
            root   /;
            index  index.html;
            expires 1M;
            access_log off;
            add_header Cache-Control "public";
        }
    
        location / {
            proxy_next_upstream error timeout http_500 http_503;
            proxy_connect_timeout 4000ms;
            proxy_read_timeout    30s;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $remote_addr;
            proxy_set_header X-Rewrite-URL $request_uri;
            client_max_body_size 10m;
    
            uwsgi_pass  uwsgi_backend;
            include uwsgi_params;
        }
    
    }
    #  这里是出问题的地方,为希望能通过代理 9001 端口到本地的 0.0.0.0:9001 实现公网访问
    server {
      listen mydomain.com:9001;
    
      server_name mydomain.com;
    
      location / {
        proxy_pass http://0.0.0.0:9001;
        proxy_buffering     off;
      }
    }
    

    下面是我谷歌搜索了很多跟我这个情况不太一样,求大神指点。

    https://segmentfault.com/a/1190000006902417

    https://serverfault.com/questions/858859/nginx-proxy-pass-to-supervisord

    31 条回复    2018-02-01 15:53:54 +08:00
    defunct9
        1
    defunct9  
       2018-02-01 09:36:17 +08:00   ❤️ 1
    开 ssh,我上去搞
    cominghome
        2
    cominghome  
       2018-02-01 09:36:48 +08:00
    嗯,我相信你是产品经理
    PMinV2
        3
    PMinV2  
    OP
       2018-02-01 09:40:05 +08:00
    @defunct9 大佬要这么猛嘛
    PMinV2
        4
    PMinV2  
    OP
       2018-02-01 09:40:25 +08:00
    pepesii
        5
    pepesii  
       2018-02-01 09:41:38 +08:00 via iPhone
    什么意思,supervisor 的那个 web 界面,要通过 ng 代理?
    rockyou12
        6
    rockyou12  
       2018-02-01 09:49:32 +08:00
    server {
    listen 80;
    listen [::]:80;
    server_name yourdomain.com;

    location / {
    proxy_pass http://localhost:9001;
    }

    }
    defunct9
        7
    defunct9  
       2018-02-01 09:49:44 +08:00
    @PMinV2 标准语。因为你描述的可能跟问题没有关联。嘿嘿
    yxwzaxns
        8
    yxwzaxns  
       2018-02-01 09:51:41 +08:00 via iPhone
    listen mydomain.com:9001;

    listen 9001

    不用加域名,域名已经由 server_name 指定
    PMinV2
        9
    PMinV2  
    OP
       2018-02-01 09:56:03 +08:00
    @pepesii 对的
    msg7086
        10
    msg7086  
       2018-02-01 09:56:08 +08:00
    listen 的是 IP 和端口,域名要写在 server_name 里,proxy 的目标是 IP,不是 0000。
    msg7086
        11
    msg7086  
       2018-02-01 09:57:49 +08:00
    而且你把 supervisord 配置在了 0000,已经是公网访问了,再配置 nginx 就冲突了。你要么选择把 supervisord 配置在本机,再用反代,要么就直接用 supervisord。
    PMinV2
        12
    PMinV2  
    OP
       2018-02-01 10:00:58 +08:00
    @yxwzaxns 修改之后显示:
    无法访问此网站 拒绝了我们的连接请求。

    Header 中的返回就一条提示:Referrer Policy:no-referrer-when-downgrade
    yxwzaxns
        13
    yxwzaxns  
       2018-02-01 10:07:09 +08:00 via iPhone
    @PMinV2
    [inet_http_server] ; inet (TCP) server disabled by default
    port=0.0.0.0:9001

    这里把 0000 换成 127001

    nginx 里 listen 公网 ip:9001

    passproxy http://127001:9001

    最后看 nginx 的日志
    PMinV2
        14
    PMinV2  
    OP
       2018-02-01 10:24:49 +08:00
    @msg7086 已经按你说的修复了,但是还是没能成功访问
    PMinV2
        15
    PMinV2  
    OP
       2018-02-01 10:25:13 +08:00
    @yxwzaxns 日志没有关于这个请求的。
    PMinV2
        16
    PMinV2  
    OP
       2018-02-01 10:27:34 +08:00
    更新配置
    [inet_http_server]
    port=127.0.0.1:9001

    server {
    listen 9001;

    server_name mydomain . com;

    location / {
    proxy_pass http:// 127.0.0.1:9001;
    proxy_buffering off;
    }
    }
    yxwzaxns
        17
    yxwzaxns  
       2018-02-01 10:30:35 +08:00 via iPhone
    @PMinV2 因为你没配置日志吧
    SmiteChow
        18
    SmiteChow  
       2018-02-01 10:33:34 +08:00
    端口冲突了
    seancheung
        19
    seancheung  
       2018-02-01 10:56:28 +08:00
    >> nginx 配置

    upstream supervisord {
    server 127.0.0.1:9001;
    keepalive 8;
    }

    server
    {
    listen 80;
    listen [::]:80;

    # server_name domain.com;
    # auth_basic "Restricted Access";
    # auth_basic_user_file /etc/nginx/conf/htpasswd.users;

    location / {
    proxy_pass http://supervisord;
    proxy_http_version 1.1;
    # proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection 'upgrade';
    # proxy_set_header Host $host;
    # proxy_cache_bypass $http_upgrade;
    }
    }

    >> supervisor 配置

    [inet_http_server]
    port = 127.0.0.1:9001
    username = user
    password = 123

    >> 已测试可以正常访问
    seancheung
        20
    seancheung  
       2018-02-01 11:06:58 +08:00   ❤️ 1
    顺便指正一下题主配置中得问题:

    你的 supervisord 已经监听了 9001 端口, 而你 nginx 里再去抢占这个端口,是无法启动服务的。
    另外如果你希望通过 nginx 反向代理 supervisord 的 inet_http_server, 那么在 inet_http_server 配置里就只需要监听来自本地 host 的请求即可。否则你的 9001 端口依然是对 public 暴露的(不考虑防火墙的话)。

    另外你的 nginx 最新面的 server 配置中, listen 不应该加上域名。域名放 server_name 部分。listen 部分结构是 host+port, 而 host 可以缺省。既然你是对公网暴露,那么缺省 host 即可。如果需要 ipv6,加上 ipv6 的监听即可。

    我给出的配置为最简配置,题主可以根据实际需求调整。另外 basicauth 也可以放在 nginx 里实现。
    PMinV2
        21
    PMinV2  
    OP
       2018-02-01 11:16:48 +08:00
    问题得到了解决,感谢各位的鼎力相助。

    原因如下:我的 Nginx 和 supervisord 都没问题了,但是我的端口以为没问题但是其实存在问题
    fuck,阿里云安全组,禁止了我的端口。
    我一开始使用了下面两条命令开通了防火墙访问权限

    iptables -A INPUT -p tcp --dport 9001 -j ACCEPT
    iptables -A OUTPUT -p tcp --sport 9001 -j ACCEPT
    iptables -L -n
    #看到下面这个就以为 OK 了
    ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:9001

    但是经过仔细排查问题重新使用下面这个命令解决了问题
    iptables -I INPUT 4 -p tcp -m state --state NEW -m tcp --dport 9001 -j ACCEPT
    service iptables save
    iptables -nvL
    0 0 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:9001
    0 0 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:9889
    虽然作为一个产品并不能看懂这两条有啥区别,我是从 iptables -h 文档中查到的命令进行尝试的,有大佬解释一下吗?

    运行良好的 supervisord Web 服务
    running
    pid 9706, uptime 0:26:03 wechatspider_processor Restart Stop Clear Log Tail -f
    running
    pid 15689, uptime 0:00:01 wechatspider_redis Restart Stop Clear Log Tail -f
    running
    pid 9707, uptime 0:26:03 wechatspider_scheduler Restart Stop Clear Log Tail -f
    PMinV2
        22
    PMinV2  
    OP
       2018-02-01 11:17:56 +08:00
    @seancheung 我重新考虑了防火墙
    gqkkk
        23
    gqkkk  
       2018-02-01 11:20:55 +08:00
    0.0.0.0 是全地址监听了
    自己看下日志 会告诉你端口被占用的
    PMinV2
        24
    PMinV2  
    OP
       2018-02-01 11:21:21 +08:00
    更正一下:0 0 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:9001
    PMinV2
        25
    PMinV2  
    OP
       2018-02-01 11:21:48 +08:00
    @gqkkk 是防火墙的问题,已经解决了
    defunct9
        26
    defunct9  
       2018-02-01 11:28:09 +08:00
    So, 我说的是大实话。你一开始的描述跟问题毫无关联。上去看一眼就知道了。导致一堆人开始猜火车。
    PMinV2
        27
    PMinV2  
    OP
       2018-02-01 11:29:29 +08:00
    @defunct9 大佬要是能给我指点迷津就更好了。作为一个 PM 能到部署阶段已经不易了
    GenHong
        28
    GenHong  
       2018-02-01 11:38:12 +08:00
    @defunct9 表示赞同~~
    20has
        29
    20has  
       2018-02-01 12:38:04 +08:00 via Android
    @PMinV2 作为一个运维 我想说的是
    阿里云的安全组和 iptables 防火墙是两个东西 详情可以看看阿里云帮助文档
    又是反向代理,又是 iptables 端口转发,还有安全组,老铁,你要闹哪样! 😁
    如果是我我会 安全组入口全部放行 iptables 禁用 只使用 nginx 代理即可
    tailf
        30
    tailf  
       2018-02-01 15:06:39 +08:00
    解决办法:


    1. 把 Nginx 删了
    2. 把防火墙的 9001 端口打开


    哦了。
    knva
        31
    knva  
       2018-02-01 15:53:54 +08:00
    反向代理 9001 有这么麻烦?
    下个宝塔面板点两下的事情..
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2716 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 07:03 · PVG 15:03 · LAX 23:03 · JFK 02:03
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.