开发者学堂课程【Nginx 企业级 Web 服务实战:Nginx 基础配置】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/649/detail/10758
Nginx 基础配置(二)
三、作为下载服务器配置
示例:
程序是怎么下载的呢?
其实就是有一个 Nginx 前端,Nginx 服务器本身有一个 download 请求下载页面,会指向一个固定的 uri,然后在某个目录放了一些安装程序,
例如 app1,app2,app3,然后将这些app做成二维码,扫描时会先访问到 Nginx 上,然后 Nginx 再接收下载的请求,uri 中包括一些特殊的字段 download,比如访问一个uri:www.magedu.net
访问.net 后会跟有一个 download,
www.magedu.net/download/,要下载 app1,就会提供 app1的路径
例如阿里云官网上的下载,有一个 OS 镜像下载,随机选择一个发行版 centos,选择一个版本 7(x86_64-DVD-1908),然后会给一个下载地址 uri,访问该 uri,显示该页面
该页面其实就是一个下载界面,点击后就会出现很多下载链接
所以主要还是使用 Nginx,下载站点时首先要做一个 download,专门用来下载那些资源
演示:
在 pc 端上创建一个 download 作为一个下载的目录,然后可以在 download 上放很多东西,输入
mkdir download
cd download/
ll
pwd
然后将显示的 /data/nginx/html/pc/download 复制做一个镜像下载
在本地找到两个资源上传两个镜像
下载完后想要将路径 /data/nginx/html/pc/download 作为下载站点
然后接着编辑 pc,
输入vim /apps/nginx/conf/conf.d/linux39-pc.conf
进入后再写一个站点 download,在最后输入
location /download {
root /data/nginx/html/pc;
}
接着要加入两个参数:
autoindex on;
#自动索引功能将页面里的内容或者将目录中的内容全部创建出
autoindex_exact_size on
; #计算文件确切大小(单位 bytes) , off 只显示大概大小(单位 kb、mb,gb)
还可以增加时间:
autoindex_localtime on;
#显示本机时间而非 GMT (格林威治)时间
location /download {
root /data/nginx/html/pc;
autoindex on;
autoindex_exact_size on;
autoindex_localtime on;
}
之后保存再 reload 一下,然后就可以访问界面
magedu.net/download/,显示如图
只拷了一个,另一个资源还未传完
传的速度太慢,有可能是交换机限制,内网限速,这就有关到交换器性能快慢。
虽然有两个服务器,但是这两个服务器服务的东西需要通过交换机交换,一个服务器的东西传给交换机,然后交换机再交给另一个服务器,所以速度较慢
先删除传的资源从内部拷一下,在 centos 中输入
cd data/
ll
cd vmware/
ll
cd ISO/
ll
进入到 ISO 中,专门放置镜像,然后拷贝刚才的路径 /data/nginx/html/pc/download
然后继续输入 scp ubuntu-18.04.3-
scpubuntu-18.04.3-desktop-amd64.iso root@172.20.0.101:/data/nginx/html/pc/download
再输入账号密码,如图开始拷贝
再刷新网址,如图出现两个资源
以字节单位显示,如果想要以 G 为单位显示,在配置中修改 autoindex_exact_size off; 这样就会显示以 M 为单位或者以 G,刷新网址如图
内网下载很快,点击链接下载
下载完成
limit_rate rate; #限制响应给客户端的传输速率,单位是 bytes/second,默认值0表示无限制
限速与不限速的对比:
limit_rate 10k;
可以在 Nginx 官网上查看:限制向客户端传输响应的速率。在 rate 被以每秒字节数指定。零值禁用速率限制。该限制是根据请求设置的,因此,如果客户端同时打开两个连接,则总速率将是指定限制的两倍。
可以指定值,
演示:在配置中输入
limit_rate 20k;
保存后 reload 再去访问刚才的下载页面,下载第一个链接,就不可能像刚才一样下载很快,如图就会限制速率大概在20k 之间
四、作为上传服务器
client_max_body_size 1m; #设置允许客户端上传单个文件的最大值,默认值为 1m
具体可以在 Nginx 官网上查询:
设置客户端请求正文的最大允许大小,在" Content-Length "请求标头字段中指定。如果请求中的大小超过配置的值,则会向客户端返回413(请求实体太大)错误。
请注意,浏览器无法正确显示此错误。设置 size 为0将禁用客户端请求主体大小的检查。
client_body_buffer_size size;#用于接收每个客户端请求报文的 body 部分的缓冲区大小;默认16k ;超出此大小时,其将被暂存到磁盘上的由下面 client_body_temp_path 指令所定义的位置
client_body_temp_path path [level1 [leve12 [level3]]]
#设定存储客户端请求报文的 body 部分的临时存储路径及子目录结构和数量,目录名为16进制的数字,使用 hash 之后的值从后往前截取1位、2位、2位作为文件名:
上传和下载不一样,如果缓存到 Nginx,但是未能上传到 PHP,由于一些因素会导致该服务器数据丢失,尤其是运行了多个应用程序时。所以上传一般不推荐缓存设置的太大
配置实例:
client_max_body_size 10m;
client_body_buffer_size 16k;
client_body_temp_path /apps/nginx/temp 1 2 2;
#reload Nginx 会自动创建 temp 目录
存储的效果如图
这里存在一个分层,该目录 client_body_temp_path 是哪里,然后里面的缓存资源怎么分层,现介绍分为三层,使用十六进制,每一层有几个字符用于命名文件名称,
第一层就是一个字符,从0到f这十六个数用于命名文件目录的名称,第二是两个字符,第一个字符是0-f,第二个字符也是0-f,
第三层同样是两个字符0-f,范围很大
即1级目录占1位16进制,即2^4=16个目录0-f
2级目录占2位16进制,,即2^8=256个目录00-ff
3级目录占2位16进制,即2^8=256个目录00-ff
这样分层会让文件全部以分层的方式保存到各个目录中去,就不会将文件放在一个目录中,就不会在插入一个目录时导致数据紊乱
演示:放在在主配置中,输入
vim /apps/nginx/conf/nginx.conf
之后放在keepalive_requests 200下,输入
client_max_body_size 10m;
client_body_buffer_size 16k;
client_body_temp_path /apps/nginx/temp 1 2 2;
然后有一个 temp 目录,该目录需要 nginx 对启动的 root 用户有一个启动权限,查看该用户有没有权限,输入
ll /apps/nginx/
/apps/ngin/sbin/nginx -t
/apps/nginx/sbin/nginx -s reload
没有会自动创建,对于这种缓存目录,一般会自动创建,输入
ll /apps/nginx/
ll /apps/nginx/temp
结果就显示出 temp
五、其他配置
1)keepalive_disable none | browser ...; #对哪种浏览器禁用长连接
Nginx 官网上:
句法:keepalive_disable none | browser .. .;
默认:keepalive_disable msie6;
在配置中也添加该参数,输入
vim /apps/nginx/conf/nginx.conf
在#gzip on;下输入
keepalive_disable msie6;
保存后 reload,再访问网址 magedu.net
2) limit_except method ... { ... },仅用于 location
限制客户端使用除了指定的请求方法之外的其它方法。限制位置允许的 HTTP 方法。
method:GET,HEAD,POST,PUT,DELETE,MKCOL,COPY,MOV,OPTIONS,PROPFIND,PROPPATCH,LOCK,UNLOCK,PATCH
limit_except GET {
allow 192.168.0.0/24;
allow 192.168.7.101;
deny all;
这将限制对除 FET 和 HEAD 之外的所有方法的访问
现在使用 curl 命令来指定测试,该参数只能配置在 location 中
输入vim /apps/nginx/conf/conf.d/linux39-pc.conf
在配置中的 location /download{} 中输入
limit_except GET{
}
对于外网用户来说,我们不希望有上传,所以输入 deny all;
之后来写 cur l命令,在另一个窗口输入
curl -XPUT /etc/issuehttp://www.magedu.net/download/
可以看到传的状态码为403
curl: (3) <url> malformed
<html>
<head><title>403 Forbidden</title></head>
#Nginx拒绝上传
<body bgcolor="white">
<center><h1>403 Forbidden</h1></center>
<hr><center>nginx</center>
</body>
</html>
405是 nginx 已经允许但是程序未能支持上传功能,不允许就会报403
先将资源限制注释掉,再在另个窗口上输入
curl -XPUT /etc/issue
http://www.magedu.net/download/
就会报405
curl: (3) <url> malformed
<html>
<head><title>405 Not Allowed</title></head>
<body bgcolor="white">
<center><h1>405 Not Allowed</h1></center>
<hr><center>nginx</center>
</body>
</html>
这种安全的防护最好放在最外层,例如所有的服务器都在机房里面,公司最入口就是防火墙,一定要将请求放在防火墙外侧,把恶意请求在防火墙过滤掉