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