上一篇文章概述与罗列了"全局配置块、events配置块、http全局块"的基本配置与属性,本篇文章将继续深入server块的配置项,以及相关应用。
上篇文章地址:Nginx基础02:配置文件nginx.conf(Part1)
如何使用本篇文章
正式开始前,还是再次强调server块在配置文件中的位置:
http-server块
server块和“虚拟主机”的概念有密切联系
公有配置
error_page指令
防盗链
valid_referers none | blocked | server_names | string...
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name res.hackyle.com;
ssl_certificate "/etc/nginx/cert/res.hackyle.com.pem";
ssl_certificate_key "/etc/nginx/cert/res.hackyle.com.key";
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 10m;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
#防盗链:验证所有请求中的Referer是否来自*.hackyle.com,否则响应403
valid_referers blocked *.hackyle.com;
if ($invalid_referer){
return 403;
}
#客户端:增删改查的接口
#对外提供静态资源的地址:https://res.hackyle.com/桶名/年份/月份/uuid.文件拓展名
location / {
proxy_pass http://localhost:9000/;
}
}
地址重写
rewrite regex replacement [flag];
rewrite_log on | off(默认值);
流程控制
set $variable value;
if (condition){...}
变量名:对应的值为空或者是0,if都判断为false,其他条件为true。
"="和"!=":满足条件为true,不满足为false。例如:if ($request_method = POST){ return405; }
正则表达式:匹配成功返回true,否则返回false。变量与正则表达式之间使用"~","~*","!~","!~\*"来连接。
"~"代表匹配正则表达式过程中区分大小写,
"~\*"代表匹配正则表达式过程中不区分大小写
"!~"和"!~\*"刚好和上面取相反值,如果匹配上返回false,匹配不上返回true
例子:
if ($http_user_agent ~MSIE){
#$http_user_agent的值中是否包含MSIE字符串,如果包含返回true
}
注意:正则表达式字符串一般不需要加引号,但是如果字符串中包含"}"或者是";"等字符时,就需要把引号加上。
文件是否存在:
if (-f $request_filename){
#判断请求的文件是否存在。文件存在时返回true
}
if (!-f $request_filename){
#判断请求的文件是否不存在。文件不存在且文件目录存在时返回true,其他情况返回false
}
判断请求的目录是否存在使用"-d"和"!-d"
当使用"-d"时,如果请求的目录存在,if返回true,如果目录不存在则返回false
当使用"!-d"时,如果请求的目录不存在但该目录的上级目录存在则返回true,该目录和它上级目录都不存在则返回false,如果请求目录存在也返回false.
判断请求的目录或者文件是否存在使用"-e"和"!-e"
当使用"-e",如果请求的目录或者文件存在时,if返回true,否则返回false.
当使用"!-e",如果请求的文件和文件所在路径上的目录都不存在返回true,否则返回false
判断请求的文件是否可执行使用"-x"和"!-x"
当使用"-x",如果请求的文件可执行,if返回true,否则返回false
当使用"!-x",如果请求文件不可执行,返回true,否则返回false
break;
中断当前作用域break后面的指令,即位于它前面的指令配置生效,位于后面的指令配置无效
位置:server、location、if
return code [text] | code URL |URL;
listen: 监听端口
Listen指令:指定本个server所使用的端口(监听端口)
[default_server]
[ssl]
[http2| spdy]
[proxy_protocol]
[setfib=number]
[fastopen=number]
[backlog=number]
[rcvbuf=size]
[sndbuf=size]
[accept_filter=filter]
[deferred]
[bind]
[ipv6only=on|off]
[reuseport]
[so_keepalive=on|off|[keepidle]:[keepintvl]:[keepcnt]];
[default_server]
[ssl]
[http2| spdy]
[proxy_protocol]
[setfib=number]
[fastopen=number]
[backlog=number]
[rcvbuf=size]
[sndbuf=size]
[accept_filter=filter]
[deferred]
[bind]
[ipv6only=on|off]
[reuseport]
[so_keepalive=on|off|[keepidle]:[keepintvl]:[keepcnt]];
[default_server]
[ssl]
[http2|spdy]
[proxy_protocol]
[backlog=number]
[rcvbuf=size]
[sndbuf=size]
[accept_filter=filter]
[deferred]
[bind]
[so_keepalive=on|off|[keepidle]:[keepintvl]:[keepcnt]];
参数
address:监听请求来的IP地址
port:端口号
default_server:默认server
backlog=number
accept_filter=filter:设置监听端口对请求的过滤,被过滤的内容不能被接收和处理。
bind:标识符
实例
server_name: 指定域名
功能:用于配置虚拟主机的名称
语法:server_name name…;
实例:server_name myserver.com www.myserver.com
name:域名,多个用空格分割
name匹配优先级:
准确匹配server_name
通配符在开始时匹配server_name成功
通配符在结尾时匹配server_name成功
正则表达式匹配server_name成功
location: URL映射
功能:映射URL请求(支持正则)到具体的页面、处理器上
语法:location [ = | ~ | ~* | ^~] uri {
root请求访问的根目录(使用绝对路径);
index设置网站的首页;
}
URI映射
匹配的优先级:
等号类型(=)的优先级最高。一旦匹配成功,则不再查找其他匹配项,停止搜索。
^~类型表达式,不属于正则表达式。一旦匹配成功,则不再查找其他匹配项,停止搜索。
正则表达式类型(~ ~*)的优先级次之。如果有多个location的正则能匹配的话,则使用正则表达式最长的那个。
常规字符串匹配类型。按前缀匹配。
/通用匹配,如果没有匹配到,就匹配通用的
前置参数(“=”)示例
server {
listen 80;
server_name 127.0.0.1;
location =/abc {
...
}
}
可以匹配到
http://192.168.200.133/abc
http://192.168.200.133/abc?p1=TOM
匹配不到
http://192.168.200.133/abc/
http://192.168.200.133/abcdef
前置参数(“~”)示例
server {
listen 80;
server_name 127.0.0.1;
location ~^/abc\w${ #红色部分是正则,^表示一行的开始,$表示一行的结束,/表示请求中的斜杠
default_type text/plain;
return 200 "access success";
}
}
server {
listen 80;
server_name 127.0.0.1;
location ~*^/abc\w${
default_type text/plain;
return 200 "access success";
}
}
前置参数(“^~”)示例
server {
listen 80;
server_name 127.0.0.1;
location ^~/abc{
default_type text/plain;
return 200 "access success";
}
}
路径替换
请求别名:alias file-path |directory-path;
例子:
location /img/ {
alias /usr/local/image/; #将”/img/”替换为”/usr/local/image/”
#例如:请求/img/aa.jpg,在本机中将会被替换为/usr/local/image/aa.jpg
}
指定根目录:root path;
例子:
location /img/ {
root /usr/data/; #请求/img/aa.jpg,将会拼接为/usr/data/img/aa.jpg
}
反向代理
Reverse Proxy:用Nginx来接收internet上的连接请求,然后将请求转发给内部网络上的服务器去具体处理
proxy_pass URL;
proxy_set_header field value;
proxy_redirect redirect replacement; | proxy_redirect default; |proxy_redirect off;
proxy_buffering on(默认值)|off;
proxy_buffers number size;
proxy_buffer_size size;
proxy_busy_buffers_size size;
proxy_temp_path path;
proxy_temp_file_write_size size;
SSL
HTTPS是一种通过计算机网络进行安全通信的传输协议。它经由HTTP进行通信,利用SSL/TLS建立全通信,加密数据包,确保数据的安全性。
SSL(Secure Sockets Layer)安全套接层
TLS(Transport Layer Security)传输层安全
ssl_certificate file;
ssl_ceritificate_key file;
ssl_sesion_cache off | none | [builtin[:size]] [shared:name:size]
ssl_session_timeout time;
ssl_ciphers ciphers;
ssl_perfer_server_ciphers on |off(默认值);
访问控制
允许访问:allow [ address | CIDR | all ]
禁止访问:deny all/IP网段;
例子:
location / {
deny 10.1.100.100; #不允许该IP访问
allow 10.1.200.0/24; #允许该网段访问
allow 192.168.1.0/16; #允许该网段访问
deny all; #除了allow允许的网段,其他请求IP都禁止访问
}
内置变量
nginx的配置文件中可以使用的内置变量以美元符$开始,也有人叫全局变量。其中,部分预定义的变量的值是可以改变的。
$args:
$content_length :请求头中的Content-length字段。
$content_type :请求头中的Content-Type字段。
$document_root :当前请求在root指令中指定的值。
$host :请求主机头字段,否则为服务器名称。
$http_user_agent :客户端agent信息
$http_cookie :客户端cookie信息
$limit_rate :这个变量可以限制连接速率。
$request_method :客户端请求的动作,通常为GET或POST。
$remote_addr :客户端的IP地址。
$remote_port :客户端的端口。
$remote_user :已经经过Auth Basic Module验证的用户名。
$request_filename :当前请求的文件路径,由root或alias指令与URI请求生成。
$scheme :HTTP方法(如http,https)。
$server_protocol :请求使用的协议,通常是HTTP/1.0或HTTP/1.1。
$server_addr :服务器地址,在完成一次系统调用后可以确定这个值。
$server_name :服务器名称。
$server_port :请求到达服务器的端口号。
$request_uri :包含请求参数的原始URI,不包含主机名,如:”/foo/bar.php?arg=baz”。
$uri :不带请求参数的当前URI,$uri不包含主机名,如”/foo/bar.html”。
$document_uri :与$uri相同