配置文件结构
一份简单的nginx配置,了解nginx配置文件的结构
user www www;
worker_processes auto;
worker_rlimit_nofile 65535;
error_log logs/error.log;
pid logs/nginx.pid;
events {
worker_connections 65535;
use epoll;
}
http {
charset utf-8;
client_header_buffer_size 8k;
client_max_body_size 50m;
client_body_timeout 10s;
client_header_timeout 5s;
large_client_header_buffers 8 4k;
server_tokens off;
server_name_in_redirect off;
server_names_hash_bucket_size 128;
include mime.types;
default_type application/octet-stream;
log_format main '$http_host [$time_local] "$request" request_length '
'$status $body_bytes_sent $request_time "$http_referer" '
'"$http_user_agent"';
upstream backend {
server 127.0.0.1:80;
}
server {
listen 80 default_server;
server_name _ ;
root /data0/www/htdocs/default;
access_log /data0/www/logs/default-access_log main;
error_log /data0/www/logs/default-error_log;
rewrite ^/(.*) http://www.qfedu.com/$1 permanent;
location / {
include fastcgi_params;
fastcgi_pass 127.0.0.1:8998
}
}
}
踢掉里面的基础指令,应该是如下形式:
user www www;
worker_processes auto;
worker_rlimit_nofile 65535;
...
...
events {
...
}
http {
...
upstream {
...
}
server {
...
location / {
...
}
}
}
我们发现 Nginx 配置文件的结构包含 events 、http、upstream、server、location 这 5 大块。另外我们发现一些指令不包含在这 5 块中, 我们称他们为main指令。每块具体意义如下:
各个模块作用:
main模块: 主要控制nginx子进程的所属用户/用户组、派生子进程数、错误日志位置/级别、pid位置、进程对应cpu、进程能够打开的文件描述符数目等。
events模块: 控制nginx处理连接的方式。
http模块: 是nginx处理http请求的主要配置模块,有关http的相关都在这个块中进行配置。
upstream模块: 包含在http块中,是nginx做反向代理和负载均衡的配置块,可以配置多个。
server模块: 包含在http块中,是nginx中虚拟主机的配置块,可以配置多个。
location模块: 包含在server块中,是server中对应的目录级别的控制块,可以配置多个。
基础配置指令
1、配置运行nginx 的用户和组
user user [group]
user, 指定可以运行Nginx 服务器的用户
group, 可选项,指定运行Nginx 服务器的用户组
2、配置运行生产的worker process 数
worker_processes number | auto;
numbers, 指定Nginx 进程最多可以产生worker process 数,默认情况 numbers = 1
auto, 设置此值,Nginx 将自动检测CPU核心数,并将worker process 数量设置成等同CPU核心数量
3、配置nginx 打开最大文件数
worker_rlimit_nofile number;
number, 设置 worker 进程打开最大文件数
4、配置nginx最大连接数
worker_connections numbers;
numbers 设置一个 worker 进程的最大网络连接数
5、配置nginx 进程PID 存放路径
pid /path/file;
6、配置错误日志的存放路径
error_log file|stderr [debug|info|notice|warn|error|crit|alert|emerg];
从语法结构上看,Nginx服务器的日志支持输出到某个固定的文件file或者输出到标准错误输出stderr; 日志的级别是
可选项,由低到高为debug(需要在编译的时候使用--with-debug 开启debug开关)到 emerg。需要注意的是,设置某
一级别后,比这一级别高的日志也会被记录。比如设置warn级别后,基本为warn 及 error、crit、alert 和 emerg
的日志都会被记录下来。
例如:
error_log logs/error.log error;
配置文件引入指令
include file;
file, 要引入的配置文件,它支持相对路径
在一些情况下,我们可能将其他的Nginx 配置或第三方模块的配置引入到当前的主配置文件中,此时可以使用此指令。
此指令可以放在配置文件的任意地方。
优化配置指令
1、针对CPU的nginx 配置优化指令
处理器已经进入了多核时代。多核的意思是一个处理器集成了两个或者多个计算引擎,也就是计算机可以并发的处理更
多的事情。在Nginx配置中,有两个关于进程的指令,worker_processes 和worker_cpu_affinity,它们可以针对多
核CPU进行配置优化。
A)worker_processes 指令
worker_processes 指令是用来指定Nginx工作进程数。官方默认设为1,但是为了让多核CPU能够更好的处理并行任
务,可以将该值设置大一些,最好这个值是机器CPU的倍数。当然,并不是越大越好,Nginx 进程太多会增加主进程
master调度负担,也可能影响系统的IO效率。
auto 参数可以自动根据操作系统CPU核心数量去开启等同的Nginx工作进程数,这样就不需要手动去设置Nginx 的工作
进程数量。
Example:
worker_processes 4;
worker_processes auto;
B)worker_cpu_affinity 指令
worker_cpu_affinity 指令用来为每个进程分配工作内核(CPU)。这个指令的设置方法有些麻烦。
我们这里遵循一个规则去设定,就可以很简单。
规则: cpu有多少个核,就有几位数,1代表使用,0代表不使用。
Example:
# 两核CPU,开启两个进程
worker_processes 2;
worker_cpu_affinity 01 10;
# 两核CPU,开启八个进程
worker_processes 8;
worker_cpu_affinity 01 10 01 10 01 10 01 10;
# 8核CPU,开启8个进程
worker_processes 8;
worker_cpu_affinity 10000000 01000000 00100000 00010000 00001000 00000100 00000010 00000001;
# 8核CPU,开启2个进程
worker_processes 2;
worker_cpu_affinity 10101010 01010101;
# 10101010表示一个进程绑定到了第2,4,6,8内核,01010101表示另一个进程绑定到了1,3,5,7内核
以上配置可以看出,当CPU的核心数量越多的时候,配置的参数也就越长。在 1.9.10 版本后,Nginx中提供了auto 参数,来解决工作进程自动绑定CPU的行为。
worker_processes auto;
worker_cpu_affinity auto;
2、针对网络相关的配置指令
A)keepalive_timeout 指令
该指令用于设置Nginx服务器与客户端保持连接的超时时间。
这个指令支持两个选项,中间用空格隔开。 第一个选项指定客户端连接保持活动的超时时间,在这个时间之后,服务器
会关闭此连接;第二个选项,指定了使用Keep-Alive 消息头保持存活的有效时间,如果不设置他,Nginx服务器不会向
客户端发送Keep-Alive 消息头以保持与客户端某些浏览器(如Mozilla,Konqueror等)的连接。设置这个选项后,客户
端就可以在超时时间后关闭连接,而不需要服务器关闭了。指令的设置示例:
keepalive_timeout 60 30;
B)send_timeout 指令
该指令用于设置Nginx 服务器响应客户端的超时时间,这个超时时间仅针对客户端和服务器端建立连接之后。如果在指
定的时间内,客户端没有收到任何内容,这个连接将会被断开。注意此超时时间不是服务器端响应客户端的总时间。指
令的设置示例:
send_timeout 10s;
C)client_header_buffer_size 指令
该指令用户设置Nginx 服务器允许的客户端请求头的缓冲区大小,默认是1KB。此指令的赋值可以根据系统分页大小来设
置。分页大小可以使用如下指令获得:
# getconf PAGESIZE
此指令若设置不当,经常会发生400状态码错误。此错误一大部分情况是客户端的请求头过大造成的。请求头过大,通常是
客户端cookie中写入了较大的值引起的。因此适当的增大此指令的赋值,运行Nginx服务器接受较大的请求头部,可以增
强服务器对客户端的支持能力。通常我们将此值设置成4k。指令的设置示例:
client_header_buffer_size 4k;
D)Gzip 压缩指令
在Nginx 配置文件中可以配置Gzip的使用,Gzip指令可以在http块、server块、location块中设置。
它可以对响应数据进行在线实时压缩。Gzip 主要由 ngx_http_gzip_module 模块提供,该模块包括指令如下。
E)gzip 指令
开启或者关闭Gzip功能, 默认指令设置为off, 即不启用Gzip功能。只有设置为on 时,后续介绍的指令才会有效。
gzip on | off;
F)gzip_buffers 指令
设置Gzip压缩文件使用缓存空间的大小, 语法如下:
gzip_buffers number size;
number, 指定缓存空间的数量
size, 指定缓存空间的大小
根据该配置选项, Nginx 服务器在对响应输出数据进行Gzip压缩时需要向系统申请 number * size 大小的空间用于
存储压缩数据。
G)gzip_comp_level 指令
设置Gzip的压缩程度,包括级别1 到 级别9。 级别1标示压缩程度最低,压缩效率最高;级别9标示压缩程度最高,压缩
效率最低,最费时间。语法如下:
gzip_comp_leve level; 默认级别为 1
H)gzip_disable 指令
针对不同类型客户端发起的请求,可以选择性的关闭和开启Gzip功能。该指令从0.6.23启用,用于设置一些客户端种类。
Nginx服务器端在响应这种类型的客户端时,不使用Gzip功能响应输出数据。语法如下:
gzip_disable regex ...;
其中,regex 根据客户端的浏览器标志(UA,User-Agent) 进行设置,支持使用正则表达式。
Example:
gzip_disable MSIE [4-6]\.
该设置使用了正则表达式,其可以匹配UA字符串中抱哈MISE4、MISE5和MISE6的所有浏览器。响应这些浏览器发送的请求
时,Nginx服务器不在进行Gzip压缩。
I)gzip_http_version 指令
早期的一些浏览器或者HTTP客户端,可能不支持Gzip自解压。因此用户可能会看到乱码,所以针对不同的HTTP协议版本,
需要选择性的开启或者关闭Gzip功能。该指令用于设置开启Gzip功能的最低HTTP协议版本。 语法如下:
gzip_http_version 1.0|1.1
默认设置为1.1版本, 即只有客户端使用了1.1及以上版本的HTTP协议时,才使用Gzip功能对响应输出数据进行压缩。
从目前来看,绝大多数的浏览器都支持Gzip的自解压,一般采用默认即可。
J)gzip_min_length 指令
Gzip 压缩功能针对大数据压缩效果明显,若压缩很小的数据很可能出现越压缩数据越大的情况。因此应该根据响应结果
的大小,选择性的开启或者关闭Gzip功能。响应结果的大小通过HTTP响应头中的Content-Length指令获取。但当使用
了Chunk 编码动态时,Content-length 或不存在或被忽略,此时该指令将不起作用。语法如下:
gzip_min_length length;
当设置length 为0 时, 标示不管响应结果多大,都统统开启压缩功能。
K)gzip_types 指令
根据响应内容的MIME类型选择性的开启Gzip功能。该指令用来设置MIME类型,被设置的类型将被压缩。语法如下:
gzip_types mime-type ...;
mime-type 取值默认为text/html, 在gzip指令设置为on时,Nginx服务器会对所有的text/html 类型的页面数据进
行Gzip压缩。 该变量还可以取 "*", 表示对所有的MIME类型的页面数据进行Gzip压缩。
L)gzip_var 指令
设置在使用Gzip功能时,是否发送带有"Vary: Accept-Encoding"头域的响应头部。该头域的主要功能是告诉接受放发
送的数据进行了压缩处理。 开启后的效果是在响应头部添加了Accept-Encoding: gzip,这对于本身不支持Gzip压缩的
浏览器是有用的。 语法如下:
gzip_vary on | off; 默认值为off
一个Gzip的综合实例
# 开启gzip
gzip on;
# 启用gzip压缩的最小文件,小于设置值的文件将不会压缩
gzip_min_length 1k;
# gzip 压缩级1-9,数字越大压缩的越好,但也越占用CPU时间
gzip_comp_level 2;
# 进行压缩的文件类型。javascript有多种形式。其中的值可以在 mime.types 文件中找到。
gzip_types text/plain application/javascript application/x-javascript text/css application/xml
text/javascript application/x-httpd-php image/jpeg image/gif image/png;
# 是否在http 响应头中添加Vary: Accept-Encoding,建议开启
gzip_vary on;
# 禁用IE 6 gzip
gzip_disable "MSIE [1-6]\.";