Nginx配置
I.work_processes 1 进程数
worker_connections 1024; 单进程支持最大并发连接数
nginx支持最大并发数:work_processes * worker_connections
cat /proc/cpuinfo |grep "cores"|uniq查CPU核数(linux)
每个worker进程都是单线程的进程,多worker进程可以充分利用多核系统架构,但若worker进程的数量多于CPU内核数,那么会增大进程间切换带来的消耗(linux是抢占式内核),一般情况下,配置与CPU内核数相等的worker进程,大于CPU核数可配置但会抢占内核,增大消耗。
events块的主要功能:
配置Nginx服务器与用户的网络连接。
pid /var/run/nginx.pid; 进程号存放日志 用来配置Nginx当前master进程的进程号ID存储的文件路径
Win+R dxdiag (windows)
II. /etc/nginx/mime.types HTTP协议消息头中的Content-Type(mime类型)
在HTTP协议消息头中,使用Content-Type来表示请求和响应中的媒体类型信息。它用来告诉服务端如何处理请求的数据,以及告诉客户端(一般是浏览器)如何解析响应的数据,比如显示图片,解析并展示html等等。
default_type application/octet-stream; #默认文件类型
设置日志模式
日志格式设置。
remote_addr与http_x_forwarded_for用以记录客户端的ip地址;
$remote_user:用来记录客户端用户名称;
$time_local: 用来记录访问时间与时区;
$request: 用来记录请求的url与http协议;
$status: 用来记录请求状态;成功是200,
$body_bytes_sent :记录发送给客户端文件主体内容大小;
$http_referer:用来记录从那个页面链接访问过来的;
$http_user_agent:记录客户浏览器的相关信息;
sendfile on;
sendfile开启高效文件传输模式,sendfile指令指定nginx是否调用sendfile函数来输出文件,对于普通应用设为 on。如果因为nginx原因图片显示不正常把这个改成off。
tcp_nopush on|off(默认值);
该指令必须在sendfile打开的状态下才会生效,主要是用来提升网络包的传输'效率'
主要思想:要发送的数据先放在缓冲区(no push),等缓冲区满了再发
tcp_nodelay on(默认值)|off;
该指令必须在keep-alive连接开启的情况下才生效,来提高网络包传输的'实时性'
主要思想:一有数据就发送,没有任何延时(no delay)
keepalive_timeout 65 超时时间 指定了客户端与服务器 keep-alive的超时时间,默认75秒
在nginx中设置打开压缩
gzip on|off; #是否开启gzip
gzip_buffers 32 4K| 16 8K #缓冲(压缩在内存中缓冲几块? 每块多大?)
gzip_comp_level [1-9] #推荐6 压缩级别(级别越高,压的越小,越浪费CPU计算资源)
gzip_disable #正则匹配UA 什么样的Uri不进行gzip
gzip_min_length 200 # 开始压缩的最小长度(再小就不要压缩了,意义不在)
gzip_http_version 1.0|1.1 # 开始压缩的http协议版本(可以不设置,目前几乎全是1.1协议)
gzip_proxied # 设置请求者代理服务器,该如何缓存内容
gzip_types text/plain application/xml # 对哪些类型的文件用压缩 如txt,xml,html ,css
gzip_vary on|off # 是否传输gzip压缩标志
- = 开头表示精确匹配。如 A 中只匹配根目录结尾的请求,后面不能带任何字符串;
- ^~ 开头表示uri以某个常规字符串开头;
- ~ 开头表示区分大小写的正则匹配;
- ~* 开头表示不区分大小写的正则匹配;
- / 通用匹配, 如果没有其它匹配,任何请求都会匹配到。
优先级
首先精确匹配 =
全部路径匹配
其次前缀匹配 ^~
其次是按文件中顺序的正则匹配 ~或~*
然后匹配不带任何修饰的前缀匹配
最后是交给 / 通用匹配
- 1.try-files 如果不写上 $uri/,当直接访问一个目录路径时,并不会去匹配目录下的索引页 即 访问127.0.0.1/images/ 不会去访问 127.0.0.1/images/index.html
try_files $uri $uri/ @rewrites 尝试读取静态文件
@命名location定义规则
重写规则,先说$代表的是参数,所以一定是 () 包含的 $还有一重意思是以XXX结尾
(.*)表示任意字符
() : 用于匹配括号之间的内容,通过$1、$2调用
示例:
location /ABC/api/pgk-abc/ {
rewrite ^/ABC/(.*)$ /$1 break;
proxy_pass http://ip:port;
# 这里重写掉 ABC , $1 就是 api/pgk-abc/
# 实际请求地址是: http://ip:port/api/pgk-abc/
}
last 和 break 的区别
1. last 和 break 当出现在location 之外时,两者的作用是一致的没有任何差异。
注意一点就是,他们会跳过所有的在他们之后的rewrite 模块中的指令,去选择自己匹配的location
2. last 和 break 当出现在location 内部时,两者就存在了差异。
last: 使用了last 指令,rewrite 后会跳出location 作用域,重新开始再走一次刚刚的行为。
break: 使用了break 指令,rewrite后不会跳出location 作用域。它的生命也在这个location中终结。
3. 通俗易懂:
last:重新将rewrite后的地址在server标签中执行
break:将rewrite后的地址在当前location标签中执行
expires -1; 缓存,控制图片等过期时间。
1. client_max_body_size
限制请求体的大小,若超过所设定的大小,返回413错误。
client_header_timeout
读取请求头的超时时间,若超过所设定的大小,返回408错误。
3. client_body_timeout
读取请求实体的超时时间,若超过所设定的大小,返回413错误。
转发ip+端口,proxy_pass后面只要有带/的路径,location后面的地址就会丢失,转发路径被识别为绝对路径。