美文网首页dibo
nginx从入门到精(fang)通(qi)

nginx从入门到精(fang)通(qi)

作者: 小胖学编程 | 来源:发表于2019-08-28 16:34 被阅读0次

    1. nginx的安装

    windows下nginx的安装及使用

    windows server服务器安装nginx出现错误1113: No mapping for the Unicode character exists in the target multi-byte code page

    2. nginx的特点

    2.1 nginx正向代理与反向代理

    正向代理最大的特点是客户端非常明确要访问的服务器地址;服务器只清楚请求来自哪个代理服务器,而不清楚具体来自哪个客户端。正向代理模式屏蔽或隐藏了真实的客户端信息。

    正向代理

    反向代理主要用于服务器集群分布式部署的情况,隐藏服务器的信息。nginx服务器收到请求后,按照一定的规则分发给后端的业务服务器进行处理。请求来源也就是客户端是明确的,但是请求具体由那台服务器处理是不明确的。

    反向代理

    举例说明:面试官(服务器),HR小姐姐(代理服务器),领导(反向代理),应聘者(客户端)。
    正向代理:我想来贵公司面试,只能给HR小姐姐发送简历。HR小姐姐就像一个正向代理。
    反向代理:我过来面试后,HR小姐姐通知领导后,领导安排一个面试官。领导就像一个反向代理。

    2.2 负载均衡

    我们理解了代理服务器的概念,那么,nginx扮演了反向代理的角色,它是依靠什么样的规则进行请求分发呢?

    负载均衡策略
    1. weight轮询(默认):接收到的请求按照顺序逐一分配到不同的后端服务器,即使在使用过程中,某一台后端服务器宕机,nginx会自动将该服务器剔除出队列,请求受理情况不会受到任何影响。 这种方式下,可以给不同的后端服务器设置一个权重值(weight 温特),用于调整不同的服务器上请求的分配率;权重数据越大,被分配到请求的几率越大;该权重值,主要是针对实际工作环境中不同的后端服务器硬件配置进行调整的。

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

    3. fair:智能调整调度算法,动态的根据后端服务器的请求处理到响应的时间进行均衡分配,响应时间短处理效率高的服务器分配到请求的概率高,响应时间长处理效率低的服务器分配到的请求少;结合了前两者的优点的一种调度算法。但是需要注意的是nginx默认不支持fair 烦儿算法,如果要使用这种调度算法,请安装upstream_fair模块

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

    3. Nginx的配置

    nginx的配置主要集中在nginx.conf这个配置文件中,并且所有的配置选项大概可以分为以下几个部分。

    
    main                                # 全局配置
     
    events {                            # nginx工作模式配置
     
    }
     
    http {                                # http设置
        ....
     
        server {                        # 服务器主机配置
            ....
            location {                    # 路由配置
                ....
            }
     
            location path {
                ....
            }
     
            location otherpath {
                ....
            }
        }
     
        server {
            ....
     
            location {
                ....
            }
        }
     
        upstream name {                    # 负载均衡配置
            ....
        }
    }
    

    如上述配置文件,主要由6部分组成

    1. main:主要进行nginx全局信息的配置;
    2. events:用于nginx工作模式的配置;
    3. http:用于进行http协议的信息;
      3.1 server:用于进行服务器访问信息的配置;
      3.1.1 location:(定位)用于进行访问路由的配置;
      3.2 upstream:(上游)用于进行负载均衡的配置;

    3.1 main模块

    # 定义Nginx运行的用户和用户组,默认nobody账号运行。
    # user nobody nobody;
    #nginx进程数,建议设置为等于CPU总核心数
    worker_processes 2;
    # 定义错误日志文件的位置及输出级别【debug / info / notice / warn / error / crit】
    # error_log logs/error.log
    # error_log logs/error.log notice
    # error_log logs/error.log info
    #用于指定进程id的存储文件的位置。
    # pid logs/nginx.pid
    #worker_rlimit_nofile: 用于指定一个进程可以打开最多文件数量的描述。
    worker_rlimit_nofile 1024;
    

    3.2 event模块

    event {
        #worker_connections是单个后台worker process进程的最大并发链接数,并发总数是 worker_processes 和 worker_connections 的乘积, 即 max_clients = worker_processes * worker_connections
        worker_connections 1024;
        #指定nginx在收到一个新连接通知后尽可能多的接受更多的连接。
        multi_accept on;
        #use epoll:配置指定了线程轮询的方法,如果是linux2.6+,使用epoll,如果是BSD如Mac请使用Kqueue。
        use epoll;
    }
    

    3.3 http模块

    作为web服务器,http模块是nginx最核心的一个模块,配置项也是比较多的。常规请求下,使用默认配置即可。

    http {
        ##
        # 基础配置
        ##
        # 开启高效文件传输模式,sendfile指令指定nginx是否调用sendfile函数来 输出文件,对于普通应用设为 on,如果用来进行下载等应用磁盘IO重负载应用,可设置 为off,以平衡磁盘与网络I/O处理速度,降低系统的负载。注意:如果图片显示不正常 把这个改成off。
        sendfile on;
        #让nginx在一个数据包中发送所有的头文件,而不是一个一个单独发
        tcp_nopush on;
        # 让nginx不要缓存数据,而是一段一段发送,如果数据的传输有实时性的要求的话可以配置它,发送完一小段数据就立刻能得到返回值,但是不要滥用哦
        tcp_nodelay on;
        # 长连接超时时间,单位是秒
        keepalive_timeout 65;
        #混淆数据,影响三列冲突率,值越大消耗内存越多,散列key冲突率会降低,检索速度更快;值越小key,占用内存较少,冲突率越高,检索速度变慢
        types_hash_max_size 2048;
        #虽然不会让nginx执行速度更快,但是可以在错误页面关闭nginx版本提示,对于网站安全性的提升有好处哦
        # server_tokens off;
     
        # server_names_hash_bucket_size 64;
        # server_name_in_redirect off;
         #指定在当前文件中包含另一个文件的指令
        include /etc/nginx/mime.types;
        #指定默认处理的文件类型可以是二进制
        default_type application/octet-stream;
     
        ##
        # SSL证书配置
        ##
     
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # Dropping SSLv3, ref: POODLE
        ssl_prefer_server_ciphers on;
     
        ##
        # 日志配置
        ##
        #设置存储访问记录的日志
        access_log /var/log/nginx/access.log;
        #设置存储记录错误发生的日志
        error_log /var/log/nginx/error.log;
     
        ##
        # Gzip 压缩配置
        ##
        #是告诉nginx采用gzip压缩的形式发送数据。这将会减少我们发送的数据量。
        gzip on;
        #为指定的客户端禁用gzip功能。我们设置成IE6或者更低版本以使我们的方案能够广泛兼容。
        gzip_disable "msie6";
     
        # gzip_vary on;
        # gzip_proxied any;
        # gzip_comp_level 6;
        # gzip_buffers 16 8k;
        # gzip_http_version 1.1;
        # gzip_types text/plain text/css application/json application/javascript
        text/xml application/xml application/xml+rss text/javascript;
     
        ##
        # 虚拟主机配置
        ##
     
        include /etc/nginx/conf.d/*.conf;
        include /etc/nginx/sites-enabled/*;
    

    3.3.1 http模块下的server模块

    server模块配置是http模块的一个子模块,用来定义一个虚拟访问主机,也就是一个虚拟服务器的配置信息。

    虚拟主机的定义
    server {
        #可匹配虚拟主机的ip+端口
        listen        80;
        #用于指定ip地址或域名,多个配置之间用空格分隔。
        server_name localhost    192.168.1.100;
        #表示整个server虚拟主机内的根目录,所有当前主机中web项目的根目录
        root        /nginx/www;
        #用户访问web网站时的全局首页
        index        index.php index.html index.html;
        #用于设置www/路径中配置的网页的默认编码格式
        charset        utf-8;
        #用于指定该虚拟主机服务器中的访问记录日志存放路径
        access_log    logs/access.log;
        # 用于指定该虚拟主机服务器中访问错误日志的存放路径
        error_log    logs/error.log;
        ......
    }
    

    Nginx在决定请求由哪个server块执行时,主要关注的是server块中的listener和server_name字段。

    listener指令

    listener字段定义server响应ip和端口如果没有明确配置listen字段,默认监听0.0.0.0:80(root)或者0.0.0.0:8080(非root)。

    listener可以配置为:

    1. 一个ip和端口的组合

    2. 一个单独的ip,默认监听80端口

    3. 一个单独的端口,默认监听所有的ip接口

    4. 一个Unix socket路径

    只要当listen指令无法找到最佳匹配时才会考虑评估server_name参数。即通过listen配置,找到多个server块。

    多个listen匹配时,将使用server_name进行进一步的精确匹配

    server_name指令

    如果根据listener指令无法得到最佳匹配,将开始解析server_name指令。nginx将会检查请求中的“Host”头,这个值包含了客户端试图请求的域名或者ip地址。nginx会根据这个值去匹配server_name指令。

    3.3.1.1 server模块下的location模块

    location模块是nginx配置出现最多的一个配置,主要用于配置路由访问信息。

    基本配置

    #直接匹配网站根,通过域名访问网站首页比较频繁,使用这个会加速处理,官网如是说。
    #这里是直接转发给后端应用服务器了,也可以是一个静态首页
    # 第一个必选规则
    location = / {
        proxy_pass http://tomcat:8080/index
    }
     
    # 第二个必选规则是处理静态文件请求,这是nginx作为http服务器的强项
    # 有两种配置模式,目录匹配或后缀匹配,任选其一或搭配使用
    location ^~ /static/ {                              //以xx开头
        root /webroot/static/;
    }
    location ~* \.(gif|jpg|jpeg|png|css|js|ico)$ {     //以xx结尾
        root /webroot/res/;
    }
     
    #第三个规则就是通用规则,用来转发动态请求到后端应用服务器
    #非静态文件请求就默认是动态请求,自己根据实际把握
    location / {
        proxy_pass http://backend;   #反向代理地址
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
    

    3.3.2 http模块下的upstream模块

    upstream模块主要负责负载均衡的配置,通过默认的轮询调度方式来分发请求到后端服务器。

    upstream backend{
        #ip_hash:指定请求调度算法,默认是weight权重轮询调度,可以指定
        ip_hash;
        #server host:port:分发服务器的列表配置
        server 192.168.1.100:8000;
        # down 表示该主机暂停服务
        server 192.168.1.100:8001 down;
        # max_fails:表示失败最大次数,超过失败最大次数暂停服务
        server 192.168.1.100:8002 max_fails=3;
       # fail_timeout:表示如果请求受理失败,暂停指定的时间之后重新发起请求
        server 192.168.1.100:8003 fail_timeout=20s;
        server 192.168.1.100:8004 max_fails=3 fail_timeout=20s;
    }
    

    4. nginx整体流程

    image.png
    1. 用户请求到达nginx服务器后,根据serve的listen和server_name找到具体的虚拟访问主机。
    2. 根据url的不同,找到server模块中的location。
    3. 根据location模块中的proxy_pass(反向代理配置),找到具体的upstream。
    4. 根据upstream的负载策略,直接请求到相应的服务器地址。

    5. 遇到的问题以及处理方案

    Nginx报502错误,日志connect() failed (111: Connection refused) while connecting to upstream的最终完美有效解决方案

    文章参考

    nginx location配置详细解释

    Nginx详解(正向代理、反向代理、负载均衡原理)

    理解Nginx中Server和Location的匹配逻辑

    nginx.conf配置文件解析(http、server、location)

    相关文章

      网友评论

        本文标题:nginx从入门到精(fang)通(qi)

        本文链接:https://www.haomeiwen.com/subject/nndpectx.html