[TOC]
本文章是查找多方资料(马哥教育、极客学院等)整合而来。
在此处先感谢下 马哥教育 http://www.magedu.com/
1 nginx配置文件结构
默认情况下,nginx的配置文件位置为:/etc/nginx/目录
其中的nginx.conf为主配置文件
这篇文章先来看看主配置文件nginx.conf的配置
nginx.conf中的配置大概可以分为main、server、location这几个作用域或者叫“段”。
所以,可以将这配置文件nginx.conf的内容分为main段、server段和location段。
- main段的配置一般来讲在main、server、location中都有效
- server段的配置一般来讲在server和location中生效
- location段的配置一般来讲只在location段中生效
......
events{
......
}
http{
......
server{
......
}
server{
......
}
......
}
2 http段常用指令
# 包含了同一目录下的mime.types文件内容,MIME类型映射相关配置
include mime.types;
# 默认的MIME类型
default_type application/octet-stream;
#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
# '$status $body_bytes_sent "$http_referer" '
# '"$http_user_agent" "$http_x_forwarded_for"';
# 访问日志
#access_log logs/access.log main;
# 错误日志
#error_log logs/error.log crit;
# 内核复制模式,启用可达到最大IO效率
sendfile on;
#tcp_nopush on;
# 和HTTP/1.1长连接相对应的配置
#keepalive_timeout 0;
keepalive_timeout 65;
# 内容压缩相关配置
# 内容压缩,可提高网络IO效率
gzip on;
# 内容长度大于gizp_min_length才启用压缩
gzip_min_length 1000;
# 压缩级别1~9,级别越高,压缩率越高,同时系统开销越大。
gzip_comp_level 4;
# 可用于压缩的MIME类型
gzip_types text/plain text/xml text/css application/json application/x-javascript;
# 静态文件缓存的相关配置
# 最大缓存数量
open_file_cache max=655350 inactive=20s;
# 验证缓存有效期时间间隔
open_file_cache_valid 30s;
# 有效期内文件最少使用次数
open_file_cache_min_uses 2;
3 location段
一般情况下一个请求到达后对其对应的url,nginx会将它解析到某一个location来处理。这个解析的过程实际上根据location的配置基本可以分为字符串匹配和正则表达式匹配这2种。
3.1 一般语法
location [ = | ~ | ~* | ^~ ] uri { ... }
location @name { ... }
- =:精确匹配
- ~:正则匹配,区分大小写
- ~*:正则匹配,不区分大小写
- ^~:关闭正则查找功能
可以大致分为两类,普通匹配和正则匹配。
3.2 匹配过程
(1) 精确匹配
(2) ^~
(3) ~ 或 ~*
(4) 不带任何符号的URL
注意
- 当两个location的优先级一样,以最长前缀为准
- 当优先级一样,最长前缀一样,以定义顺序为准
4 nginx.conf常用优化选项
4.1 配置示例
# 用户
#user nobody;
# worker进程数
# 通常应该小于等于CPU核心的数目
worker_processes 1;
# 错误日志路径
# 错误日志级别可以为:debug|info|notice|warn|error|crit
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
# pid文件路径
# 默认为/var/run/nginx/nginx.pid
#pid logs/nginx.pid;
# 每进程最大可用文件描述符数,文件描述符用完会拒绝新的连接产生502类错误
worker_rlimit_nofile 655350;
# 事件模型相关的配置
events {
# 每进程最大的同时连接数
# 服务器最大连接数 maxConnections = worker_connections * worker_processes
# 当今浏览器一般会同时打开两个连接到服务器,
# 所以,做静态服务器时,最大客户端数 maxClient = maxConnections / 2
# 做反向代理时 maxClient = maxConnections / 4
worker_connections 1024;
# 指定网络模型 epoll或者kquene
# Linux推荐采用epoll,FreeBSD推荐采用kquene
use epoll;
}
# http相关配置
http {
# 包含了同一目录下的mime.types文件内容,MIME类型映射相关配置
include mime.types;
# 默认的MIME类型
default_type application/octet-stream;
# 该项一般由HTML代码中的meta来设置
#charset utf-8;
server_names_hash_bucket_size 128;
client_header_buffer_size 32k;
large_client_header_buffer_size 4 32k;
# 客户端能够提交的最大数据大小
client_max_body_size 32m;
#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
# '$status $body_bytes_sent "$http_referer" '
# '"$http_user_agent" "$http_x_forwarded_for"';
# 访问日志
#access_log logs/access.log main;
# 错误日志
#error_log logs/error.log crit;
# 内核复制模式,启用可达到最大IO效率
sendfile on;
#tcp_nopush on;
# 和HTTP/1.1长连接相对应的配置
#keepalive_timeout 0;
keepalive_timeout 65;
# 内容压缩相关配置
# 内容压缩,可提高网络IO效率
gzip on;
# 内容长度大于gizp_min_length才启用压缩
gzip_min_length 1k;
gzip_buffers 4 16k;
gzip_http_version 1.1;
# 压缩级别1~9,级别越高,压缩率越高,同时系统开销越大。
gzip_comp_level 4;
# 可用于压缩的MIME类型
gzip_types text/plain text/xml text/css application/json application/x-javascript;
# gzip_vary on;
# 静态文件缓存的相关配置
# 最大缓存数量
open_file_cache max=655350 inactive=20s;
# 验证缓存有效期时间间隔
open_file_cache_valid 30s;
# 有效期内文件最少使用次数
open_file_cache_min_uses 2;
# server表示一个虚拟主机,可以配置多个虚拟主机
server {
# 监听的端口
listen 80;
# 匹配的域名
server_name localhost;
# 字符集设置
#charset utf-8;
# 访问日志文件路径
#access_log logs/host.access.log main;
location / {
# 根目录
root html;
# 默认主页
index index.html index.htm;
expires 2h;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
#location ~ \.php$ {
# proxy_pass http://127.0.0.1;
#}
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
#location ~ \.php$ {
# root html;
# fastcgi_pass 127.0.0.1:9000;
# fastcgi_index index.php;
# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
# include fastcgi_params;
#}
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
#location ~ /\.ht {
# deny all;
#}
}
}
4.2 常见选项说明
- tcp_nodelay on|off
在keepalive模式下时,多个小报文合并为一个报文发送,提供带宽利用率。
一般为off。
- sendfile on|off
这个和内核空间与用户空间,以及nginx的工作原理相关,还牵扯到操作系统。一两句话说不清。
- tcp_nopush on|off
在sendfile 为on的时候才生效。表示是否启用tcp_nopush(freeBSD)或tcp_cork(linux)。
一般为off。
- aio on | off
是否启用异步IO
- directio off | size
是否启用直接IO,不在内存中缓存。
- open_file_cache
open_file_cache off;
max=number
超过max设置的值时,会采用一定的算法(比如LRU)淘汰缓存。
inactive=time
在指定的时长time内没有被访问过的缓存条目被视为无效缓存条目,
淘汰策略对于此类缓存条目直接删除
该指令可以影响以下属性:
缓存的文件信息:
文件描述符,文件大小,文件最近一次修改时间
缓存的目录信息:
打开的目录结构
缓存的以前操作失败的文件:
文件不存在
没权限操作的文件等
- open_file_cache_errors on | off
表示是否缓存访问出错的文件的相关信息,比如文件不存在、文件操作权限不足等
- open_file_cache_valid time
每隔多久检测缓存条目的有效性
open_file_cache_valid 60s;
- open_file_cache_min_uses count
open_file_cache_min_uses 1;
- alias
只能用于location段。注意和root指令的区别:
location /test1/ {
# root可以出现于location、server段
root /web/resources/;
}
location /test2/ {
# alias只能出现于location段
alias /web/resources/;
}
对于以上配置:
http://xxx.com/test1/1.html
===> /web/resources/test1/1.html文件
http://xxx.com/test2/1.html
===> /web/resources/1.html文件
- error_page err_code... [=respCode] path/to/page
error_page 404 /404.html;
# 将404的返回码改成200回送给客户端
error_page 404 =200 /404.html;
- try_files
指定一系列资源路径(n个),当某个资源访问不到时,依次尝试该系列资源路径(1到n-1),最后一个往往是一个URL,当前面n-1个资源都找不到时将跳转至该URL。
并且,为了避免循环重定向等异常情况,最后一个URL应该是可靠的。
location =/favicon.icon {
# 当favicon.icon找不到时会依次尝试f.ico,f1.ico,f2.ico
try_files /f.ico /f1.ico /f2.ico;
}
# 最后一个URL应该确保它是可靠的(但不是必须的V_V)
location =/f2.ico {
# ......
# expire 30s;
}
- keepalive_timeout time
time为0表示禁用keepalive功能
keepalive_timeout 20s;
- keepalive_requests count
在持久连接上所允许请求的最大资源数量
keepalive_requests 100;
- keepalive_disable none | browser1 browser2...
禁止特定类型浏览器的浏览器的keepalive功能。
- send_timeout time
回送响应报文的超时时长
send_timeout 60s;
- client_body_buffer_size size
# 客户端请求报文body的最大缓存大小,超出此值,将存储到磁盘
client_body_buffer_size 16k;
- client_body_temp_path path [l1 [l2 [l3]]]
客户端请求body超出client_body_buffer_size(比如文件上传),
将存储到该值指定的磁盘位置
# 16进制字符命名的目录,数字表示目录名里面十六进制字符的个数
client_body_temp_path /tmp/nginx/client_body 1 2 3;
# 表示16个一级目录
# 每个一级目录下有16^2个二级目录
# 每个二级目录下有16^3个三级目录
- limit_except httpMethod {...}
对指定范围之外的请求方法进行额外限制
# GET 方法只允许127.0.0.1访问
limit except GET {
allow 127.0.0.1;
deny all;
}
- limit_rate speed
限制客户端每秒钟所能传输的字节数
0表示无限制
limit_rate 256k;