-
ocation: 用来设置请求的URI。 其语法较为灵活,支持 =(精确匹配) ~(正则,区分大小写) ~*(正则,不区分大小写) ^~(模式不匹配则终止) @() uri… (uri变量是待匹配的请求字符串).Nginx 搜索location和server_name一样,都是先精确再模糊**(正则)**,主要用来设置我们应用的分级路由这样的配置
server{ listen 80; server_name localhost # 设置主路由 location /{ root www default_type text/plain index index.html } }
-
root / alias 请求资源的目录:
root是设置请求的根目录 , 而alias更改location的URI.说实话,刚看到这我也是懵逼的,不过咱们拉一个表就OK了
root alias 用法 root path; alias path; 位置 http, server, location location 区别 root 不需要/ 对于local 最后一位是/的存在, alias也需要/ -
index: 设置网站的默认首页, (可以跟多个文件)
-
error_page 指令: 设定网站的错误页面。语法如下:
# 格式error_page code [= newcode] reponse. eg. error_page 404 https://XXX/404
code可以是400-500这些常见的错误码,后面的Reponse可以放置网址,也可以放置HTML, 重定向等
-
静态资源配置优化:
# 开启快速传输文件模式, 一般配置在HTTP块 sendfile on; # 提高网络包的传输效率 tcp_nopush on; # 提高网络包的实时性 tcp_nodelay on;
- 首先是sendfile的优化认知。我们知道,当用户请求资源的时候,客户端首先通过网络接口向服务端发送请求,操作系统将这些请求传递给服务器端应用程序,之后服务器端处理这些请求,处理完成后,还需要操作系统将处理的结果传递回去。而开启了sendfile之后**操作系统直接调取sendfile(本身也是C的底层的函数,不需要经过服务端的拷贝) 直接发送传给Sockt调用。**大大加快了静态资源的请求方式
- 之后是tcp_nopush, 该指令必须在setfile打开之后才能生效,提高传输效率。什么意思呢,tcp_nopush 确保数据包在填充的时候被充分的填满,从而较少传输次数达到较少网络开销的过程。
- tcp_nodelay, 该指令必须在keep-alive开启的条件下生效,提高传输的实时性。也就是数据来了就要发送。本来与上面缓存到数据包充分充满再发送是矛盾的,但是Linux2.5.9以后的版本两者可以兼容
(只能说操作系统牛逼)。如果出现最后一个包填不满的时候,Nginx会忽略tcp_nopush参数,强制socket发送数据。
-
Nginx压缩指令:nginx支持静态资源的压缩。以下几个模块为Nginx常用的压缩模块包
ngx_http_gzip_module ngx_http_gzip_static_module ngx_http_gunzip_module
Gzip模块命令(上面的第一个模块):
-
gzip: 用于开启或关闭gzip功能, 默认off。 只有打开gzip, 其他gzip模块设置才有效
http{ gzip on; }
-
gzip_types指令: 根据响应页的MIME类型选择性的开启Gzip压缩功能,可以多参数,默认值对HTML生效
http{ gzip_types sometype }
-
gzip_comp_level: 用来设置Gzip压缩程度,级别从1到9,(从最不卷到最卷),default = 1
http{ gzip_comp_level 6; }
-
gzip_vary 用来设置Gzip压缩是否携带Vary:Accept_Encoding , 表示文件是否经过压缩,default = off
http{ gzip_vary 6; }
-
gzip_buffers: 用于处理请求压缩的缓冲区大小与数量 default = 32 4k(32位) | 16 8k (64位)
# gzip_buffers number size;不推荐更改 http{ gzip_buffers 32 8k }
-
Gzip 与 sendfile共存的问题:
sendfile最根本的优化师保证了操作系统直接调用文件而不经过客户端的拷贝。而Gzip势必要求客户端进行文件压缩,即文件必须经过拷贝到客户端中。解决办法:在访问之间进行压缩。直接将压缩过的文件发给客户端,
#检查与访问资源同名的.gz文件。默认值off, 可以开启on 或always #使用前先导入包 include ngx_http_gzip gzip_static on;
-
浏览器缓存:
HTTP协议中与页面缓存相关的字段:
Expires 缓存的过期时间与日期 Cache-Control 设置缓存相关的配置信息 Last-Modifield 请求资源最后的修改时间 ETag 请求变量的实体标签的当前值,eg.md5, sha256 - 强缓存:本地缓存未过期。直接从缓存相应给用户
- 弱缓存:本地缓存过期, 但是与web匹配hash 没有变化,响应304,从缓存中取给用户。
-
Nginx设置浏览器缓存内容:
# expire 控制页面缓存的过期时间与存储方式 # 默认值 expires off # 设置过期时间.time 时间单位为秒。 time小于零代表缓存禁用。 time >= 0指代过期时间 expires [modified] time # epoch, max指具体时间点。 epoch 1970.1.1 0:0:1 no-cache max 十年后 expires epoch|max|off
当然Nginx还支持add-header添加一些我们需要的头信息
add header name value
-
Nginx 跨域问题:
首先要了解什么是同源策略:浏览器的一种约定,是浏览器最核心也是最基本的安全功能。同源,指协议, IP, 端口均相同才称之为同源。不同源的客户端在没有明确授权的情况下,不能读写对方的资源。
比如说我之前写一个HTML, 要用到另一个网上找到的视频。我直接把链接地址放上去了,然后放到我的服务器上。结果别人访问我的网页发现视频不能正常播放。这就是一个跨域。虽然我是用js解决的,但是Nginx也可以解决跨域问题,何乐不为?
我们在请求头上面加两个头信息即可解决跨域问题:
# 允许跨域访问的源地址信息 add_header Access-Control-Allow-Origin *; # 允许跨域访问的请求方式, 如GET, POST, PUT.... 也可以全部设置 add_header Access-Control-Allow-Methods GET, POST;
-
静态资源防盗链:
上面我们讲过跨域问题本质就是为了保护资源不被非同源(他人)设备读写。所以说解决了跨域问题再一定程度上为我们数据的保护造成了影响。
Nginx提供静态放盗链机制来规避解决跨域造成的数据机密性完成性受损情况。
防盗链的实现原理:
首先了解Referer, 当浏览器向web服务器发送请求的时候, 一般都会带上Referer告诉浏览器该网页是从那个页面链接过来的。而后台服务器根据获取到的这个Referer信息判断是否是自己信任的网站地址。如果不信任会返回403.
Nginx实现防盗链的方法:
# 语法: valid referers none| blocked| server_names| string. 如果匹配到了, 就将invalid_referer设为0,否则默认值为1 location ~.*\.(png|jpg|gif){ # 这里随意写你的匹配规则 vaild_referers none blocked www.baidu.com 192.168.1.1 ; if ($invaild_referer){ return 403; } }
但是对于爬虫或其他可以随意更改请求头referers的人来说这种限制还是太过于粗粒度。这个时候可以考虑ngx_http_accesskey_module, 第三方库实现防盗链。
-
Rewrite功能配置
Rewrite是nginx的一个重要基本功能,主要的作用是实现URL的重写。URL重写是非常有用的功能,比如它可以让我们在改变网站结构后,不需要要求客户端用户修改原来的书签,也无需其他网站修改对我们网站的友情链接;
Nginx Rewrite的实现依赖于PCRE包(一个正则表达式的包)
- set指令:
# set指令:用来设置一个新的变量 location /hello { set $name Tom; set $age 18; default_type text/plain; return 200 $name:$age; } # 常用用的全局变量: $args # 存放请求参数 $http_user_agent # 用户访问服务的代理信息,浏览器的版本信息等 $host # 访问服务的server_name $limit_rate # 存储Nginx服务器对网络连接速率的限制(默认为0,不限制) # 剩下一堆全局变量请去官方文档。这些全局变量可以更方便我们记录日志,请见上面的log format http{ log_format format_Bydefine '$remote_addr - $request - $status - $request_uri'; location /server{ access_log logs/access.log format_Bydefine; ....... # 可以放上上面一坨 } }
- if 指令, 其实上面就已经接触了一些,这里细化语法
# if ($变量){} 这里if 和括号之间一定要有空格. 字符串不需要加引号 # if支持的运算符: # 1.直接放变量,空/0 = False else True # 2.使用= , != # 3.使用正则表达式 ~ # 4.判断请求的文件是否存在 -f 与 !-f # 5.判断请求的文件或目录是否存在 -e 与 !-e # 6.判断请求的目录是否存在 -d 与 !-d # 7.判断请求的文件是否可执行 -x 与 !-x location /hello{ if ($request_method = POST){ return 405; } }
- break指令:处于同于作用域的指令在break之前的生效而后面的指令无效.此外还可以进行重定向
- return 指令。 对于完成请求的处理,直接返回,后面的配置无效
-
Nginx学习3
最新推荐文章于 2022-05-09 17:32:43 发布