美文网首页
高性能Nginx最佳实践

高性能Nginx最佳实践

作者: 右耳菌 | 来源:发表于2022-07-28 13:35 被阅读0次

    1. Nginx的简介

    相关内容,可以查看 【Nginx 负载均衡】,这是我之前的一篇文章,这里就懒得再说明一次了。


    2. Nginx监听端口

    • 基本语法: listen address:port

    • 默认:listen 80;

    • 作用: listen参数决定Nginx服务器如何监听端口。在listen后可以加IP地址,端口和主机名,非常灵活。

    • 例如:

    listen 127.0.0.1:8000;
    listen 127.0.0.1;/默认80端口
    listen 8000; / / listen *:8000; / / listen localhost:8000;

    • 例子
    worker_processes auto;
    pid /run/nginx.pid; #指定了进程号,如果报错就注释掉吧,不然nginx -t 会提示失败
    
    events {
      #use epoll; # 仅用于linux2.6以上内核,如果报错就注释掉吧
      worker_connections 65535;
    }
    
    http {
      server {
        listen 80; #监听80端口
        location / {
          default_type text/html;
           return 200 "Hello, Nginx! Here the port is 80! \n";
        }
      }
    
      server {
        listen 8080; #监听8080端口
        location / {
          default_type text/html;
           return 200 "Hello, Nginx! Here the port is 8080! \n";
        }
      }
    
    }
    
    • 扩展语法:
    listen address:port [default(deprecated in in 0.8.21)|default_server|[backlog=num|rcvbuf=size|sndbuf=size|accept_filter=filter|deferred|bind|ipv6only=[on[off]|ssl]];
    
    listen可用参数的意义

    3. Nginx虚拟主机

    Nginx虚拟主机
    • 例子
    worker_processes auto;
    pid /run/nginx.pid; #指定了进程号,如果报错就注释掉吧,不然nginx -t 会提示失败
    
    events {
      #use epoll; # 仅用于linux2.6以上内核,如果报错就注释掉吧
      worker_connections 65535;
    }
    
    http {
    
      upstream origin.lazyfennec.cn {
        server 127.0.0.1:8080;
      }  
    
      server {
        listen 80; #监听80端口
        server_name test.lazyfennec.cn;
        location / {
          proxy_pass http://origin.lazyfennec.cn;
        }
      }
      
     #实际的处理业务服务
      server {
        listen 8080; #监听8080端口
        location / {
          default_type text/html;
           return 200 "Hello, Nginx! Here the port is 8080! \n";
        }
      }
    }
    

    以上内容如果在本机测试,记得修改hosts文件,在单独的一行(为了避免可能被覆盖的情况,建议放到最后),添加以下内容(请按照自己的需求进行修改)

    127.0.0.1 test.lazyfennec.cn
    
    测试结果

    4. 重点 之 Nginx配置location

    语法: location [=*I^l@]/uri/{…}
    配置块:server
    详情: location会尝试根据用户请求中的uri来匹配上面的uri表达式,如果可以匹配,就选择lcoation块中的配置来处理用户请求。当然,匹配方式是多样的。

    • = /uri表示完全匹配。
    • ~/uri表示匹配URI时时大小写敏感的。
      (注意,如果系统本身就是大小写不敏感的,那么这里的大小写敏感将不会生效,也就是说,如果要使用大小写敏感,请不要使用Windows系统作为nginx的运行服务器)
    • ~*/uri表示匹配URI时忽略大小写。
    • ^~/uri表示匹配URI时只需要其前半部分匹配即可。
    • /uri不带任何修饰符,也表示前缀匹配,但是在正则匹配之后。
    • /通用匹配,任何未匹配到其它location的请求都会匹配到,相当于switch中的default。

    注意:location是有顺序的,如果一个请求有可能被多个location匹配,实际上这个请求会被第一个与之匹配的location处理。

    最后location /{会处理所有的请求}

    • 例子
    worker_processes auto;
    pid /run/nginx.pid; #指定了进程号,如果报错就注释掉吧,不然nginx -t 会提示失败
    
    events {
      #use epoll; # 仅用于linux2.6以上内核,如果报错就注释掉吧
      worker_connections 65535;
    }
    
    http {
    
      server {
        listen 80; #监听80端口
    
        location / {
          default_type text/html;
          return 200 "local /: I am default location!\n";
        }
    
        location = /goodjob {
          default_type text/html;
          return 200 "location = /goodjob\n";
        }
    
        # 大小写敏感
        location ~ /Goodjob {
          default_type text/html;
          return 200 "location ~ /Goodjob\n";
        }
    
        # 大小写不敏感
        location ~* /goodjob {
          default_type text/html;
          return 200 "location ~* /goodjob\n";
        }  
        
        # 前缀匹配
        location ^~ /goodjob {
          default_type text/html;
          return 200 "location ^~ /goodjob \n";
        } 
      }
    }
    

    5. Nginx 常规配置

    • 定义环境变量
      语法: evn VAR|VAR=VALUE
      作用: 用户可以直接设置操作系统上的环境变量
      举例: evn TESTPATH=/tmp;

    • 嵌入其他配置文件
      语法: include /path/file;
      作用: 可以把其他配置文件引进来,,路径可以使用绝对路径也可以是相对路径,还可以含有通配符*。

    • pid文件
      语法: pid path/file;
      默认: pid logs/nginx.pid;
      作用: 保存master进程ID的pid文件存放路径。

    • Nginx worker进程运行的用户和用户组
      语法: user username [groupname];
      默认: user nobody nobody;
      作用: master进程fork出的进程在哪个用户和用户组下。

    • 指定Nginx worker进程可以打开的最大句柄描述符个数
      语法: worker_rlimit_nofile limit;
      作用:设置一个worker可以打开的最大句柄数。

    • 限制信号队列
      语法: worker_rlimit_sigpending limit;
      作用: 设置每个用户发往Nginx的信号队列的大小。也就是说,当某个用户的信号队列满了,这个用户再发送的信号量就会被丢掉。

    6. Nginx 高性能配置

    • Nginx worker进程个数
      语法: worker_processes number;
      默认: worker_processes 1;
      作用: 在master_worker运行方式下,定义worker进程的个数。worker进程的数量会直接影响性能。每个worker都是单线程的进程,他会调用各个模块来实现各种功能。如果确定这些模块不会出现堵塞式调用,那么进程数可以和CPU核心数一样;反之,则稍少一些。可以使用 auto 来指定与当前主机核心数一致。

    • 绑定Nginx worker进程到指定的CPU内核
      语法: worker_cpu_affinity cpumask [cpumask…]
      作用∶假设每个worker都是很繁忙的,如果多个进程都在抢同一个CPU,那么就会出现同步问题。反之,如果每个worker进程独享一个CPU,就实现了完全的并发。
      举例:

    worker_processes 4;
    worker_cpu_affinity 1000 0100 0010 0001;
    
    • SSL硬件加速
      语法: ssl_engine device;
      作用: 如果服务器上有SSL硬件加速设备,那么就可以进行配置以加快SSL协议的处理速度。用户可以用OpenSSL提供的命令来查看是否有SSL硬件加速设备:openssl engine -t

    • Nginx worker进程优先级设置
      语法: worker_priority nice;
      默认: worker_priority 0;
      作用: 在Linux和Unix中,当许多进程都处于可执行状态时,按照优先级来决定本次内核选择哪一个进程执行。进程分配的CPU时间片大小也与优先级有关,优先级越高,时间片越长(例如,在默认情况下,最小时间片是5ms,最大则有800ms)。优先级由静态优先级和内核根据进程的执行情况所做的动态调整(目前只有+-5的调整)共同决定。nice是进程的优先级,他的取值范围是-20~+19,-20是最高优先级,+19是最低优先级。不建议把nice的值设为比内核进程(t通常为-5)还要小。


    7. Nginx 事件配置

    • 是否打开accept锁
      语法: accept_mutex [on|off];
      默认: accept_mutex on;
      作用: accept_mutex是Nginx的负载均衡锁。这把锁可以让多个worker进程轮流的,序列化的与新的客户端建立TCP连接。accept锁默认是打开的,如果关闭它,那么建立TCP连接的耗时会更短,但不利于负载均衡,因此不建议关闭。

    • 使用accept锁后到真正建立连接之间的延迟时间
      语法: accept_mutex_delay Nms;
      默认: accept_mutex_delay 500ms;
      作用: 在使用accept锁后,同一时间只有一个worker进程能够取到accept锁。这个accept锁不是堵塞锁,如果取不到会立刻返回。如果只有一个worker进程试图取锁而没有取到,他至少要等待accept_mutex_delay定义的时间才能再次试图取锁。

    • 批量建立新连接
      语法: multi_accept [on|off];
      默认: multi_accept off;
      作用: 当事件模型有新连接时,尽可能的对本次调度中客户端发起的所有TCP请求都建立连接。

    • 选择事件模型
      语法: use [kqueue|rtsig|epoll|/dev/poll|select|poll|eventport];
      默认: Nginx会选出最合适的时间模型
      作用: 对于Linux系统,可供选择的事件驱动模型有: poll,select,epoll三种,一般来说,epoll是性能最高的。

    • 每个worker的最大连接数
      语法: worker_connections number;
      作用: 定义每个worker进程可以同时处理的最大连接数。


    8. Nginx事件模型

    epoll是Linux内核为处理大批量文件描述符而作了改进的poll,是Linux下多路复用IO接口select/poll的增强版本,它能显著提高程序在大量并发连接中只有少量活跃的情况下的系统CPU利用率。

    • 优点:
    • 支持一个进程打开大数目的socket描述符。
    • IO效率不随FD(File descriptor)数目增加而线性下降。
    • 使用mmap加速内核与用户空间的消息传递。

    9. Nginx配置实例

    • user: 进程运行的用户和用户组。
    • worker_connections: 每个worker最大连接数。
    • pid: 保存master进程ID的pid文件存放路径。
    • use: 选择事件模型。
    • upstream: 配置负载均衡。
    • ip_hash: 基于IP_HASH的负载均衡。
    • listen:监听端口。
    • server_name: 配置虚拟主机名。
    • location: 匹配用户请求。
    • proxy_pass: 配置反向代理。



    如果觉得有收获,欢迎评论、点赞和转发,更多知识,请点击关注查看我的主页信息哦~

    相关文章

      网友评论

          本文标题:高性能Nginx最佳实践

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