配置文件
可以使用include命令简化配置,include命令很好理解,就是把另一个文件的内容包含在本文件中
例如:a.conf中有 include b.conf,就表示a.conf中包含了b.conf的内容
参考
https://akuma.github.io/2013/11/02/%E4%BD%BF%E7%94%A8-include-%E6%8C%87%E4%BB%A4%E7%AE%80%E5%8C%96-Nginx-%E9%85%8D%E7%BD%AE/
log_format
定义nginx的日志格式的部分,主要包括这些参数
参数 说明 示例
$remote_addr:客户端ip地址
$remote_user:客户端用户名称(一般好像是"-")
$time_local:访问时间和时区(可以简单理解为客户端请求nginx的时间)
$request:请求的URI和HTTP协议 示例:“GET /article-10000.html HTTP/1.1”
$http_host:请求地址,即浏览器中你输入的地址(IP或域名) 示例:www.ha97.com;198.98.120.87
$status:HTTP请求状态(应该是响应状态?) 示例:200
$upstream_status upstream状态 200
$body_bytes_sent 发送给客户端文件内容大小 1547
$http_referer url跳转来源 https://www.google.com/
$http_user_agent 用户终端浏览器等信息 “Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; SV1; GTB7.0; .NET4.0C;
$ssl_protocol SSL协议版本 TLSv1
$ssl_cipher 交换数据中的算法 RC4-SHA
$upstream_addr 后台upstream的地址,即真正提供服务的主机地址 10.36.10.80:80
$request_time:可以简单理解为整个请求的时间
从客户端发出请求---->nginx代理将请求发送到服务器---->服务器响应给nginx--->nginx响应给客户端
$upstream_response_time:可以理解为nginx跟服务端交互的时间
nginx代理将请求发送到服务器---->服务器响应给nginx
server
一个server表示一个虚拟主机。一个nginx可以在配置文件nginx.conf配置多个server;简单理解,一个nginx可以通过配置的多个server来实现监听多个端口
listen 80; 虚拟主机监听的端口80
server_name test.hadoop.com; 虚拟主机的名称
access_log /***/***/**.log; access.log日志文件的存放路径
error_log /***/***/**.log; error.log日志文件的存放路径
root /***/***/; 静态资源(编译之后的html、css、js文件的根路径)路径,index.html、static、WEB-INF的上级路径
index * 指定部署在nginx中的网站的首页,示例:index index.html,表示指定的网站首页就是index.html(其实默认的也是这个)
server中的$host代表什么意思?
nginx会根据优先级去取:1、请求行中的host;2、请求头中的Host头部;3、与一条请求匹配的server name
前两条可以简单理解为访问的域名,例如 https:www.baidu.com,那么在nginx的配置文件nginx.conf中的
server模块,使用$host的时候,取到的值就是www.baidu.com。第三条:可以理解为,如果请求中没有带域名(暂时还未发现有这种请求),nginx.conf中server_name配置的值就会作为$host的值,如果配置的有多个,就会取第一个。
注意:
server模块的server_name不是必须配置的;
server_name的值跟请求中的host没有任何关系,他们不相同也可以正常访问
例如:server_name配置为test.hadoop.com,假设该nginx部署的机器ip为11.22.33.44,则该虚拟主机(test.hadoop.com)监听的就是11.22.33.44:80,假如我在自己的机器中host中配置 11.22.33.44 aaa.test.com,那么我使用自己的浏览器访问 aaa.test.com也可以正常访问到test.hadoop.com(11.22.33.44)
$uri:表示浏览器访问的地址(除去域名之后的内容),示例,浏览器中访问的地址http://www.test.com/index.html,那么在nginx中的配置文件中使用$uri获取到的值就是 index.html;如果浏览器中访问的地址http://www.test.com/abc/test.html,那么在nginx中的配置文件中使用$uri获取到的值就是abc/test.html
server中的location
匹配http请求的前缀(除去域名)
location的匹配规则:
语法规则: location [=|~|~*|^~] /uri/ { … }
= 开头表示精确匹配
^~ 开头表示uri以某个常规字符串开头,理解为匹配 url路径即可。nginx不对url做编码,因此请求为/static/20%/aa,可以被规则^~ /static/ /aa匹配到(注意是空格)。以xx开头
~ 开头表示区分大小写的正则匹配 以xx结尾
~* 开头表示不区分大小写的正则匹配 以xx结尾
!~和!~*分别为区分大小写不匹配及不区分大小写不匹配 的正则
/ 通用匹配,任何请求都会匹配到
示例:
匹配根路径,例如访问https://www.baidu.com
location / {
proxy_pass http://example_upstream/; 需要跳转到的目的地址(在upstream中配置)
proxy_set_header Host: test.example.com; 设置请求头的字段内容
proxy_set_head X-real-ip $remote_addr; 设置请求头的字段内容
proxy_next_upstream error timeout http_500; 表示请求(https://www.baidu.com/example)出现错
误、超时、500状态码的时候,也会跳转到proxy_pass指定的位置;当前,指定的参数还可以包含其他
的,不光只有这些
try_files;0.7以后的版本中加入的try_files指令,配合命名location,可以部分替代原本常用的rewrite配置方式,提高解析效率
}
try_files:去尝试到网站目录读取用户访问的文件,如果第一个变量存在,就直接返回;
不存在继续读取第二个变量,如果存在,直接返回;不存在直接跳转到第三个参数上。
示例:loation / {
...
try_files $uri $uri/ /index.html
}
当浏览器访问的url为 https://www.baidu.com/时,会匹配到“loation /”,此时$uri为/,当try_files进行解析时,会先看nginx静态资源中的文件或者文件夹(见本文server模块,root的配置)是“/”的(匹配到$uri),如果没有,在看nginx静态资源中的文件或者文件夹是是“//”的(匹配到$uri/),如果还没有,则匹配nginx静态资源中的“/index.html”,如果有/index.html则返回该文件内容给浏览器,如果没有,则匹配失败,一般会跳转到nginx的错误页
匹配具体路径,例如访问https://www.baidu.com/example
location /example/ {
proxy_pass http://hadoop/; 需要跳转到的目的地址(在upstream中配置)
proxy_set_header Host: test.example.com; 设置请求头的字段内容
proxy_set_head X-real-ip $remote_addr; 设置请求头的字段内容
proxy_next_upstream error timeout http_500; 表示请求(https://www.baidu.com/example)出现错
误、超时、500状态码的时候,也会跳转到proxy_pass指定的位置;当前,指定的参数还可以包含其他
的,不光只有这些
}
注意:post, lock, patch 这种会对服务器造成不幂等的请求方式,默认是不进行重试的(即使在
proxy_next_upstream配置了错误重试),如果一定要进行重试,则要加上这个配置non_idemponent。
原来的就变成了proxy_next_upstream error timeout http_500 non_idemponent;
upstream
location中的proxy_pass指定的内容
upstream example_upstream {
server 127.0.0.1:6666 weight=10 max_fails=2 fail_timeout=30s ;
}
upstream hadoop {
server 123.45.67.1:6666 weight=10 max_fails=2 fail_timeout=30s ;
}
常用命令
https://www.cnblogs.com/54chensongxia/p/12938469.html