细说nginx系列之应用场景介绍

Posted Simple is Awesome

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了细说nginx系列之应用场景介绍相关的知识,希望对你有一定的参考价值。

目录

官网:https://nginx.org/

nginx是一个高性能的http服务器,反向代理服务器,负载均衡器和邮件代理服务器。

HTTP服务器

nginx可以独立提供http服务,常用于静态网页服务器。
nginx作为http服务器时,支持虚拟主机,可以实现在一台服务器部署多个网站。
nginx作为http服务器

在nginx中配置虚拟主机非常方便,添加多个server块即可。
有2种方式配置多个server块:

方法1:直接在http块下配置多个server块

http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  \'$remote_addr - $remote_user [$time_local] "$request" \'
                      \'$status $body_bytes_sent "$http_referer" \'
                      \'"$http_user_agent" "$http_x_forwarded_for"\';

    access_log  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    #gzip  on;

    # 配置虚拟主机1
    server {
        listen       80;
        server_name  localhost;

        charset koi8-r;
        access_log  /var/log/nginx/host.access.log  main;

        location / {
            # 网站1的根目录
            root   /usr/share/nginx/html/web1;
            index  index.html index.htm;
        }

        error_page  404               /404.html;
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   /usr/share/nginx/html;
        }
    }

    # 配置虚拟主机2
    server {
        listen       81;
        server_name  localhost;

        charset koi8-r;
        access_log  /var/log/nginx/host.access.log  main;

        location / {
            # 网站2的根目录
           root   /usr/share/nginx/html/web2;
           index  index.html index.htm;
        }

        error_page  404               /404.html;
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   /usr/share/nginx/html;
        }
    }
}

如上所示,通过2个server块配置了2个虚拟主机(部署2个不同的网站),分别运行在2个不同的服务端口(80和81)。

方法2:将server块独立配置在不同的配置文件中,并通过include指令在http块中引用

http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  \'$remote_addr - $remote_user [$time_local] "$request" \'
                      \'$status $body_bytes_sent "$http_referer" \'
                      \'"$http_user_agent" "$http_x_forwarded_for"\';

    access_log  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    #gzip  on;

    # 通过include指令引用不同的server配置
    include /etc/nginx/conf.d/*.conf;
}

如上所示,在nginx配置文件中通过include指令引用不同的server配置文件:将不同server块的配置分别放在不同的独立文件中。
例如,在“/etc/nginx/conf.d”下存在不同的server配置:web1.conf,web2.conf。

# web1.conf文件内容
server {
    listen       80;
    server_name  localhost;

    charset koi8-r;
    access_log  /var/log/nginx/host.access.log  main;

    location / {
        # 网站1的根目录
        root   /usr/share/nginx/html/web1;
        index  index.html index.htm;
    }

    error_page  404               /404.html;
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
}

# web2.conf文件内容
server {
    listen       81;
    server_name  localhost;

    charset koi8-r;
    access_log  /var/log/nginx/host.access.log  main;

    location / {
        # 网站2的根目录
        root   /usr/share/nginx/html/web2;
        index  index.html index.htm;
    }

    error_page  404               /404.html;
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
}

反向代理服务器

除了作为静态web服务器,作为后端应用的反向代理也是nginx最为常见的使用场景。
nginx作为反向代理

当nginx作为后端应用的反向代理时,充当的是后端应用的网关角色,即:所有到后端应用的请求都要经过nginx。
那么,为什么需要nginx作为后端应用的反向代理呢?大概有这些理由:
首先,nginx作为网关,可以对后端应用起到一定的保护作用,如:请求拦截可以直接在nginx这一层进行实现,避免非法请求进入到后端应用。
其次,如果后端应用支持水平伸缩,当进行集群化部署时,nginx作为统一访问入口,后端应用的变化无需客户端感知,起到解耦的作用。
再者,nginx本身的高性能,可以支撑相当量的并发。

配置nginx作为反向代理时,需要注意2个配置要点:
(1) 使用指令upstream指定一个后端应用组
(2) 在location块上指定需要设置反向代理的后端应用组名(或者访问地址)

nginx作为反向代理的完整配置模板如下所示:

http {
    # 使用upstream指令指定一个后端应用组
    upstream tomcat1 {
        server 192.168.56.103:8080;
    }

    server {
        # 在location块上设置反向代理
        localtion / {
            proxy_pass http://tomcat1/;
        }
    }
}

特别注意:
在配置反向代理时,如果location的映射地址不是“/”而是“/xxx”时,proxy_pass指令之后的访问地址末尾带“/”和不带“/”的效果是完全不一样的,具体来讲:
(1) 当location的映射地址为“/”时,proxy_pass指令指定的访问地址末尾带“/”和不带“/”的效果是一样的;
(2) 当location的映射地址为“/xxx”时,如果proxy_pass指令指定的访问地址末尾带“/”,那么在访问“/xxx”时,实际访问的就是目标服务器的根路径,即:“/”;
(3) 当location的映射地址为“/xxx”时,如果proxy_pass指令指定的访问地址末尾不带“/”,那么在访问“/xxx”时,实际访问的是目标服务器的“/xxx/”路径;

如下图详细说明了上述三种情况的实际表现:
nginx反向代理pass_proxy指令配置效果

实际上,nginx作为反向代理时,同一个nginx实例既可以作为一个虚拟主机下多个应用的反向代理,也可以作为多个虚拟主机的反向代理。

作为一个虚拟主机下多个应用的反向代理

nginx作为一个虚拟主机下多个应用的反向代理

当nginx作为同一个虚拟主机下多个应用的反向代理时,是通过不同的uri路径来区分不同的应用的,即:需要在不同的location块上应用对应的反向代理配置。

http {
    upstream app1 {
        server 192.168.56.103:8080;
    }

    upstream app2 {
        server 192.168.56.104:8080;
    }

    # 在同一个虚拟主机下为多个应用配置反向代理
    server {
        listen 80;
        server_name localhost;

        location /app1 {
            proxy_pass http://app1/;
        }

        location /app2 {
            proxy_pass http://app2/;
        }
    }
}

作为多个虚拟主机的反向代理

nginx作为多个虚拟主机的反向代理

当nginx作为多个虚拟主机的方向代理时,首先需要配置多个虚拟主机,再在每个虚拟主机下配置反向代理。

http {
    upstream app1 {
        server 192.168.56.103:8080;
    }

    upstream app2 {
        server 192.168.56.104:8080;
    }

    # 在虚拟主机1(监听80端口)下配置反向代理
    server {
        listen 80;
        server_name localhost;

        location / {
            proxy_pass http://app1/;
        }
    }

    # 在虚拟主机2(监听81端口)下配置反向代理
    server {
        listen 81;
        server_name localhost;

        location / {
            proxy_pass http://app2/;
        }
    }
}

负载均衡器

nginx作为负载均衡器

负载均衡并不是nginx的核心功能,只能算是一个副业,无法跟专业的负载均衡器相比(如:LVS,HAProxy)。
nginx只能支持特定几种协议的负载均衡,如:HTTP,HTTPS,FastCGI, uwsgi, SCGI, memcached和gRPC,同时也可以作为这几种协议的反向代理。
实际上,nginx作为负载均衡器的场景通常就是作为反向代理。
具体来讲,如果后端应用支持水平扩容,当进行集群部署时,使用nginx作为后端应用的反向代理,即:在upstream指令配置的服务器组中部署的是同一个应用。

简单轮训策略

如下是nginx作为负载均衡器的默认配置,采用简单轮训策略进行数据转发。

upstream app {
    server 192.168.56.103:8080;
    server 192.168.56.104:8080;
}

nginx除了支持简单的寻轮策略转发之外,还支持如下三种转发策略:最小连接数策略,客户端IP哈希策略,指定权重策略。

最小连接数策略

最小连接数策略是指nginx会优先将请求转发给负载较小的服务器,这样可以确保请求能尽快地得到响应,同时也尽可能地避免后端应用因为负载过大被压垮。
如下是“最小连接数策略”的配置模板:

upstream app {
    least_conn;
    server 192.168.56.103:8080;
    server 192.168.56.104:8080;
}

如上所示,通过指令“least_conn”配置最小连接数策略。

客户端IP哈希策略

客户端IP哈希是指将指定客户端的请求都转发到一个特定的服务器,这样可能会导致某些后端服务器的压力过大。
配置模板如下:

upstream app {
    ip_hash;
    server 192.168.56.103:8080;
    server 192.168.56.104:8080;
}

如上所示,通过指令“ip_hash”配置最小连接数策略。

服务器权重策略

在服务器权重策略下,大多数请求都会被转发到权重较大的后端服务器。
实际上,简单轮训策略是服务器权重策略的一个特例,即:所有后端服务器的权重都是相同的,所以将请求轮训转发到各个后端服务器。
如下为“服务器权重策略”的配置模板:

upstream app {
    server 192.168.56.103:8080 weight=3;
    server 192.168.56.104:8080;
}

在上述配置下,由于“192.168.56.103”的权重比“192.168.56.104”的权重大,假设总共有3次请求,那么有2次将会被转发到“192.168.56.103”。

显然,在权重策略下,是人为控制后端应用的负载。

邮件代理服务器

nginx作为邮件代理服务器

nginx支持对IMAP,POP3和SMTP协议的代理,关于配置nginx作为邮件代理服务器的具体参数详见:https://docs.nginx.com/nginx/admin-guide/mail-proxy/mail-proxy/

【参考】
https://nginx.org/en/docs/ nginx文档
https://nginx.org/en/docs/beginners_guide.html nginx新手入门
https://www.nginx.com/resources/admin-guide/ nginx管理手册
https://mp.weixin.qq.com/s/WWOlTIrYZZ5pvlALttFL8w Nginx 的反向代理及负载均衡
https://www.cnblogs.com/tugenhua0707/p/9880515.html nginx的反向代理proxy_pass指令
https://blog.51cto.com/wangwei007/1103734 Nginx配置proxy_pass转发的/路径问题

以上是关于细说nginx系列之应用场景介绍的主要内容,如果未能解决你的问题,请参考以下文章

细说Redis之 Redis的数据结构与应用场景

细说Redis之 Redis的持久化

2 万字 + 20张图| 细说 Redis 九种数据类型和应用场景

高并发系列:垂直性能优化之细说负载均衡

高并发系列:垂直性能优化之细说负载均衡

应用场景系列之:流量管理下的熔断场景