image.png

  1. ############# 全局配置
  2. ### 指定nginx worker 进程运行的用户和用户组,默认是 nobody 账号
  3. #user nobody;
  4. #user ngxin nginxGroupName
  5. ### 指定 nginx 要开启的子进程数。每个进程平均耗费 10M~20M 内存。 一般与cpu 内核心数量成倍数 建议指定2倍。总进程数 N + 1(master 进程)
  6. ### 主进程负责监控端口,协调工作进程的工作状态,分配工作任务;工作进程负责进行任务处理。
  7. worker_processes 4;
  8. ### cpu 亲和值
  9. worker_cpu_affinity 0001 0010 0100 1000;
  10. ### 用于指定一个 nginx 进程可以打开的最多文件描述符数目,这里是 65535。 需要使用命令 ulimit -n 65535 进程设置(详情下移)。总并发量达到3-4万时就有进程可能超过10240了,这时会返回502错误。
  11. # worker_rlimit_nofile 65535;
  12. ### 定义全局的错误日志文件。级别有6个 debug info notice warn error crit 。日志内存越来越少
  13. #error_log logs/error.log;
  14. #error_log logs/error.log notice;
  15. #error_log logs/error.log info;
  16. ### 指定进程ID 储存的文件位置
  17. #pid logs/nginx.pid;
  18. ################## 工作模型配置
  19. events {
  20. ### 指定工作模型 - io多路复用类型 (会在启动日志 (error_log 配置)中展示)
  21. use epoll;
  22. ### 单个 worker 进程可以允许同时建立外部连接到数量。无论这个连接是外部主动建立的,还是内部建立的。这里需要注意的是,一个工作进程建立一个连接后,进程将打开一个文件副本。所以这个数量还受操作系统设定的,进程最大可打开的文件数有关。
  23. ### 最大客户端连接数 = worker_process * worker_connections;
  24. ### 作为反向代理时的最大连接数 = 最大客户端连接数 / 4
  25. worker_connections 65535;
  26. }
  27. ############## http
  28. http {
  29. ### 支持的文件 mime 类型
  30. include mime.types;
  31. ###设置了默认的类型为 二进制流(表现为文件下载)
  32. default_type application/octet-stream;
  33. ### 日志的类型 main 为名字,可以设置多个日志内容的格式,用其他的字符串命名,再后续的 access_log 等地方使用
  34. #log_format main '$remote_addr - $remote_user [$time_local] "$request" '
  35. # '$status $body_bytes_sent "$http_referer" '
  36. # '"$http_user_agent" "$http_x_forwarded_for"';
  37. #access_log logs/access.log main;
  38. ### 是否支持文件上传下载功能
  39. sendfile on;
  40. #tcp_nopush on;
  41. ### http 连接的最长时间。(大文件上传过程中可能连接超过该值,导致服务端报timeout,单不能过大,过大导致很多很快完成的请求但是释放不了连接,可以 so_keepalive=60s; 解决该问题)配置段:http, server, location
  42. keepalive_timeout 65;
  43. ### 指定客户端与服务端建立连接后发送 request body 的超时时间。如果客户端在指定时间内没有发送任何内容,Nginx 返回 HTTP 408(Request Timed Out)。 配置段:http, server, location
  44. #client_body_timeout 20;
  45. ### 客户端向服务端发送一个完整的 request header 的超时时间。如果客户端在指定时间内没有发送一个完整的 request header,Nginx 返回 HTTP 408(Request Timed Out)。
  46. #send_timeout 10;
  47. #gzip on;
  48. ### 负载均衡
  49. upstream tuling {
  50. server 127.0.0.1:8080;
  51. }
  52. ############## 主机配置一,可以配置多个
  53. server {
  54. ### 监听的域名和端口
  55. listen 80;
  56. server_name localhost;
  57. #charset koi8-r;
  58. ### 访问日志
  59. #access_log logs/host.access.log main;
  60. ############# URL 匹配一,可以配置多个(这个可以配置地址转发)
  61. location / {
  62. root html;
  63. index index.html index.htm;
  64. }
  65. ### 异常状态显示的页面
  66. #error_page 404 /404.html;
  67. error_page 500 502 503 504 /50x.html
  68. location = /50x.html {
  69. root html;
  70. }
  71. location ~ \.php$ {
  72. root html;
  73. fastcgi_pass 127.0.0.1:9000;
  74. fastcgi_index index.php;
  75. fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
  76. include fastcgi_params;
  77. proxy_pass http://127.0.0.1;
  78. }
  79. location ~ \.ht {
  80. deny all;
  81. }
  82. ### url 转发
  83. ### 假如请求的 url 是:http://xxx/request/test.html
  84. ### 则会被代理成: http://server.com/test.html (也就是 request 会被过滤)
  85. ### 反之,proxy_pass 的url 最后没有加 /,
  86. ### 则会被代理成: http://server.com/request/test.html (也就是 request 没有被过滤)
  87. #location ^~ /request/ {
  88. # proxy_pass http://server.com/
  89. #}
  90. ### 反向代理
  91. location /jyb {
  92. proxy_pass http://qurt/;
  93. proxy_read_timeout 1800s;
  94. proxy_set_header Host $host:$server_port;
  95. proxy_set_header X-real-ip $remote_addr;
  96. proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  97. proxy_set_header X-Forwarded-Proto $scheme;
  98. }
  99. }
  100. }
  1. # 添加用户和用户组
  2. groupadd www
  3. useradd -g www www

worker_process 配置

一般一个进程足够了,你可以把连接数设得很大。

如果有SSL、gzip这些比较消耗CPU的工作,而且是多核CPU的话,可以设为和CPU的数量一样。
或者要处理很多很多的小文件,而且文件总大小比内存大很多的时候,也可以把进程数增加,
以充分利用IO带宽(主要似乎是IO操作有block)。(一般开一个就够了,多开几个,可以减少机器io带来的影响。)

服务器是“多个CPU+gzip+网站总文件大小大于内存”的环境,worker_processes设置为CPU个数的两倍比较好。

worker_cpu_affinity cpu 亲和值

Nginx默认没有开启利用多核cpu,我们可以通过worker_processes指令来启动多个worker,但是worker最终运行在哪些cpu核上是系统层进行调度的;我们可以通过增加worker_cpu_affinity指令来对worker所运行的cpu核做绑定,以此充分利用cpu多核cpu的性能。cpu是任务处理、计算最关键的资源,cpu核越多,性能就越好;通过将nginx worker绑定到特定的CPU上可以避免因为worker被频繁调度带来的CPU的cache miss和某些cpu核负载不均的问题

worker_cpu_affinity 默认是没有开启的。
worker_cpu_affinity 可以将同1个进程绑定在2个逻辑CPU上:

  1. worker_processes 4;
  2. worker_cpu_affinity 0001 0010 0100 1000;
  3. worker_processes 8;
  4. worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000;
  5. worker_processes 16;
  6. worker_cpu_affinity 0000000000000001 0000000000000010 0000000000000100 0000000000001000 0000000000010000 0000000000100000 0000000001000000 0000000010000000 0000000100000000 0000001000000000 0000010000000000 0000100000000000 0001000000000000 0010000000000000 0100000000000000 1000000000000000;
  7. worker_processes 2;
  8. worker_cpu_affinity 0101 1010;
  9. Bind the first worker to CPU0/CPU2, bind the second worker to CPU1/CPU3. This is suitable for HTT.
  10. 0101也就是第13个逻辑CPU上,1010就是第24个逻辑CPU上。
  11. 自适应的方式来启动一定数量的worker,并且自动绑定到对应的cpu核心上,这里启动的worker数量和cpu核心数相同;
  12. worker_processes auto;
  13. worker_cpu_affinity auto;
  1. # 查看cpu信息
  2. cat /proc/cpuinfo
  3. ## 查看cpu 进程数
  4. cat /proc/cpuinfo | grep processor
  5. processor : 0
  6. processor : 1
  7. processor : 2
  8. processor : 3

ulimit -n 修改最大连接数

使用ulimit -a 可以查看当前系统的所有限制值,使用ulimit -n 可以查看当前的最大打开文件数。
image.png

新装的linux默认只有1024,当作负载较大的服务器时,很容易遇到error: too many open files。因此,需要将其改大。

使用 ulimit -n 65535 可即时修改,但重启后就无效了。(注ulimit -SHn 65535 等效 ulimit -n 65535,-S指soft,-H指hard)
有如下三种修改方式:
可以修改配置文件/etc/profile
#vi /etc/profile
加入一行
ulimit -SHn 65536

https://www.jianshu.com/p/b4aadb88b19a ulimit详解

验证Nginx的“进程最大可打开文件数”是否起作用

在linux系统中,所有的进程都会有一个临时的核心配置文件描述,存放路径在 /pro/进程号/limit

通过 ps -elf | grep nginx 获取到 pid.
cat /pro/[pid 进程号]/limits 输出中看到 Max open files 值。

工作模式。io 多路复用类型
5种

  • select poll 标准工作模式,效率低
  • kqueue BSD系统
  • epoll Linux 系统
  • rtsig

root 和 alias 的区别

root 会带上匹配的路径(path),配置端 http server location if
alias 不会带上匹配的路径(path),目录后面一定要加上 / ;配置段 只能在 location

  1. # /t/a.html
  2. location ^~ /t/ {
  3. root /www/html/; ## /www/html/t/a.thml
  4. alias /www/html; ## /www/html/a.html
  5. }