nginx 核心配置介绍
一 、作用域
nginx 的主要配置 分为3部分
-
全局配置 (contex: main )
在http{ }之外的部分
-
server 部分
在http { } 内
-
location
在 server 内
二、全局配置
参见官方文档:http://nginx.org/en/docs/ngx_core_module.html
2.1 user nginx nginx;
启动Nginx工作进程的用户和组
2.2 worker_processes [number | auto];
启动Nginx工作进程的数量 , 应该设置为cpu 的个数
最佳值取决于许多因素,包括(但不限于)CPU内核数,存储数据的硬盘驱动器数以及加载模式。
2.3 worker_cpu_affinity 00000001 00000010 00000100 00001000;
写法:00000001 代表第一颗CPU
00000010 代表第2颗CPU 以此类推 ,有几核CPU 写到几
将Nginx工作进程绑定到指定的CPU核心,默认Nginx是不进行进程绑定的,绑定并不是意味着当前nginx进程独占以一核心CPU,但是可以保证此进程不会运行在其他核心上,这就极大减少了nginx的工作进程在不同的cpu核心上的来回跳转,减少了CPU对进程的资源分配与回收以及内存管理等,因此可以有效的提升nginx服务器的性能。
为啥工作进程要绑定 cpu ? 压测的时候会进程会切换CPU
例: 没有 压测前 worker 进程 25876在 第一个CPU上面(0 上) 25877在 第二个CPU上面(1上)
root@z2:~# ps axo pid,cmd,psr | grep nginx
25669 nginx: master process /apps 1
25876 nginx: worker process 0
25877 nginx: worker process 1
进行压测
root@z2:~# apt install apache2-utils
root@z2:~# ab -n20000 -c1000 http://192.168.1.102/
压测之后 发现25877 也运行在第一颗cpu 上了(0上)
root@z2:~# ps axo pid,cmd,psr | grep nginx
25669 nginx: master process /apps 1
25876 nginx: worker process 0
25877 nginx: worker process 0
worker进程绑定cpu 之后无论怎么压测,发现都不变了
2.4 error_log
语法:error_log file [debug | info | notice | warn | error | crit | alert | emerg]
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
2.5 pid
#pid logs/nginx.pid;
注意:这里的里的logs 是相对目录,相对于安装时指定的prexfix_path,也可以写完整目录,如
pid /apps/nginx/logs/nginx.pid;
2.6 worker_priority
worker_priority 0; #工作进程优先级,-20~19
2.7 worker_rlimit_nofile
worker_rlimit_nofile 65536; #这个数字包括Nginx的所有连接(例如与代理服务器的连接等),而不仅
仅是与客户端的连接,另一个考虑因素是实际的并发连接数不能超过系统级别的最大打开文件数的限制
设置每个worker最大能打开的核件数,用于突破上限而不用重启master进程。
这个值未设置的话,采用系统的值,ulimit -a
,一般会把它调高点,以防报错 “too many open files” 的问题。
2.8 daemon off;
前台运行Nginx服务用于测试、docker等环境。
2.9 master_process off|on;
选on ,默认开启
#是否开启Nginx的master-woker工作模式。
2.10 events
events {
worker_connections 65536; #单个nginx worker 进程可以接受的最大并发数,作为web 服务器时最大的并发连接数为 worker_connnetions * work_processes ;作为反向代理worker_connections *worker_processes)/2
切记,这个数值包含所有的连接(包括跟后端server间的连接,不仅仅是跟客户端间的连接),另外要注意的是,这个数值不能大于单个worker进程能打开的最大文件数限制(这个值可由 worker_rlimit_nofile
指令设置)。
use epoll; # 使用epoll事件驱动,Nginx支持众多的事件驱动,比如select、poll、epoll,只能设置在events模块中设置。
accept_mutex on; #优化同一时刻只有一个请求而避免多个睡眠进程被唤醒的设置,on为防止被同时唤醒默认为off,全部唤醒的过程也成为"惊群",因此nginx刚安装完以后要进行适当的优化。
multi_accept on; Nginx服务器的每个工作进程可以同时接受多个新的网络连接,但是需要在配置文件中配置,此指令默认为关闭,即默认为一个工作进程只能一次接受一个新的网络连接,打开后几个同时接受多个,配置语法如下:
}
三、http配置
3.1 nginx 支持的文件类型
- include mime.types;
导入支持的文件类型
-
default_type application/octet-stream;
设置默认的类型,会提示下载不匹配的类型文件
3.2 日志配置部分
#定义的日志格式
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
#定义访问日志的位置、以及记录的格式,默认值是所有的server都在一起,即所有的网站的访问记录都在一起,实际应该分开
access_log logs/access.log main;
3.3 自定义优化参数
-
sendfile on; # 开启sendfile
-
tcp_nopush on; #在开启了sendfile的情况下,合并请求后统一发送给客户端。
-
tcp_nodelay off; #在开启了keepalived模式下的连接是否启用TCP_NODELAY选项,当为off时,延迟0.2s发送,默认On时,不延迟发送,立即发送用户相应报文。
-
keepalive_timeout 65 长连接超时时间,单位是秒
-
gzip on; #开启文件压缩
3.4 server 配置
设置一个虚拟机主机,可以包含自己的全局快,同时也可以包含多个location模块。比如本虚拟机监听的端口、本虚拟机的名称和IP配置,多个server 可以使用一个端口,比如都使用80端口提供web服务
server {
listen 80; #配置server监听的端口
charset koi8-r; #设置编码格式,默认是俄语格式,可以改为utf-8
server_name www.a.com; 本server的名称,当访问此名称的时候nginx会调用当前serevr内部的配置进程匹配。
access_log logs/www_a_com_access.log main; #定义访问日志的路径,格式
error_log /apps/nginx/logs/www_a_com_error.log error; #定义错误日志的路径,格式
error_page 500 502 503 504 /50x.html; #定义指定的状态码 错误页面
location = /50x.html {
root html; #错误页面的网站
}
location / { #location其实是server的一个指令,为nginx服务器提供比较多而且灵活的指令,都是在location中提现的,主要是基于nginx接受到的请求字符串,对用户请求的UIL进行匹配,并对特定的指令进行处理,包括地址重定向、数据缓存和应答控制等功能都是在这部分实现,另外很多第三方模块的配置也是在location模块中配置。
root html; #相当于默认页面的目录名称,默认是相对路径,可以使用绝对路径配置。
index index.html index.htm; #默认的页面文件名称
}
}
3.5 server_tokens off;
#隐藏Nginx server版本。