简介
介绍nginx中Web服务器的相关配置
环境配置
mkdir /data/web/html -p
mkdir /data/web/html/test{1..5}
echo test1 > /data/web/html/test1/index.html
echo test2 > /data/web/html/test2/index.html
echo test3 > /data/web/html/test3/index.html
echo test4 > /data/web/html/test4/index.html
echo test5 > /data/web/html/test5/index.html
配置DNS
C:\Windows\System32\drivers\etc
配置介绍
root与alias
vim /usr/local/nginx/conf/conf.d/web-service.conf
server {
listen 80;
server_name www.hello.com;
index index.html;location /test1 {
root /data/web/html;
}location /world {
alias /data/web/html/test2;
}
}
root访问方式为root路径+location路径
alias访问方式为alias即为完整路径
location正则
在location块中可以通过正则表达式来进行匹配
mkdir /data/web/html/test{1..5}/hello -p
echo web1 > /data/web/html/test1/hello/index.html
echo web2 > /data/web/html/test2/hello/index.html
echo web3 > /data/web/html/test3/hello/index.html
echo web4 > /data/web/html/test4/hello/index.html
echo web5 > /data/web/html/test5/hello/index.html
对文件的匹配
测试
对目录的匹配
测试
账户认证
提供一个在访问前进行账户认证的功能
创建账户
如果没有htpasswd,则需要下载httpd
htpasswd -cm /usr/local/nginx/conf/.htpasswd admin
htpasswd -m /usr/local/nginx/conf/.htpasswd test1
测试
自定义错误页面
mkdir /data/web/html/errors -p
echo error page > /data/web/html/errors/40x.html
测试
自定义错误日志
mkdir /data/nginx/log -p
测试
nginx自动创建日志
文件检测
try_files
是Nginx中的一个指令,用于按顺序检查文件或目录是否存在,并根据检查结果决定如何处理请求。如果指定的文件或目录存在,Nginx将使用找到的文件进行请求处理。如果所有指定的文件或目录都不存在,Nginx将根据try_files
指令的最后一个参数进行处理,这个参数可以是另一个文件路径、一个内部重定向的URI,或者是一个自定义的HTTP状态码。
try_files语法:
try_files file ... uri;
try_files file ... =code;
file
参数是需要检查的文件或目录路径。uri
参数是如果所有文件都不存在时,Nginx将重定向到的URI。code
参数是如果指定文件不存在,返回的自定义HTTP状态码。
echo try_files error > /data/web/html/errors/try_error.html
echo hello > /data/web/html/index.html
测试
长连接配置
长连接配置在主配置文件中
keepalive_timeout 65 60; #开启长连接后会话保持时间为65s,客户端显示会话保持时间为60s,如不设置客户端将不显示超时时间,默认75s
keepalive_requests 2; #会话期间可以请求的次数,默认100
测试
开启测试虚拟机
yum install -y telnet 下载telnet并配置hosts文件
下载服务器配置
使客户端浏览器能够通过列表格式完成下载请求
相关命令:
autoindex on | off; #自动文件索引功能,默为off
autoindex_exact_size on | off; #计算文件确切大小(单位bytes),off 显示大概大小(单位K、 M),默认on
autoindex_localtime on | off ; #显示本机时间而非GMT(格林威治)时间,默认off
autoindex_format html | xml | json | jsonp; #显示索引的页面文件风格,默认html
limit_rate rate; #限制响应客户端传输速率(除GET和HEAD以外的所有方法),单位 B/s,bytes/second,默认无限制
set $limit_rate 4k; #也可以通变量限速,单位B/s,同时设置,此项优级高.
实验
mkdir /data/web/html/download
dd if=/dev/zero of=/data/web/html/download/test_file bs=1M count=100 #制作文件
测试
nginx状态页
用来监测nginx基本状态
nginx压缩功能
Nginx支持对指定类型的文件进行压缩然后再传输给客户端,而且压缩还可以设置压缩比例,压缩后的文 件大小将比源文件显著变小,样有助于降低出口带宽的利用率,降低企业的IT支出,不过会占用相 应的CPU资源。
在主配置文件中配置
制作测试文件
echo hello world > /data/web/html/small.html
cat /var/log/messages > /data/web/html/big.html
测试
使用另一台虚拟机测试
nginx变量
nginx的变量分为内置变量和自定义变量;可以在配置文件中引用,作为功能判断或日志场景使用。
内置变量
$remote_addr; #存放了客户端的地址
$args; #存放URI中的参数,无参数为空
$is_args; #有参数为?,无参数为空
$document_root; #存放当前请求的目录
$document_uri; #存放当前请求中不包含参数的URI
$host; #存放请求的host名称
echo $limit_rate; #存放网络速率,若没有设置,则显示0
$remote_port; #客户端请求的端口
$remote_user; #保存经过Auth Basic Module验证的用户名,若无则为空
$request_body_file; #反向代理时发送给后端服务器的本地资源名称
$request_method; #请求资源的方式
$request_filename; #请求的资源的磁盘路径,由root或alias指令与URI请求生成的文件绝对路径
$request_uri; #请求参数的原始URI,不包含主机名
$scheme; #请求使用的协议
$server_protocol; #客户端请求资源使用的协议版本
$server_addr; #服务器的IP地址
$server_name; #虚拟主机的主机名
$server_port; #虚拟主机的端口
$http_user_agent; #客户端浏览器的详细信息
$http_cookie; #客户端的所有cookie信息
$cookie_<name>; #name为请求的任意cookie的key
$http_<name>; #name为任意请求报文首部字段,表示记录请求报文的首部字段,ame的对应的首部字段名需要为小写,如果有 横线需要替换为下划线
$sent_http_<name>; #name为响应报文的首部字段,name的对应的首部字段名需要为小写,如果有横线需要替换为下划线,此变量有 问题
$arg_<name>; #此变量存放了URL中的指定参数,name为请求url中指定的参数
location / {
root /data/web/html;
echo $cookie_key1;
# echo $http_cookie;
# echo $http_user_agent;
# echo $server_port;
# echo $server_name;
# echo $server_addr;
# echo $server_protocol;
# echo $scheme;
# echo $request_uri;
# echo $request_filename;
# echo $request_method;
# echo $remote_user;
# echo $remote_port;
# echo $limit_rate;
# echo $host;
# echo $document_uri;
# echo $document_root;
# echo $is_args;
# echo $remote_addr;
# echo $args;
}
自定义变量
nginx rewrite
rewrite
指令用于基于正则表达式修改请求的URI。这个指令可以在server
或location
块中使用。
if命令
用于条件匹配判断,并根据条件判断结果选择不同的Nginx配置,可以配置在server或location块中进行 配置,Nginx的if语法仅能使用if做单次判断,不支持使用if else或者if elif这样的多重判断。
if (条件匹配) {
action
}
可以使用正则表达式对匹配条件进行筛选
= #比较变量和字符串是否相等,相等时if指令认为该条件为true,反之为false
!= #比较变量和字符串是否不相等,不相等时if指令认为条件为true,反之为false
~ #区分大小写字符,可以通过正则表达式匹配,满足匹配条件为真,不满足匹配条件为假
!~ #区分大小写字符,判断是否匹配,不满足匹配条件为真,满足匹配条件为假
~* #不区分大小写字符,可以通过正则表达式匹配,满足匹配条件为真,不满足匹配条件为假
!~* #不区分大小字符,判断是否匹配,满足匹配条件为假,不满足匹配条件为真
-f 和 !-f #判断请求的文件是否存在和是否不存在
-d 和 !-d #判断请求的目录是否存在和是否不存在
-x 和 !-x #判断文件是否可执行和是否不可执行
-e 和 !-e #判断请求的文件或目录是否存在和是否不存在(包括文件,目录,软链接)
#注意: 如果$变量的值为空字符串或0,则if指令认为该条件为false,其他条件为true。 #nginx 1.0.1之前$变量的值如果以0开头的任意字符串会返回false
set命令
指定key并给其定义一个变量,变量可以调用Nginx内置变量赋值给key
set $key value #命令格式
break命令
用于中断当前相同作用域(location)中的其他Nginx配置,与该指令处于同一作用域的Nginx配置中,位于它前面的配置生效,位于break后面的配置不再执行。
Nginx服务器在根据配置处理请求的过程中遇到该指令的时候,回到上一层作用域继续向下读取配置,该指令可以在server块和locationif块中使用。
注意: 如果break指令在location块中后续指令还会继续执行,只是不执行rewrite模块的指令,其它指令还会执行。
return命令
return用于完成对请求的处理,并直接向客户端返回响应状态码,比如:可以指定重定向URL(对于特殊重 定向状态码,301/302等) 或者是指定提示文本内容(对于特殊状态码403/500等);处于此指令后的所有配 置都将不被执行,return可以在server、if 和 location块进行配置
命令格式
return code; #返回给客户端指定的HTTP状态码
return code [text]; #返回给客户端的状态码及响应报文的实体内容,可以调用变量,其中text如果有空格,需要用单或双引号
return code URL; #返回给客户端的URL地址
rewrite命令
通过正则表达式的匹配来改变URI,可以同时存在一个或多个指令,按照顺序依次对URI进行匹配, rewrite主要是针对用户请求的URL或者是URI做具体处理。
命令格式
rewrite regex replacement [flag];
rewrite将用户请求的URI基于regex所描述的模式进行检查,匹配到时将其替换为表达式指定的新的URI
注意:如果在同一级配置块中存在多个rewrite规则,那么会自下而下逐个检查;被某条件规则替换完成 后,会重新一轮的替换检查,隐含有循环机制,但不超过10次;如果超过,提示500响应码,[flag]所表示的 标志位用于控制此循环机制
rewrite flag介绍
利用nginx的rewrite的指令,可以实现url的重新跳转,rewrite有四种不同的flag,分别是redirect(临时 重定向302)、permanent(永久重定向301)、break和last。其中前两种是跳转型的flag,后两种是代理型。
fiag说明
redirect;
#临时重定向,重写完成后以临时重定向方式直接返回重写后生成的新URL给客户端 ,由客户端重新发起请求;使用相对路径,或者http://或https://开头,状态码:302
permanent;
#重写完成后以永久重定向方式直接返回重写后生成的新URL给客户端 ,由客户端重新发起请求,状态码:301
break;
#重写完成后,停止对当前URL在当前location中后续的其它重写操作,而后直接跳转至重写规则配置块之后的其它配置,结束循环,建议在location中使用,适用于一个URL一次重写
last;
#重写完成后,停止对当前URI在当前location中后续的其它重写操作,而后对新的URL启动新一轮重写检查,不建议在location中使用,适用于一个URL多次重写,要注意避免出现超过十次以及URL重写后返回错误的给用户
实验
判断文件是否存在,若不存在则重定向至首页
测试
nginx防盗链
防盗链基于客户端携带的referer实现,referer是记录打开一个页面之前记录是从哪个页面跳转过来的标 记信息,如果别人只链接了自己网站图片或某个单独的资源,而不是打开了网站的整个页面,这就是盗 链,referer就是之前的那个网站域名。
正常的referer信息有以下几种
none: #请求报文首部没有referer首部,比如用户直接在浏览器输入域名访问web网站,就没有referer信息。
blocked: #请求报文有referer首部,但无有效值,比如为空。
server_names: #referer首部中包含本主机名及即nginx 监听的server_name。
arbitrary_string: #自定义指定字符串,但可使用*作通配符。示例: *.hello.com、 www.world.*
regular expression: #被指定的正则表达式模式匹配到的字符串,要使用~开头,例如: ~.*\.hello\.com