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

2018-02-01 09:34:00 +08:00
 PMinV2
  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

5345 次点击
所在节点    程序员
31 条回复
defunct9
2018-02-01 09:36:17 +08:00
开 ssh,我上去搞
cominghome
2018-02-01 09:36:48 +08:00
嗯,我相信你是产品经理
PMinV2
2018-02-01 09:40:05 +08:00
@defunct9 大佬要这么猛嘛
PMinV2
2018-02-01 09:40:25 +08:00
pepesii
2018-02-01 09:41:38 +08:00
什么意思,supervisor 的那个 web 界面,要通过 ng 代理?
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
2018-02-01 09:49:44 +08:00
@PMinV2 标准语。因为你描述的可能跟问题没有关联。嘿嘿
yxwzaxns
2018-02-01 09:51:41 +08:00
listen mydomain.com:9001;

listen 9001

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

Header 中的返回就一条提示:Referrer Policy:no-referrer-when-downgrade
yxwzaxns
2018-02-01 10:07:09 +08:00
@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
2018-02-01 10:24:49 +08:00
@msg7086 已经按你说的修复了,但是还是没能成功访问
PMinV2
2018-02-01 10:25:13 +08:00
@yxwzaxns 日志没有关于这个请求的。
PMinV2
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
2018-02-01 10:30:35 +08:00
@PMinV2 因为你没配置日志吧
SmiteChow
2018-02-01 10:33:34 +08:00
端口冲突了
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
2018-02-01 11:06:58 +08:00
顺便指正一下题主配置中得问题:

你的 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 里实现。

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

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

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

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

© 2021 V2EX