Nginx 代理实践应用


Nginx 作为网络代理领域的绝对王者,在系统中的方方面面都能看到它的身影。

在之前的博客中,我们深入介绍了如何安装与配置服务,如果你没看过先行回顾:Nginx代理与负载教程

今天让我们更进一步,以具体的应用场景介绍 Nginx 的强大之处

1. 请求藏匿

在正向代理请求服务中,可将 Nginx 作为网络跳板机,代理客户端对外发起请求。从外部的角度,其只能看到代理服务器的信息,而无法感知其真正的客户端。

如下述配置即开放了 8888 端口作为代理服务,在客户端上配置此代理服务。当客户端发起请求后,将由代理服务对外发起请求,再将结果回传客户端,客户端在整个请求链路中对外都是无感知不可见。

server {
    listen 8888;

    location / {
        proxy_pass $scheme://$http_host$request_uri;
        proxy_set_header Host $http_host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}

2. 服务藏匿

与上述的场景类似,请求藏匿是双向的,反之同样可实现服务藏匿。

最经典的场景即在服务器 A 部署了某系统,但服务器上同时部署了其它服务你并不想对外暴露,当然你可以通过白名单及防火墙配置实现。

但你也可通过空白服务器 B 作为对外服务网关,由服务器 B 对外提供服务,将请求转发至服务器 A。以此方式服务器 A 完全属于内网服务,对于外部系统同样不可感知。

例如服务部署于 192.168.0.1 节点,那么我们即可在 192.168.0.2 节点中部署 Nginx 服务,并通过下述配置实现服务的反向代理至 192.168.0.1 节点。如此一来,外部系统只能通过 192.168.0.2 访问系统,我们便实现真正的服务藏匿。

server {
    listen 5000;
        
    location / {
        proxy_pass http://192.168.0.1:4000/;       
        
        proxy_set_header HOST $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

3. 无感升级

在上述的两类示例中,都是网络安全的场景下应用,但 Nginx 能力不仅如此,在服务性能提升上也依然强劲。

我们都知道通过 upstream 配置可轻松实现集群下多节点负载均衡,从而提供系统吞吐量。那在单体环境下,Nginx 优势是否就荡然无存?

答案很显然不是,即便在单节点服务中,利用 upstream 仍然能够实现不停机的服务升级,下面让我们来看一下具体如何实现。

例如在服务器中部署了 192.168.0.1:4000 节点,并以 192.168.0.1:80 端口对外开放服务,配置如下:

server {
    listen 80;
        
    location / {
        proxy_pass http://192.168.0.1:4000/;       
        
        proxy_set_header HOST $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

将上述的配置通过 upstream 改造为下述配置方式:

http {
    upstream host_list {
        server http://192.168.0.1:4000/ weight=1;
    }

   server {
        listen       80;

        location / {
            # 请求转发 host_list 服务列表
            proxy_pass host_list;

            proxy_set_header HOST $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }
    }
}

若此时需要操作系统服务升级,在不接入 Nginx 的场景下即停止旧服务然后等待新服务启动,而这整个过程中系统服务都处于宕机不可用。

而在 Nginx 介入的场景中,在上述的配置示例中,在不停止旧服务的前提下可部署新版服务,待新服务启动之后调整 host_list 配置如下:

upstream host_list {
    # 旧服务权重为 0 关闭
    server http://192.168.0.1:4000/ weight=0;

    # 新服务配置权重开启服务
    server http://192.168.0.1:4001/ weight=1;
}

完成配置之后通过 reload 重新加载配置使之生效:

nginx -s reload

在整个服务切换过程中,用户仍可正常访问旧服务,避免了升级出现服务长时间宕机不可用的情况,极大提高了用户使用体验。


文章作者: 烽火戏诸诸诸侯
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 烽火戏诸诸诸侯 !
  目录