• 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转发的/路径问题

  • 相关阅读:
    python+selenium框架
    django--form组件
    python +selenium上传文件
    python--UI---登录---验证码
    python+selenium button定位方法
    css-定位技术
    css-盒子模型
    css-元素分类
    序列化
    FileUploadController
  • 原文地址:https://www.cnblogs.com/nuccch/p/11874250.html
Copyright © 2020-2023  润新知