Nginx 反向代理

2020/04/16 计算机网络

最近在云服务器部署了 Jupyter,跟其它服务都堆在一台主机上了,又不想暴露太多端口,所以就用 Nginx 搞了下反向代理。

首先,先为 Jupyter 分配一个域名,该域名指向 Nginx 所在主机。个人主页暂时用的是host.xxx.cn,于是给 Jupyter 分配了个subhost.host.xxx.cn,这个域名自己喜欢就好。

接着在 Nginx 中给 Jupyter 分配一个虚拟主机,虚拟主机文件jupyter.conf配置如下:

# 负载均衡,当然,目前只有一台机,完全可以不用这个配置
upstream jupyterServer {
    server  172.17.0.1:8889; # 这个就是 Jupyter 监听的 地址
#   server2 host:port; # 如果有多台机器,就可以用这种形式继续配置
}

# map 根据客户端请求中的 $http_upgrade 值,构造改变 $connection_upgrade 值
map $http_upgrade $connection_upgrade {
    default upgrade;
    '' close;
}

server {
    listen       80;
    server_name  subhost.host.xxx.cn; # 处理该域名下的请求

    location / {
        proxy_pass          http://jupyterServer; # jupyterServer 就是以上的 upstream 配置
        
        # 注意,以下首部一定要加,不然会出现问题。。因为反向代理之后 Host 首部不一样了,另外,还可能要用到其它协议
        proxy_http_version  1.1;
        proxy_set_header    Host $host;
        proxy_set_header    Upgrade $http_upgrade;
        proxy_set_header    Connection "upgrade";
    }
}

以上配置可以用来做负载均衡,当然也可以将upstream模块去除,直接将 Jupyter 监听地址写到proxy_pass中。服务器在接收到subhost.host.xxx.cn的任何请求时,都将该请求转发给172.17.0.1:8889处理。

将以上文件移动到 Nginx 默认配置目录中,并重启 Nginx。我用的是 Docker 中的 Nginx,如下操作:

$ docker cp jupyter.conf nginx:/etc/nginx/conf.d/jupyter.conf
$ docker restart nginx

现在访问http://subhost.host.xxx.cn:port应该可以正常访问 Jupyter 服务了,port指的是安全组允许通过的端口,而不是 Jupyter 本身监听的端口。这样就可以多个 Web 服务共用端口~

Jupyter 使用了 Websocket 服务,因此还要配置 map 模块以及相关首部,这个就不细说了,目前对 Websocket 协议不太了解。

Search

    Table of Contents