掘金 后端 ( ) • 2024-03-31 14:43

theme: z-blue

nginx是什么?

nginx是一高性能的HTTP和反向代理服务器,支持负载均衡、缓存、访问控制,请求路由等功能。实际的应用中nginx用于提高网站的性能和可靠性,处理大量的并发连接,使得它非常适用于web服务器。

如何理解反向代理和正向代理

反向代理

代理服务器位于客户端和服务端之间,客户端的请求会先发送到代理服务器,然后由代理服务器向目标服务器进行转发请求,并获取到响应返回给客户端。

image.png

正向代理

正向代理的作用是在客户端和互联网之间充当中介角色,当客户端访问互联网的时候不是直接访问而是将请求发送给正向代理服务器,然后正向代理服务器将请求发送给互联网获取相关资源,在由正向代理服务器将资源转发给客户端

image.png

反向代理和正向代理其实主要的区别在于所处的位置的不同,如果处于服务端则nginx充当的就是反向代理服务器,如果处理客户端则nginx充当的就是正向代理服务器

docker安装nginx

定义docker-nginx-compose.yml文件

version: "3.2.0"
services:
    nginx01:
        image: nginx:1.16.1
        container_name: nginx01
        ports:
            - "5000:80"
        volumes:
            - "/C/wh-workspace/work_demo/src/main/resources/nginx/nginx01/index.html:/usr/share/nginx/html/index.html"
            - "/C/wh-workspace/work_demo/src/main/resources/nginx/nginx01/nginx.conf:/etc/nginx/nginx.conf"
            - "/C/wh-workspace/work_demo/src/main/resources/nginx/nginx01/default.conf:/etc/nginx/conf.d/default.conf"

        restart: always
        networks:
            net-nginx:
                ipv4_address: 172.18.0.2

    nginx02:
        image: nginx:1.16.1
        container_name: nginx02
        ports:
            - "5001:80"
        volumes:
            - "/C/wh-workspace/work_demo/src/main/resources/nginx/nginx02/index.html:/usr/share/nginx/html/index.html"
            - "/C/wh-workspace/work_demo/src/main/resources/nginx/nginx02/nginx.conf:/etc/nginx/nginx.conf"
            - "/C/wh-workspace/work_demo/src/main/resources/nginx/nginx02/default.conf:/etc/nginx/conf.d/default.conf"

        restart: always
        networks:
            net-nginx:
                ipv4_address: 172.18.0.3

    nginx03:
        image: nginx:1.16.1
        container_name: nginx03
        ports:
            - "5002:80"
        volumes:
            - "/C/wh-workspace/work_demo/src/main/resources/nginx/nginx03/index.html:/usr/share/nginx/html/index.html"
            - "/C/wh-workspace/work_demo/src/main/resources/nginx/nginx03/nginx.conf:/etc/nginx/nginx.conf"
            - "/C/wh-workspace/work_demo/src/main/resources/nginx/nginx01/default.conf:/etc/nginx/conf.d/default.conf"

        restart: always
        networks:
            net-nginx:
                ipv4_address: 172.18.0.4
networks:
    net-nginx:
        name: net-nginx
        driver: bridge
        ipam:
            config:
                - subnet: 172.18.0.0/16

创建容器

docker-compose -f docker-nginx-compose.yml up -d

image.png

验证是否创建成功

image.png

这里我修改了nginx默认的index.html 将Welcome to nginx! 改成了Welcome to nginx01!主要是为了区分不同的nginx界面。

nginx 反向代理配置

进入容器找到nginx的配置文件/etc/nginx/conf.d/default.conf

如果在容器外设置了相关的挂载,则不需要进入容器修改即可,我这里已经设置了挂载点

image.png

修改default.conf

image.png

进入容器加载nginx配置

nginx -s reload

浏览器访问http://localhost:5000/

image.png

可以看到已经跳转到百度地址了

nginx的负载均衡

常见的nginx负载均衡算法

1. 轮询算法

按照顺序将客户端请求轮询分配到不同的应用服务器上,简单点说就是“雨露均沾”,这也是nginx默认的算法,这种算法的缺点是如果服务器的性能不一致,就无法发挥好的服务器的性能,同时也无法给予不好的服务器分担压力。

2. 加权算法 加权顾名思义就是对不同的应用服务器给与不同的权重,一些好的服务器权重高,接收的请求频率就多,正所谓“能者多劳”.

3. ip_hash 获取客户端的IP地址,通过哈希函数计算得到的一个数值,用该数值对服务器列表的大小进行取模运算,得到的结果便是客户端要访问服务器的序号。采用源地址哈希法进行负载均衡,同一IP地址的客户端,当后端服务器列表不变时,它每次都会映射到同一台后端服务器进行访问。有人说ip_hash能保证session问题,因为同一个ip,只会请求到固定的一台服务器上,但是随着移动端的应用,你开车的时候上网的基站是动态的没法保证ip唯一,所谓的session还是没法保证。

4.最小连接访问 最小连接数算法比较灵活和智能,由于后端服务器的配置不尽相同,对于请求的处理有快有慢,它是根据后端服务器当前的连接情况,动态地选取其中当前积压连接数最少的一台服务器来处理当前的请求,尽可能地提高后端服务的利用效率,将负责合理地分流到每一台服务器。

加权算法示例

  1. nginx.conf定义应用服务器权重比

image.png

  1. default.conf绑定自定义的myservers

image.png

  1. 重新装载nginx的配置

  2. 验证负载均衡

image.png

image.png

注意:这里可能存在刷新没有变化的情况,很大的程度时浏览器对页面做了缓存,F12开启禁用缓存就可以了