Code前端首页关于Code前端联系我们

Ngnix核心配置:反向代理、负载均衡、动静分离

terry 2年前 (2023-09-28) 阅读数 73 #未命名

作者:京东物流殷世杰

Nginx广泛用于部署J-one和Jdos环境。本文介绍Nginx的典型配置和基本功能。适合Nginx入门学习的讲解。

1 基本配置

在Nginx安装目录下的conf目录下找到nginx.conf文件。它提供了Nginx的基本功能配置。

Nginx配置文件(conf/nginx.conf)整体分为以下几个部分:

区域职责
全局块与Nginx运行相关的配置及全局配置
事件块 配置配置和网络连接相关配置
http 块 配置代理、缓存、日志记录、虚拟主机等配置
服务器块 配置虚拟主机、http 相关参数一个服务器中可以有多个服务器块。位置块配置请求的路由和不同页面的处理。配置层次图如下。 Ngnix 核心配置:反向代理、负载均衡、动静分离

1.2 配置文件示例

一个比较完整的配置文件示例如下。

# 以下是全局段配置
#user administrator administrators;  #配置用户或者组,默认为nobody nobody。
#worker_processes 2;  #设置进程数,默认为1
#pid /nginx/pid/nginx.pid; #指定nginx进程运行文件存放地址
error_log log/error.log debug;  #制定日志路径,级别:debug|info|notice|warn|error|crit|alert|emerg
# events段配置信息
events {
    accept_mutex on;   #设置网路连接序列化,防止惊群现象发生,默认为on
    multi_accept on;  #设置一个进程是否同时接受多个网络连接,默认为off
    #use epoll;      #事件驱动模型,select|poll|kqueue|epoll|resig|/dev/poll|eventport
    worker_connections  1024;    #最大连接数,默认为512
}
# http、配置请求信息
http {
    include       mime.types;   #文件扩展名与文件类型映射表
    default_type  application/octet-stream; #默认文件类型,默认为text/plain
    #access_log off; #取消服务日志    
    log_format myFormat '$remote_addr–$remote_user [$time_local] $request $status $body_bytes_sent $http_referer $http_user_agent $http_x_forwarded_for'; #自定义格式
    access_log log/access.log myFormat;  #combined为日志格式的默认值
    sendfile on;   #允许sendfile方式传输文件,默认为off,可以在http块,server块,location块。
    sendfile_max_chunk 100k;  #每个进程每次调用传输数量不能大于设定的值,默认为0,即不设上限。
    keepalive_timeout 65;  #连接超时时间,默认为75s,可以在http,server,location块。


    upstream mysvr {   
      server 127.0.0.1:7878;
      server 192.168.10.121:3333 backup;  #热备
    }
    error_page 404 https://www.baidu.com; #错误页
    # 第一个Server区块开始,表示一个独立的虚拟主机站点
    server {
        keepalive_requests 120; #单连接请求上限次数。
        listen       4545;   #监听端口
        server_name  127.0.0.1;   #监听地址       
        location  ~*^.+$ {       #请求的url过滤,正则匹配,~为区分大小写,~*为不区分大小写。
           #root path;  #根目录
           #index vv.txt;  #设置默认页
           proxy_pass  http://mysvr;  #请求转向mysvr 定义的服务器列表
           deny 127.0.0.1;  #拒绝的ip
           allow 172.18.5.54; #允许的ip           
        } 
    }
}

1.3 locat 解释路径映射

1.3.1 格式:

location [ = | 〜| 〜* | !~ | !~* | @ ] uri {...}

1.3.2 解释:

=表示精确匹配,如果找到,立即停止搜索并立即处理请求。

~表示正常匹配,区分大小写匹配

~*表示正常匹配,不区分大小写匹配

!~区分大小写,不匹配

!~*不区分大小写 不匹配

^~ 表示仅匹配常规字符(空格)。使用前缀匹配,^表示“否”,表示不搜索正则表达式。如果匹配成功,则不会再匹配其他位置。

@ 指定通常仅用于内部重定向请求的命名位置。例如error_page、try_files

uri就是要匹配的请求字符串,可能包含也可能不包含正则表达式;

1.3.3 优先级及示例:

  • [未添加] 反向代理是通过 proxy_pass 指令实现的。

    2.2 反向代理示例:

    server {
        listen       80;
        server_name  localhost;
    
    
        location / {
             proxy_pass http://localhost:8081;
             proxy_set_header Host $host:$server_port;#为请求头添加Host字段,用于指定请求服务器的域名/IP地址和端口号。  
    
    
             # 设置用户ip地址
             proxy_set_header X-Forwarded-For $remote_addr;#为请求头添加XFF字段,值为客户端的IP地址。
             # 当请求服务器出错去寻找其他服务器
             proxy_next_upstream error timeout invalid_header http_500 http_502 http_503;
        
    
    

    当我们访问 localhost 时,ngnix 会将我们的请求转发到 localhost:8081

    3 负载均衡

    3.1 负载均衡概念:

    当有 2 个或更多服务器时,代理服务器会将请求按照规则分发到特定的服务器进行处理。

    3.2 负载均衡策略及示例:

    Nginx 目前支持多种负载均衡策略。这里有6个常用的。

    3.2.1RR(循环:默认投票):

    每个请求按照时间顺序依次分配到不同的后端服务器,即第一个请求分配到第一个服务器,第二个请求分配到第二个服务器。第一个服务器。第一个请求被分配给另一台服务器。如果只有两台服务器,则第三个请求将继续分配给第一台服务器。如此循环下去,意味着服务器接收请求的比例为1:1。如果后端服务器宕机,可以自动删除。轮询是默认配置,不需要太多配置

    同一个项目分别使用8081和8082端口启动项目

    upstream web_servers {
       server localhost:8081;
       server localhost:8082;
    }
    
    server {
        listen       80;
        server_name  localhost;
        #access_log  logs/host.access.log  main;
        location / {
            proxy_pass http://web_servers;
            proxy_set_header Host $host:$server_port;
        }
     
    
    

    3.2.2热备:

    假设有2台服务器。当一台服务器发生灾难时,另一台服务器可以提供服务。服务器处理请求的顺序:AAAAAA。突然A挂断了电话。服务器处理请求的顺序:BBBBBBBBBBBBBB...

    upstream web_servers {
          server 127.0.0.1:7878; 
          server 192.168.10.121:3333 backup;  #热备     
        }
    
    

    3.2.3 权重

    根据配置的权重将不同数量的请求分发到不同的服务器。 。如果未设置,则默认为 1。以下服务器的请求顺序为:ABBABBABBABBABBB....

    upstream web_servers {
        server localhost:8081 weight=1;
        server localhost:8082 weight=2;
    }
    
    

    3.2.4 ip_hash

    这样每个IP地址都有固定的访问后端服务器的权限,可以解决会话问题。

    upstream test {
        ip_hash;
        server localhost:8080;
        server localhost:8081;
    }
    
    

    3.2.5 fair(第三方)

    根据后端服务器的响应时间分配请求,响应时间短的优先分配。此配置是为了更快地响应用户。

    upstream backend {
        fair;
        server localhost:8080;
        server localhost:8081;
    }
    
    

    3.2.6 url_hash(第三方)

    根据访问的URL的哈希结果分发请求,使每个URL都定向到同一个后端服务器。如果后端服务器有缓存的话效率会更高。将哈希语句添加到上述流中。 hash_method是使用的哈希算法

    upstream backend {
        hash_method crc32;
        hash $request_uri;
        server localhost:8080;
        server localhost:8081;
    }
    
    

    以上6种负载均衡适合不同的情况,可以单独使用,也可以混合使用。您可以根据实际情况决定使用它们。 Fair和url_hash必须安装第三方模块才能使用。

    4 动静分离:

    4.1 动静分离的概念:

    动静分离是指将静态页面与动态页面或静态内容界面和动态内容界面针对不同的场景进行分离的架构设计方法。 Web 服务器架构中的访问系统。 ,从而提高整体服务访问效率和持久性。

    4.2 动静分离示例:

    upstream web_servers {
           server localhost:8081;
           server localhost:8082;
    }
    server {
        listen       80;
        server_name  localhost;
        set $doc_root /usr/local/var/www;
    
    
        location ~* \.(gif|jpg|jpeg|png|bmp|ico|swf|css|js)$ {
           root $doc_root/img;
        }
        location / {
            proxy_pass http://web_servers;
            proxy_set_header Host $host:$server_port;
        }
        error_page 500 502 503 504  /50x.html;  #出现 500 502 503 504错误时走内部跳转
        location = /50x.html { 
            root $doc_root;
        }
     }
    
    

    结果:访问http://localhost/test.jpg时,直接返回/usr/local/var/www/img路径下的图片。

    访问http://localhost /index.html会访问后端服务器(tomcat等)

    5其他常用指令:

    5.1.return指令

    返回http状态码和可选第二个参数可以重定向 URL

    return code [text];
    return code URL;
    return URL;
    例如:
    location / {
     return 404; # 直接返回状态码
    }
    location / {
     return 404 "pages not found"; # 返回状态码 + 一段文本
    }
    location / {
     return 302 /bbs ; # 返回状态码 + 重定向地址
    }
    location / {
     return https://www.baidu.com ; # 返回重定向地址
    }
    
    

    5.2 重写指令

    Rewrite URI 重写请求,使用具有 1 个可选参数和 2 个必需参数的重写指令,在请求处理期间多次更改请求 URI。

    第一个(必需)参数是请求 URI 必须匹配的正则表达式。

    第二个参数是用于替换匹配URI的URI。

    可选第三个参数重写策略

    • last使用重写后的URL发起新的请求,重新进入服务器段并在该位置重试匹配;
    • break直接使用重写后的URL,不再匹配其他位置的语句;
    • redirect 返回临时 302 重定向;
    • 永久返回301永久重定向;
    location /users/ {
        rewrite ^/users/(.*)$ /show?user=$1 break;
    }
    
    

    5.3 error_page 指令

    error_page 指令允许您配置 NGINX 返回自定义页面和错误代码、替换响应中的其他错误代码或将浏览器重定向到不同的 URI。在以下示例中,error_page 指令指定返回 404 页面错误代码的页面 (/404.html)。 ?可以使用的内置变量以美元符号 $ 开头。在它们之间,客户端发送并传输大多数预定义变量的值。

    • $args: # 该变量与请求行中的参数相同,与$query_string
    • $content_length:请求头中的内容长度字段相同。
    • $content_type:请求头中的Content-Type字段。
    • $document_root:当前请求的根指令中指定的值。
    • $host:请求行的主机名,如果为空则为 Host 请求头字段中的主机名,如果再次为空则为与请求匹配的 server_name
    • $ http_user_agent:客户端代理信息
    • $http_cookie:客户端cookie信息
    • $limit_rate:该变量可以限制连接速度。
    • $request_method:客户端请求的操作,通常是 GET 或 POST。
    • $remote_addr:客户端IP地址。
    • $remote_port:客户端端口。
    • $remote_user:已通过认证基础模块认证的用户名。
    • $request_filename:使用根或别名指令和请求 URI 创建的当前请求的文件路径。
    • $scheme:HTTP 方法(例如 http、https)。
    • $server_protocol:请求使用的协议,通常是HTTP/1.0或HTTP/1.1。
    • $server_addr:服务器地址,该值可以在系统调用完成后确定。
    • $server_name:服务器名称。
    • $server_port:请求到达服务器的端口号。
    • $request_uri:包含除主机名之外的请求参数的原始URI,如:“/foo/bar.php?arg=baz”。
    • $uri:当前没有请求参数的URI,$uri不包含主机名,例如“/foo/bar.html”。
    • $document_uri:与$uri相同

    6 总结

    Ngnix是一个高性能的反向代理服务器。这是非常有必要学习的。本文介绍了基本的 Ngnix 配置并介绍了反向代理和负载平衡。 、动静态分离的三个主要功能,最后扩展了一些常用的指令。

版权声明

本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。

热门