1. nginx源码安装依赖包:zlib-devel(提供数据压缩的函数库) openssl-devel pcre-devel(rewrite依赖pcre库)
具体编译安装命令可查看./configure --help
后面线上如果想开启debug,编译安装时需加--with-debug
2. IO类型:同步/异步 ---> 判断依据是否有消息通知机制
阻塞/非阻塞
IO模型:阻塞IO, 非阻塞IO, IO复用, 信号驱动IO, 异步IO
3. 配置文件(配置命令需要以 ‘;’ 结尾)
1 main块常用配置
正常运行必备的配置
1 user username [groupname]; 指定启动work_process的用户
2 pid /var/run/nginx.pid; 指定nginx pid文件路径
3 worker_rlimit_nofile 1024; 指定单个worker进程可以打开的文件句柄数(fd,文件描述符,跟并发有关)此处nofile为number of files
4 worker_rlimit_sigpending num; 指定每个用户可以发给worker进程的信号数量
性能优化相关配置
1 worker_processes auto; 指定worker进程数,一般为系统cpu核心数。目前多数设置为auto
2 worker_cpu_affinity 0001 0010 0100; cpumask绑定,四颗cpu开启3个worker进程,绑定3个cpu。此配置不能隔离cpu
3 worker_priority nice值; 指定worker进程优先级数值越小优先级越高,针对CPU调度,nginx默认nice值为0
用于调试,定位问题的配置
1 daemon on/off; 是否以守护进程方式启动nginx,开关控制启动后是否把信息直接打印到当前屏幕上
2 master_process on/off; 是否以master/worker模型启动nginx,默认开启的,找问题时可以关闭以单个进程启动nginx
3 error_log /PATH/error_log; 处于调试的需要可以指定debug级别,debug级别在编译是使用with-debug时这里才能生效
2 event块常用配置
1 worker_connections num; 每个worker进程的最大响应数。
nginx作为web服务器时maxclient = worker_connections*worker_processes
nginx作为反向代理时maxclient = worker_connections*worker_processes/4 因为作为反向代理和后端建联也需要fd,和浏览器建联需要2个fd。
2 use [epoll|poll|select|rgsly]; 指定事件驱动模型
3 accept_mutex on/off; 惊群(处理请求的负载均衡锁)默认开启,开启状态不争抢链接,off状态请求进来睡眠状态的worker进程争抢链接
4 lock_file /path/; 锁文件路径
3 http块
多个server可共享使用配置,有些也可在单个server内部配置。
1 include mime.types; 导入多媒体类型定义文件
2 default_type application/octet-stream
3 log_format main ''; 定义日志文件格式,一般会单独文件定义然后include导入
4 access_log logs/access.log main; 日志文件路径
* 5 sendfile on/off; 默认开启,一个系统调用的配置,开启可以减少系统从内核到网络的copy,直接在内核空间封装成响应包进行响应,提高性能
* 6 tcp_nopush on/off; 只有在sendfile开启时有用,nginx响应时把报文首部打包成一个报文发送。默认off
7 keepalive_timeouot 65; 长连接 设置为0表示禁止此功能,默认为75秒,是客户端请求相关配置
8 keepalive_requests 8192; 每个链接最大请求资源数量,和keepalive_timeout协同使用,默认数量为100
keepalive_disable none;指明禁止哪种浏览器使用keeplive功能
* 9 tcp_nodelay on/off; tcp协议长连接有nagle算法,提高效率把小的报文合并一个发送,目标需要是一个主机,需要长连接keepalive时使用,开启时节省带宽,但是响应慢,对于web服务器而言尽量为off
10 gzip on/off; 压缩提高网络传输速度
send_timeout 60s; 服务端响应超时配置
server {
listen PORT; 后面可以加default_server,ssl,http2,spdy 参数
server_name DOMAIN ....; 可以用空格分隔指定多个domain,可以使用通配符,例:*.baidu.com。使用正则的情况先是精确匹配,再是左侧通配符,然后是右侧通配符,最后是正则表达式
root PATH; 设置资源路径映射,可以用在location中
index index.html;
location [=|~|~*|^~] uri | @name {}
= 精确匹配
~ 正则匹配,区分大小写
~* 正则匹配,不区分大小写
^~ uri的左半部分匹配,不区分大小写
优先级: = > ^~ > ~* 或 ~ > 不带符号的url 如果优先级相同则从上向下匹配
}
11 alias 只能用于location段(用来定义路径,root既可以在location也可以在server)
location /images/ {
root /data/imgs/;
}
root: 访问/images/test.jpg -----> /data/imgs/images/test.jpg
location /images/ {
alias /data/imgs/; 如果使用alias path后面的/不能省略
}
alias: 访问/images/test.jpg -----> /data/imgs/test.jpg
12 error_page 自定义错误页面使用,根据http错误状态码重定向错误页面
error_page 404 /404.html 这样定义默认目录在根下
error_page 404 =200 /404.html 后面跟=200 把404错误响应码改成了200,让客户端以为是一个正常响应
error_page 502 503 504 /50X.html
location /50X.html { 利用location重新定义了错误页面的根位置
root /error;
}
13 try_files 如果访问的页面不存在则尝试访问后面的文件
index index.htm; 这里访问image 默认访问index.html如果index.html不存在则尝试1.html,2.html
location /image/ {
try_files /image/1.html /imgae/2.html;
}
如果尝试的资源都不存在容易陷入死循环,需要加如下配置
location = /images/2.html {
expires 30s;
}
14 client_body_buffer_size 16k; 服务器接收客户端请求body缓冲区大小64位系统默认16K ,例如客户端提交的表单,如果超出16k将会存到磁盘上
15 client_body_temp_path path; 针对超出client_body_buffer_size指定的存储磁盘临时文件路径
client_body_temp_path /spool/nginx/client_temp 1 2; 1 2表示级别。 这里1表示使用1个16进制创建1级子目录,2个16进制创建2级子目录,一共有16个一级子目录,每个一级子目录有16*16个二级子目录,可以有三个级别,表示3层子目录
对客户端请求进行限制
16 limit_except METHOD 对指定范围之外的其他方法进行限制
limit_except GET {
allow 192.168.1.0/32;
deny all;
}
17 limit_rate rate; 对客户端请求限速,默认为0,为关闭限速功能,限速单位为每秒字节数
文件操作优化相关配置
18 aio on/off; 异步IO模式
19 directio size | off; 超过设置值,就不在内存中缓存直接读取
rewrite
set 用来设置变量
if 条件判断语句,用来判断一些在***rewrite语句中无法直接匹配的条件**,比如检测文件存在与否,http header,cookie等
if(条件) {…}
- 当if表达式中的条件为true,则执行if块中的语句
- 当表达式只是一个变量时,如果值为空或者任何以0开头的字符串都会当作fal
- 直接比较内容时,使用 = 和 !=
- 使用正则表达式匹配时,使用
~ 大小写敏感匹配
~* 大小写不敏感匹配
!~ 大小写敏感不匹配
!~* 大小写不敏感不匹配
~为正则匹配, 后置*为大小写不敏感, 前置!为”非”操作 ********此匹配只针对if语句,不能用到rewrite语句
return return可用来直接设置HTTP返回状态,比如403,404等(301,302不可用return返回)
break 立即停止rewrite检测
rewrite 用法: rewrite 正则 替换 标志位
标志位:break – 停止rewrite检测,也就是说当含有break flag的rewrite语句被执行时,该语句就是rewrite的最终结果
last – 停止rewrite检测,但是跟break有本质的不同,last的语句不一定是最终结果,这点后面会跟nginx的location匹配一起提到
redirect – 返回302临时重定向,一般用于重定向到完整的URL(包含http:部分)
permanent – 返回301永久重定向,一般用于重定向到完整的URL(包含http:部分)
####这里说下rewrite 标志位last 是匹配location的不是中断rewrite匹配,如果location中包含rewrite还是会匹配的
location /download/ {
rewrite ^(/download/.*)/media/(.*)\..*$ $1/mp3/$2.mp3 ;
rewrite ^(/download/.*)/movie/(.*)\..*$ $1/avi/$2.mp3 ;
rewrite ^(/download/.*)/avvvv/(.*)\..*$ $1/rmvb/$2.mp3 ;
}
如果请求为 /download/acg/moive/UBW.avi
last的情况是: 在第2行rewrite处终止,并重试location /download..死循环
break的情况是: 在第2行rewrite处终止,其结果为最终的rewrite地址.
if ($http_user_agent ~ MSIE) { 此处判断UA为MSIE则匹配下方跳到目录/msie/下
rewrite ^(.*)$ /msie/$1 break; 此处 $1 为rewrite处正则匹配圆括号()内内容,$1,$2,$3......表示前方正则引用部分**()内为正则引用**,依照从左到右的顺序
}
if (!-f $request_filename) { 如果请求文件名不存在,则反向代理localhost
break;
proxy_pass http://127.0.0.1;
}
具体编译安装命令可查看./configure --help
后面线上如果想开启debug,编译安装时需加--with-debug
2. IO类型:同步/异步 ---> 判断依据是否有消息通知机制
阻塞/非阻塞
IO模型:阻塞IO, 非阻塞IO, IO复用, 信号驱动IO, 异步IO
3. 配置文件(配置命令需要以 ‘;’ 结尾)
1 main块常用配置
正常运行必备的配置
1 user username [groupname]; 指定启动work_process的用户
2 pid /var/run/nginx.pid; 指定nginx pid文件路径
3 worker_rlimit_nofile 1024; 指定单个worker进程可以打开的文件句柄数(fd,文件描述符,跟并发有关)此处nofile为number of files
4 worker_rlimit_sigpending num; 指定每个用户可以发给worker进程的信号数量
性能优化相关配置
1 worker_processes auto; 指定worker进程数,一般为系统cpu核心数。目前多数设置为auto
2 worker_cpu_affinity 0001 0010 0100; cpumask绑定,四颗cpu开启3个worker进程,绑定3个cpu。此配置不能隔离cpu
3 worker_priority nice值; 指定worker进程优先级数值越小优先级越高,针对CPU调度,nginx默认nice值为0
用于调试,定位问题的配置
1 daemon on/off; 是否以守护进程方式启动nginx,开关控制启动后是否把信息直接打印到当前屏幕上
2 master_process on/off; 是否以master/worker模型启动nginx,默认开启的,找问题时可以关闭以单个进程启动nginx
3 error_log /PATH/error_log; 处于调试的需要可以指定debug级别,debug级别在编译是使用with-debug时这里才能生效
2 event块常用配置
1 worker_connections num; 每个worker进程的最大响应数。
nginx作为web服务器时maxclient = worker_connections*worker_processes
nginx作为反向代理时maxclient = worker_connections*worker_processes/4 因为作为反向代理和后端建联也需要fd,和浏览器建联需要2个fd。
2 use [epoll|poll|select|rgsly]; 指定事件驱动模型
3 accept_mutex on/off; 惊群(处理请求的负载均衡锁)默认开启,开启状态不争抢链接,off状态请求进来睡眠状态的worker进程争抢链接
4 lock_file /path/; 锁文件路径
3 http块
多个server可共享使用配置,有些也可在单个server内部配置。
1 include mime.types; 导入多媒体类型定义文件
2 default_type application/octet-stream
3 log_format main ''; 定义日志文件格式,一般会单独文件定义然后include导入
4 access_log logs/access.log main; 日志文件路径
* 5 sendfile on/off; 默认开启,一个系统调用的配置,开启可以减少系统从内核到网络的copy,直接在内核空间封装成响应包进行响应,提高性能
* 6 tcp_nopush on/off; 只有在sendfile开启时有用,nginx响应时把报文首部打包成一个报文发送。默认off
7 keepalive_timeouot 65; 长连接 设置为0表示禁止此功能,默认为75秒,是客户端请求相关配置
8 keepalive_requests 8192; 每个链接最大请求资源数量,和keepalive_timeout协同使用,默认数量为100
keepalive_disable none;指明禁止哪种浏览器使用keeplive功能
* 9 tcp_nodelay on/off; tcp协议长连接有nagle算法,提高效率把小的报文合并一个发送,目标需要是一个主机,需要长连接keepalive时使用,开启时节省带宽,但是响应慢,对于web服务器而言尽量为off
10 gzip on/off; 压缩提高网络传输速度
send_timeout 60s; 服务端响应超时配置
server {
listen PORT; 后面可以加default_server,ssl,http2,spdy 参数
server_name DOMAIN ....; 可以用空格分隔指定多个domain,可以使用通配符,例:*.baidu.com。使用正则的情况先是精确匹配,再是左侧通配符,然后是右侧通配符,最后是正则表达式
root PATH; 设置资源路径映射,可以用在location中
index index.html;
location [=|~|~*|^~] uri | @name {}
= 精确匹配
~ 正则匹配,区分大小写
~* 正则匹配,不区分大小写
^~ uri的左半部分匹配,不区分大小写
优先级: = > ^~ > ~* 或 ~ > 不带符号的url 如果优先级相同则从上向下匹配
}
11 alias 只能用于location段(用来定义路径,root既可以在location也可以在server)
location /images/ {
root /data/imgs/;
}
root: 访问/images/test.jpg -----> /data/imgs/images/test.jpg
location /images/ {
alias /data/imgs/; 如果使用alias path后面的/不能省略
}
alias: 访问/images/test.jpg -----> /data/imgs/test.jpg
12 error_page 自定义错误页面使用,根据http错误状态码重定向错误页面
error_page 404 /404.html 这样定义默认目录在根下
error_page 404 =200 /404.html 后面跟=200 把404错误响应码改成了200,让客户端以为是一个正常响应
error_page 502 503 504 /50X.html
location /50X.html { 利用location重新定义了错误页面的根位置
root /error;
}
13 try_files 如果访问的页面不存在则尝试访问后面的文件
index index.htm; 这里访问image 默认访问index.html如果index.html不存在则尝试1.html,2.html
location /image/ {
try_files /image/1.html /imgae/2.html;
}
如果尝试的资源都不存在容易陷入死循环,需要加如下配置
location = /images/2.html {
expires 30s;
}
14 client_body_buffer_size 16k; 服务器接收客户端请求body缓冲区大小64位系统默认16K ,例如客户端提交的表单,如果超出16k将会存到磁盘上
15 client_body_temp_path path; 针对超出client_body_buffer_size指定的存储磁盘临时文件路径
client_body_temp_path /spool/nginx/client_temp 1 2; 1 2表示级别。 这里1表示使用1个16进制创建1级子目录,2个16进制创建2级子目录,一共有16个一级子目录,每个一级子目录有16*16个二级子目录,可以有三个级别,表示3层子目录
对客户端请求进行限制
16 limit_except METHOD 对指定范围之外的其他方法进行限制
limit_except GET {
allow 192.168.1.0/32;
deny all;
}
17 limit_rate rate; 对客户端请求限速,默认为0,为关闭限速功能,限速单位为每秒字节数
文件操作优化相关配置
18 aio on/off; 异步IO模式
19 directio size | off; 超过设置值,就不在内存中缓存直接读取
rewrite
set 用来设置变量
if 条件判断语句,用来判断一些在***rewrite语句中无法直接匹配的条件**,比如检测文件存在与否,http header,cookie等
if(条件) {…}
- 当if表达式中的条件为true,则执行if块中的语句
- 当表达式只是一个变量时,如果值为空或者任何以0开头的字符串都会当作fal
- 直接比较内容时,使用 = 和 !=
- 使用正则表达式匹配时,使用
~ 大小写敏感匹配
~* 大小写不敏感匹配
!~ 大小写敏感不匹配
!~* 大小写不敏感不匹配
~为正则匹配, 后置*为大小写不敏感, 前置!为”非”操作 ********此匹配只针对if语句,不能用到rewrite语句
return return可用来直接设置HTTP返回状态,比如403,404等(301,302不可用return返回)
break 立即停止rewrite检测
rewrite 用法: rewrite 正则 替换 标志位
标志位:break – 停止rewrite检测,也就是说当含有break flag的rewrite语句被执行时,该语句就是rewrite的最终结果
last – 停止rewrite检测,但是跟break有本质的不同,last的语句不一定是最终结果,这点后面会跟nginx的location匹配一起提到
redirect – 返回302临时重定向,一般用于重定向到完整的URL(包含http:部分)
permanent – 返回301永久重定向,一般用于重定向到完整的URL(包含http:部分)
####这里说下rewrite 标志位last 是匹配location的不是中断rewrite匹配,如果location中包含rewrite还是会匹配的
location /download/ {
rewrite ^(/download/.*)/media/(.*)\..*$ $1/mp3/$2.mp3 ;
rewrite ^(/download/.*)/movie/(.*)\..*$ $1/avi/$2.mp3 ;
rewrite ^(/download/.*)/avvvv/(.*)\..*$ $1/rmvb/$2.mp3 ;
}
如果请求为 /download/acg/moive/UBW.avi
last的情况是: 在第2行rewrite处终止,并重试location /download..死循环
break的情况是: 在第2行rewrite处终止,其结果为最终的rewrite地址.
if ($http_user_agent ~ MSIE) { 此处判断UA为MSIE则匹配下方跳到目录/msie/下
rewrite ^(.*)$ /msie/$1 break; 此处 $1 为rewrite处正则匹配圆括号()内内容,$1,$2,$3......表示前方正则引用部分**()内为正则引用**,依照从左到右的顺序
}
if (!-f $request_filename) { 如果请求文件名不存在,则反向代理localhost
break;
proxy_pass http://127.0.0.1;
}