nginx(3)nginx最全配置解析 \ 负载均衡 \ 虚拟主机 \nginx.conf配置解析

本文深入解析Nginx配置,涵盖虚拟主机(基于IP、域名、端口)和负载均衡(轮询、ip_hash、fair、url_hash等调度算法)。重点讨论了location的匹配逻辑和权重配置,以及如何利用upstream实现负载均衡。
摘要由CSDN通过智能技术生成

配置解析

如下为nginx的配置文件,做了解释以及部分补充配置

初学可以先简单过一下

#定义Nginx运行的用户和用户组(权限)
#user  nobody;
#进程数,建议设置为等于CPU总核心数。worker_processes  1;

#全局错误日志
#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#进程文件,记录当前启动的nginx的进程ID
#pid        logs/nginx.pid;

#工作模式及连接数上限
events {
    #单个后台worker_process进程的最大并发链接数
    worker_connections  1024;
    
    #补充,参考事件模型,
    #use [ kqueue | rtsig | epoll | /dev/poll | select | poll ]; 
    #epoll模型是Linux 2.6以上版本内核中的高性能网络I/O模型,如果跑在FreeBSD上面,就用kqueue模型。#use epoll;
    
}

#设定http服务器,利用它的反向代理功能提供负载均衡支持
http {
    #设定mime类型(邮件支持类型),类型由mime.types文件定义
    #mime.types文件扩展名与文件类型映射表
    include       mime.types;
    #默认文件类型
    default_type  application/octet-stream;
    
    #补充
    #默认编码
    charset utf-8; 
    #上传文件大小限制
    client_header_buffer_size 32k;

    #设定日志
    #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  logs/access.log  main;
    
    #开启高效文件传输模式
    sendfile        on;
    #在linux/Unix系统中优化tcp数据传输,仅在sendfile开启时有效
    #tcp_nopush     on;

    #连接超时时间
    #keepalive_timeout  0;
    keepalive_timeout  65;
    
    #gzip压缩开关
    #gzip  on;

    #HTTP服务器
    server {
        #监听80端口,80端口是知名端口号,用于HTTP协议
        listen       80;
        #域名可以有多个,用空格隔开
        server_name  localhost;
        
        #编码集
        #charset koi8-r;
        #日志相关
        #access_log  logs/host.access.log  main;

        location / {
            #主目录
            root   html;
            #首页(默认页)
            index  index.html index.htm;
        }
        

        #error_page  404              /404.html;

        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
  
    }

}

下面再抽出几个详细介绍,有的很多配置我也还没玩明白,以后会再出详细的文章,目前捡着能用到的看就可以,大概知道可以这么做就可以,我们需要多关注的是虚拟主机和负载均衡

虚拟主机

虚拟主机是一种特殊的软硬件技术,它可以将网络上的每一台计算机分成多个虚拟主机,每个虚拟主机可以独立对外提供服务,这样就可以实现一台主机对外提供多个web服务,达到一个反向代理的目的,每个虚拟主机之间是独立的,互不影响的

通过nginx可以实现虚拟主机的配置,nginx支持三种类型的虚拟主机配置

  • 基于ip的虚拟主机, (一块主机绑定多个ip地址)

  • 基于域名的虚拟主机(servername)

  • 基于端口的虚拟主机(listen如果不写ip端口模式)

如下一个Server就表示一个虚拟主机

http{
  server{
        #监听80端口,用于HTTP协议
        listen       80;
        #定义使用www.xx.com访问
        server_name  www.helloworld.com;
    
        #location 后面设置映射的路径
       location / {
            #定义服务器的默认网站根目录位置
            root        /root;        
            #定义首页索引文件的名称         
            index       index.html index.htm;  
       }
   }
}
映射/虚拟目录
#location URI {} 对当前路径及子路径下的所有对象都生效
location / {
   root        /root;                 #定义服务器的默认网站根目录位置
   index       index.html index.htm;  #定义首页索引文件的名称
}

#location URI {} 对当前路径的documents子路径下的所有对象都生效
location /documents/ {
    root        /root;                 #定义服务器的默认网站根目录位置
   index       index.html index.htm;  #定义首页索引文件的名称
}

#location ^~ URI {} 禁用正则表达式
location ^~ /images/ {
   root        /root;                 #定义服务器的默认网站根目录位置
   index       index.html index.htm;  #定义首页索引文件的名称
}

#location ~* URI {},此处的URI可使用正则表达式,*不区分字符大小写
location ~* \.(gif|jpg|jpeg)$ {
   root        /root;                 #定义服务器的默认网站根目录位置
   index       index.html index.htm;  #定义首页索引文件的名称
}

#location ~ URI {},此处的URI可使用正则表达式,区分字符大小写
location ~ \.(gif|jpg|jpeg)$ {
   root        /root;                 #定义服务器的默认网站根目录位置
   index       index.html index.htm;  #定义首页索引文件的名称
}

优先级:= > ^~ > |* > /|/dir/

location 的执行逻辑跟 location 的编辑顺序无关。

但是这句话不全对,如下

正则 location 的匹配规则是 顺序匹配,且只要匹配到第一个就停止后面的匹配

普通 location 的匹配规则是 最大前缀

普通location 与 正则 location 之间会先匹配普通 location ,再考虑匹配正则 location ,注意这里的考虑是可能的意思,也就是说匹配完 普通 location 后,有的时候需要继续匹配 正则 location ,有的时候则不需要继续匹配 正则 location 。

两种情况下,不需要继续匹配 正则 location :

  • 当普通 location 前面指定了“ ^~ ”,特别告诉 Nginx 本条普通 location 一旦匹配上,则不需要继续正则匹配;

  • 当普通location 恰好严格匹配上,不是最大前缀匹配,则不再继续匹配正则

负载均衡

上面说完了虚拟主机,可以做反向代理,反向代理配合upstream可以做负载均衡

upstream xxx{
    server 192.168.43.152:80;
    server 192.168.43.153:80;
}

location配合upstream转向实现负载

location / {
    proxy_pass xxx;#请求转向xxx定义的服务器列表
}
可选参数

weight(权重):指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。

down:表示当前的server暂时不参与负载

weight:默认为1.weight越大,负载的权重就越大。

backup:其它所有的非backup机器down或者忙的时候,请求backup机器。

upstream xxx{
    server 127.0.0.1:8050  weight=10 down;
    server 127.0.0.1:8060  weight=1;
    server 127.0.0.1:8060  weight=1 backup;
}

max_conns:可以根据服务的好坏来设置最大连接数,防止挂掉,比如服务器能接收1000,我们可以设置800

upstream xxx{
    server 127.0.0.1:8050    weight=5  max_conns=800;
    server 127.0.0.1:8060    weight=1;
}

max_fails:失败多少次 认为主机已挂掉则,踢出,公司资源少的话一般设置2~3次,多的话设置1次

max_fails=3 fail_timeout=30s:代表在30秒内请求某一应用失败3次,认为该应用宕机,后等待30秒,这期间内不会再把新请求发送到宕机应用,而是直接发到正常的那一台,时间到后再有请求进来继续尝试连接宕机应用且仅尝试1次,如果还是失败,则继续等待30秒…以此循环,直到恢复。

upstream xxx{
    server 127.0.0.1:8050    weight=1  max_fails=1  fail_timeout=20;
    server 127.0.0.1:8060    weight=1;
}
Nginx 支持的负载均衡调度算法方式如下:

①weight 轮询(默认): 如果不做配置接收到的请求按照顺序逐一分配到不同的后端服务器,即使在使用过程中,某一台后端服务器宕机,Nginx 会自动将该服务器剔除出队列,请求受理情况不会受到任何影响。

也可以给不同的后端服务器设置一个权重值,用于调整不同的服务器上请求的分配率。权重数据越大,被分配到请求的几率越大;该权重值,主要是针对实际工作环境中不同的后端服务器硬件配置进行调整的。

②ip_hash: 每个请求按照发起客户端的 ip 的 hash 结果进行匹配,这样的算法下一个固定 ip 地址的客户端总会访问到同一个后端服务器,这也在一定程度上解决了集群部署环境下 Session 共享的问题。

③fair: 智能调整调度算法,动态的根据后端服务器的请求处理到响应的时间进行均衡分配。

响应时间短处理效率高的服务器分配到请求的概率高,响应时间长处理效率低的服务器分配到的请求少,它是结合了前两者的优点的一种调度算法。但是需要注意的是 Nginx 默认不支持 fair 算法,如果要使用这种调度算法,请安装 upstream_fair 模块。

④url_hash: 按照访问的 URL 的 hash 结果分配请求,每个请求的 URL 会指向后端固定的某个服务器,可以在 Nginx 作为静态服务器的情况下提高缓存效率。同样要注意 Nginx 默认不支持这种调度算法,要使用的话需要安装 Nginx 的 hash 软件包。

在这里插入图片描述
关注公众号回复“资源”,可以免费领取架构师、大数据、AI等课程

回复“面试题”,可以获得大厂面试视频讲解

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值