Nginx是一个http服务器,是一个使用c语言开发的高性能的http服务器及反向代理服务器,由俄罗斯的程序设计师Igor Sysoev所开发
Nginx的应用场景
- 静态资源服务器
- API 接口服务 ( 权限控制、缓存 )
- 反向代理、负载均衡
Nginx 的架构 多进程(单线程) 和多路IO多路复用模型 - 多个进程,每个进程只有一个线程 工作流程
Nginx在启动之后,会有一个master process和多个相互独立的worker进程,master进程 -> worker 进程 传递信号,每个进程都有可能会处理这个连接 master进程也可以监控woker 进程,当我 kill -9 进程ID ,强制杀死的时候,会自动启动新的worker 进程 好处:高可用、基本上从来不会宕机
IO多路复用
- 多个文件描述符都能在一个线程里并发交替顺序完成,复用线程
cpu 亲和
- 把CPU内核和nginx的工作进程绑定在一起,让每个worker进程固定在一个CPU上执行 从而减少CPU的切换并提高缓存命中率,提高 性能
sendfile
- 零拷贝传输模式
nginx目录结构
- client_body_temp
- fastcgi_temp
- logs 日志目录
- access.log 访问日志,包含所有访问记录
- error.log 错误日志,包含访问出错的记录
- nginx.pid Nginx 运行的进程号
- sbin Nginx 可执行文件目录
- nginx Nginx 启动文件,常用命令都在这里
- uwsgi_temp
- conf 配置文件目录
- nginx.conf Nginx 核心配置文件
- mime.types mime.types 当 Web 服务器收到静态的资源文件请求时,依据请求文件的后缀名在服务器的 MIME 配置文件中找到对应的 MIME Type,再根据 MIME Type 设置 HTTP Response 的Content-Type,
- koi-utf、koi-win、win-utf 主要是一些编码
- 然后浏览器根据 Content-Type 的值处理文件
- html 默认解析的静态文件目录
- proxy_temp
- scgi_temp
alias与root的区别 root 是直接拼接root+location而 alias 是用alias替换locationroot和location不能同时存在
server 和
location中的root
- 优先级:就近原则,就跟原型链差不多
location
语法规则
- = 精确匹配
- ^~ 匹配上后不再进行正则表达式的匹配
- ~ 大小写敏感的正则表达式匹配
- ~* 忽略大小写的正则表达式匹配
- 常规匹配
匹配规则
- = 优先级最高,一旦成功,不再匹配其他项
- ^~ ,一旦成功,不再匹配其他项
- ~ ~* 优先级次之,多个location 匹配的话,使用最长的那个
- 常规匹配
- 案例演示 location ~ /T1/$ { return 200 '匹配到第一个正则表达式'; }
location ~* /T1/(\w+)$ { return 200 '匹配到最长的正则表达式'; }
location ^~ /T1/ { return 200 '停止后续的正则表达式匹配'; }
location /T1/T2 { return 200 '最长的前缀表达式匹配'; }
location /T1 { return 200 '前缀表达式匹配'; }
location = /T1 { return 200 '精确匹配'; }
/T1 //精确匹配
/T1/ //停止后续的正则表达式匹配
/T1/T2 //匹配到最长的正则表达式
/T1/T2/ //最长的前缀表达式匹配
/t1/T2 //匹配到最长的正则表达式
rewrite
last 本规则匹对后,继续向下配对
break 本规则匹对后,不继续向下匹对。URL
redirect 返回302临时重定向,浏览器显示新的URL
permanent 返回301永久重定向,浏览器显示新的URL
301重定向和302重定向的区别
-
302重定向只是暂时的重定向,搜索引擎会抓取新的内容而保留旧的地址,因为服务器返回302,所以,搜索搜索引擎认为新的网址是暂时的。
-
而301重定向是永久的重定向,搜索引擎在抓取新的内容的同时也将旧的网址替换为了重定向之后的网址。
这里提出一个问题,那为啥有时候来回切换路由的时候,不404,刷新的时候404呢
这里的原因是,现代浏览器都支持 pushState,可以改变 URL 的同时不请求服务器,所以你从首页进去,点击链接跳转正常。 但是这些 URL,在服务器上并不存在真实的物理映射,所以你直接访问的时候,服务器会报 404 错误。
遇到的常见的一些问题
针对post请求解决办法:
修改nginx.conf里面的几个相关的配置参数
client_body_buffer_size 10m(配置请求体缓存区大小, 不配的话)
client_max_body_size 20m(设置客户端请求体最大值)
client_body_temp_path /data/temp (设置临时文件存放路径只有当上传的请求体超出缓存区大小时,才会写到临时文件中,注意临时路径要有写入权限)
如果上传文件大小超过client_max_body_size时,会报413 entity too large的错误。
接口响应加载不出来一直转圈圈,一会能出来一会不能出来这种情况可能是缓存区大小设置的比较小
- proxy_buffer_size 4k;
该指令设置缓冲区大小,从被代理服务器取得的响应内容,会先读取放置到这里.小的响应header通常位于这部分响应内容里边.设置的过小,可能会产生502错误。
- proxy_buffers 256 4k;
这个指令用于设置从被代理服务器读取应答内容的缓存区的数目和大小。数目可以任意定,但是一个缓存区的大小一般就是4k或者8k。
- proxy_busy_buffers_size 8k;
在系统繁忙的时候可以申请更大的proxy_buffers缓冲区。一般就设置成proxy_buffers的二倍。
- proxy_connect_timeout
这个指令用于设置和被代理服务器链接的超时时间,是代理服务器发起握手等待响应的超时时间。不要设置的太小,否则会报504错误。
- proxy_read_timeout 60
这个参数配置在http,server,location
此指令用于设置从被代理服务器读取应答内容的超时时间。
- proxy_max_temp_file_size 1G
设置临时文件的大小
- proxy_method
用于允许代理其他HTTP方法。