Nginx的http代理模块

227 阅读3分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 16 天,点击查看活动详情

作为一个优秀的代理服务器,有必要了解下Nginx的后端代理的使用

Http代理

之前了解了 Nginx 的基本使用方法,其实就是在配置文件里配置监听的服务器端口,用来接受请求。并且可以将本地文件映射为url,通过uri上路径的截取,返回对应的文件内容。

文件映射仅仅是 Nginx 提供的一个能力,使用 Nginx 还有一个重要的原因是,它还可以作为后端服务的反向代理来使用。客户端无需知道具体是哪一个服务器在提供服务。请求的流程可以看下。

image.png

客户端发送的请求到达 Proxy Server(这里代表 Nginx),Proxy Server会根据配置信息,选择一个 Backend Server,将请求转发过去。这里客户端只需要知道代理服务器,即 Nginx 的地址即可。所以 Nginx 可以对后端服务进行负载均衡。

怎么使用

回顾下 Nginx 的简单配置是怎么配置的,我们首先要在默认的三个路径/usr/local/nginx/conf/etc/nginx,以及 /usr/local/etc/nginx中的其中一个路径,创建 nginx.conf 文件。最简单的配置信息如下。

events {}
http {
    server {
        location / {
            # 没有指定端口默认是 80 端口
            # 将本地路径作为映射,打进来的请求会在这个文件夹下查找
            root /data/www;
        }
    }
}

代理服务器也很简单,我们只需要指定 proxy_pass 就可以了。我们来看看示例。

events {}
http {
    server {
        location / {
            proxy_pass       http://localhost:8000;
            proxy_set_header Host      $host;
            proxy_set_header X-Real-IP $remote_addr;
        }
    }
}

在这个配置下,Nginx 会监听 80 端口,并且将所有请求都转发到后端服务 localhost:8000 上,并且我们设置了两个请求头,Host 以及 X-Real-IP

那么如果我们有多个相同的服务,想要对这些相同服务进行负载均衡的话,就需要配置下负载均衡模块的东西了。负载均衡我们需要用到 upstream 来将相同的服务进行分组。

events {}
http {
    upstream backend {
        server srv1.backend.com;
        server srv2.backend.com;
        server srv3.backend.com;
    }
    server {
        listen 80;
        location / {
            proxy_pass http://backend;
        }
    }
}

这个配置配置了一组服务 backend,这一组服务中有三个需要负载均衡的后端服务:srv1.backend.comsrv2.backend.com 以及 srv3.backend.com。在 proxy_pass 字段配置的是分组名称,这样就完成了负载均衡。每个服务的情况有可能不一样,因此有时候需要配置负载均衡的策略。简单的根据权重分配请求的配置如下。

events {}
http {
    upstream backend {
        server srv1.backend.com weight=3;
        server srv2.backend.com;
        server srv3.backend.com;
    }
    server {
        listen 80;
        location / {
            proxy_pass http://backend;
        }
    }
}

其实就是在 服务器 配置后面加上 weight 字段,表示每个服务的权重。

完结

代理的配置以上就差不多了,可以应对一些集群的请求,有需要可以查看详细的文档。