美文网首页
高性能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