Nginx
是一个高性能的HTTP和反向代理web服务器,大部分使用作为代理。
MacOS安装
1.先安装homebrew
1 | /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" |
安装的时候碰到这样的问题,一直卡在这里。
解决方案:打开Xcode,然后选择「Xcode」-「Open Developer Tool」-「More Developer Tools」
登陆appleID之后下自己对应版本的Command Line Tools就好了,之后再安装一次。
2.安装Nginx
1 | brew install nginx |
运行与停止
1 | brew services start nginx |
启动之后打开localhost:8080
1.修改配置
MacOS在文件夹中 command+shift+g,打开/usr/local/etc/nginx文件夹。
修改nginx.conf文件的include,就可以在servers文件夹下添加新的配置文件
/usr/local/etc/nginx目录下新建一个servers文件里,里面新建一个test.conf文件,语句结尾一定要加封号。文件内容如下
1 | server { |
2.配置host
1 | sudo vi /etc/hosts |
i 编辑,esc 结束,:wq 退出
3.重启nginx
1 | brew services restart nginx |
koa启动个服务监听http://127.0.0.1:3000/
1 | const koa = require('koa'); |
nginx.html
1 |
|
4.打开test.com:8899
Nginx配置文件
1 | user nobody; |
多错误指向同个页面
1 | error_page 500 502 503 504 /50x.html;#错误状态码的显示页面,配置后需要重启 |
单独错误指向页面
1 | error_page 404 /404.html;# 配置404页面 |
页面可以使用服务器资源
1 | error_page 404 https://qinhanwen.github.io/; |
如果找不到页面就会跳转到 https://qinhanwen.github.io/
控制一些IP访问,我们可以直接在location
里进行配置
就是在同一个块下的两个权限指令,先出现的设置会覆盖后出现的设置(也就是谁先触发,谁起作用)
1 | location / { |
deny all;在前面,就所有ip都不允许访问
所有img目录都允许访问,admin目录不允许访问,allow允许,deny不允许
1 | location =/img{ |
= 号是精确匹配。
修改server选项
1 | server { |
在user/local/var/www下面新增了一个test.html,重启nginx打开test.com:8899
反向代理
1 | server { |
访问test.com:8899反向代理到http://127.0.0.1:3000
其他反向代理指令
- proxy_set_header :在将客户端请求发送给后端服务器之前,更改来自客户端的请求头信息。
- proxy_connect_timeout:配置Nginx与后端代理服务器尝试建立连接的超时时间。
- proxy_read_timeout : 配置Nginx向后端服务器组发出read请求后,等待相应的超时时间。
- proxy_send_timeout:配置Nginx向后端服务器组发出write请求后,等待相应的超时时间。
- proxy_redirect :用于修改后端服务器返回的响应头中的Location和Refresh。
根据userAgent匹配,加载不同资源
1 | server { |
在/usr/local/var/www/下新建两个文件夹,里面分别有一个test.html
在chrome访问test.com:8899
在firfox访问test.com:8899
可以通过userAgent判断,区别不同平台,来加载不同的资源。
Gzip,Gzip是需要服务器和浏览器同时支持的
修改一下配置文件
1 | server { |
访问test.com的时候返回html,size是692B
开启Gzip,重启nginx
1 | ... |
size为546B
Nginx提供了专门的gzip模块,指令:
- gzip : 该指令用于开启或 关闭gzip模块。
- gzip_buffers : 设置系统获取几个单位的缓存用于存储gzip的压缩结果数据流。
- gzip_comp_level : gzip压缩比,压缩级别是1-9,1的压缩级别最低,9的压缩级别最高。压缩级别越高压缩率越大,压缩时间越长。
- gzip_disable : 可以通过该指令对一些特定的User-Agent不使用压缩功能。
- gzip_min_length:设置允许压缩的页面最小字节数,页面字节数从相应消息头的Content-length中进行获取。
- gzip_http_version:识别HTTP协议版本,其值可以是1.1.或1.0.
- gzip_proxied : 用于设置启用或禁用从代理服务器上收到相应内容gzip压缩。
- gzip_vary : 用于在响应消息头中添加Vary:Accept-Encoding,使代理服务器根据请求头中的Accept-Encoding识别是否启用gzip压缩。
内置全局变量
$host:请求信息中的Host
,如果请求中没有Host
行,则等于设置的服务器名
$request_method:客户端请求类型,如GET
、POST
$remote_addr:客户端的IP
地址
$args:请求中的参数
$content_length:请求头中的Content-length
字段
$http_user_agent:客户端agent信息
$http_cookie:客户端cookie信息
$remote_port:客户端的端口
$server_protocol:请求使用的协议,如HTTP/1.0
、·HTTP/1.1`
$server_addr:服务器地址
$server_name:服务器名称
$server_port:服务器的端口号
Nginx跨域
页面在http://192.168.0.103:8000/域下
前端接口请求http://test.com:8899
服务起在http://127.0.0.1/3000域下
koa
1 | const koa = require('koa'); |
nginx.html
1 |
|
Nginx配置文件
1 | server { |
缓存配置
1.修改一下之前新建的test.conf文件
1 | proxy_cache_path /usr/local/etc/nginx levels=1:2 keys_zone=my_cache:10m; |
说明:
/usr/local/etc/nginx 目录
levels=1:2 是否创建二级文件夹,如果没创建会随着缓存变多越来越慢
keys_zone=my_cache:10m 声明内存大小来缓存,以及之后可以通过名字来确定使用哪个缓存
2.重启nginx的时候,打不开test.com:8899
1 | nginx -T |
报错信息:
原因是在nginx.conf文件里,两次 include server/* 导致的,删掉一个就好了
缓存功能
第一个例子,设置 Cache-Control:max-age=20,s-maxage=0
1.创建服务
1 | const koa = require('koa'); |
服务监听127.0.0.1:3000,访问 / 的时候返回html页面,访问 /getData 的时候设置响应头,延迟2秒返回响应体
2.添加页面
1 |
|
页面加载的时候发送请求,并且改变body的innerHTML
3.打开页面
上面配置了test.com:8899映射到127.0.0.1:3000,所以打开test.com:8899,两秒后响应,body内容变成success
然后快速刷新页面,发现页面显示success,并且状态码旁边显示 from disk cache
然后快速打开火狐浏览器,再缓存失效时间之前,访问test.com:8899,页面2秒后,从body内容变成了success。
以上是浏览器缓存
第二个例子,设置Cache-Control:max-age=0,s-maxage=20
1 | const koa = require('koa'); |
先打开chrome,访问test.com:8899,页面2秒后,body内容变成了success。
在缓存失效之前,打开火狐,访问test.com:8899,页面一闪而过显示success
以上是代理缓存
第三个例子
1)先设置Cache-Control:max-age=0,s-maxage=20,private
刷新页面,每次都要等待2秒才会将body内容变为success。
2)再设置max-age=5,s-maxage=20,private
第一次刷新页面等待2秒后,body内容变为success,只要缓存5秒失效时间内刷新,都是显示success,并且是来自磁盘的缓存
private这个属性是代理服务器不允许缓存
第四个例子,设置Cache-Control:max-age=20,s-maxage=20,no-store
这个是代理服务器和浏览器都不缓存
第五个例子,Vary头部
1 | xconst koa = require('koa'); |
1 |
|
点击到页面变成5之前,都是缓存的数据
因为这个头部
这个头部的意思就是接受某些指定请求头,请求头的值如果被缓存过,未失效,就使用缓存。一般使用这个头部用于区分平台,是否使用缓存。