2.深入nginx配置
2021-01-08 本文已影响0人
_少年不知愁
1.nginx优势
nginx是一个 轻量级/高性能的反向代理Web服务器,他实现非常高效的反向代理、负载平衡,他可以处理2-3万并发连接数,官方监测能支持5万并发;
高性能:异步非阻塞事件处理机制:运用了epoll模型,提供了一个队列,排队解决
1.1 nginx如何处理请求
#nginx接收一个请求后,首先由listen和server_name指令匹配server模块,再匹配server模块里的location,location就是实际地址
server { # 第一个Server区块开始,表示一个独立的虚拟主机站点
listen 80; # 提供服务的端口,默认80
server_name localhost; # 提供服务的域名主机名
location / { # 第一个location区块开始
root html; # 站点的根目录,相当于Nginx的安装目录
index index.html index.htm; # 默认的首页文件,多个用空格分开
} # 第一个location区块结果
}
2.nginx配置
nginx.config配置组成.jpg2.1 配置参数解释
worker_processes 1; # worker进程的数量
events { # 事件区块开始
worker_connections 1024; # 每个worker进程支持的最大连接数
} # 事件区块结束
http { # HTTP区块开始
include mime.types; # Nginx支持的媒体类型库文件
default_type application/octet-stream; # 默认的媒体类型
sendfile on; # 开启高效传输模式
keepalive_timeout 65; # 连接超时
server { # 第一个Server区块开始,表示一个独立的虚拟主机站点
listen 80; # 提供服务的端口,默认80
server_name localhost; # 提供服务的域名主机名
location / { # 第一个location区块开始
root html; # 站点的根目录,相当于Nginx的安装目录
index index.html index.htm; # 默认的首页文件,多个用空格分开
} # 第一个location区块结果
error_page 500502503504 /50x.html; # 出现对应的http状态码时,使用50x.html回应客户
location = /50x.html { # location区块开始,访问50x.html
root html; # 指定对应的站点目录为html
}
}
2.2 root&alias&location
root 指定站点根目录,可配置在 server与location中,基于ROOT路径+URL中路径去寻找指定文件
alias 指定站点别名 只能配置location 中。基于alias 路径+ URL移除location 前缀后的路径来寻找文件。
# 默认站点根目录
root /usr/static/;
location /V1 {
alias /www/old_site;
index index.html index.htm;
}
# 2.访问规则如下
URL:http://xxx:xx/V1/a.html
最终寻址:/www/old_site/a.thml
# 3.区别,root获取/usr/static1/s1 寻找静态资源
# alias直接去/usr/static1寻找
location /s1 {
root /usr/static1/;
index index.html index.htm;
}
location /s2 {
alias /usr/static1/;
index index.html index.htm;
}
location指令的作用是根据用户请求的URI来执行不同的应用,也就是根据用户请求的网站URL进行匹配,匹配成功即进行相关的操作
匹配符 | 匹配规则 | 优先级 |
---|---|---|
= | 精确匹配 | 1 |
^~ | 以某个字符串开头 | 2 |
~ | 区分大小写的正则匹配 | 3 |
~* | 不区分大小写的正则匹配 | 4 |
!~ | 区分大小写不匹配的正则 | 5 |
!~* | 不区分大小写不匹配的正则 | 6 |
/ | 通用匹配,任何请求都会匹配到 | 7 |
示例
#优先级1,精确匹配,根路径
location =/ {
return 400;
}
#优先级2,以某个字符串开头,以av开头的,优先匹配这里,区分大小写
location ^~ /av {
root /data/av/;
}
#优先级3,区分大小写的正则匹配,匹配/media*****路径
location ~ /media {
alias /data/static/;
}
#优先级4 ,不区分大小写的正则匹配,所有的****.jpg|gif|png 都走这里
location ~* .*\.(jpg|gif|png|js|css)$ {
root /data/av/;
}
#优先7,通用匹配
location / {
return 403;
}
2.3 限流
正常限制访问频率
limit_req_zone $binary_remote_addr zone=mylimit:10m rate=1r/m;
#limit_req_zone定义在http块中,$binary_remote_addr 表示保存客户端IP地址的二进制形式。
# Zone定义IP状态及URL访问频率的共享内存区域
# zone=keyword标识区域的名字,以及冒号后面跟区域大小。16000个IP地址的状态信息约1MB,所以示例中区域可以存储160000个IP地址
# Rate定义最大请求速率。示例中速率不能超过每秒100个请求
#burst排队大小,nodelay不限制单个请求间的时间
location / {
limit_req zone=mylimit burst=20 nodelay;
index index.html index.htm;
}
#配置限流后json格式返回
error_page 503 /503;
location = /503 {
default_type 'application/json;charset=GBK';
return 200 '{
"success": false,
"code": "9999",
"message": "访问频繁,稍后再试!"}';
}
突发限制访问频率(突发流量)
2.4 负载均衡
#1.轮询
upstream myhttp { # 配置多台服务器
server 192.168.0.12;
server 192.168.0.13;
}
location ^~ /vote/ {
proxy_pass http://myhttp/vote/;
}
#2.权重 weight
upstream backserver {
server 192.168.0.12 weight=2;
server 192.168.0.13 weight=8;
}
#3.ip_hash( IP绑定)
upstream backserver {
ip_hash;
server 192.168.0.12:88;
server 192.168.0.13:80;
}
#4.fair
#必须安装upstream_fair模块。
#对比 weight、ip_hash更加智能的负载均衡算法,fair算法可以根据页面大小和加载时间长短智能地进行负载均衡,响应时间短的优先分配
upstream backserver {
server server1;
server server2;
fair;
}
#5.url_hash(第三方插件)
#必须安装Nginx的hash软件包
#按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,可以进一步提高后端缓存服务器的效率
upstream backserver {
server squid1:3128;
server squid2:3128;
hash $request_uri;
hash_method crc32;
}
#6.服务器备份
upstream backserver {
server 192.168.0.12 ;
server 127.0.0.1:8030 backup;
}
upstream 相关参数
- server 反向服务地址 加端口
- **weight **权重
- **max_fails **失败多少次 认为主机已挂掉则,踢出
- **fail_timeout **踢出后重新探测时间
- **backup **备用服务
- **max_conns **允许最大连接数
- **slow_start **当节点恢复,不立即加入,而是等待 slow_start 后加入服务对列。
2.5 高可用
server {
listen 80;
server_name www.lijie.com;
location / {
### 指定上游服务器负载均衡服务器
proxy_pass http://backServer;
###nginx与上游服务器(真实访问的服务器)超时时间 后端服务器连接的超时时间_发起握手等候响应超时时间
proxy_connect_timeout 1s;
###nginx发送给上游服务器(真实访问的服务器)超时时间
proxy_send_timeout 1s;
### nginx接受上游服务器(真实访问的服务器)超时时间
proxy_read_timeout 1s;
index index.html index.htm;
}
}
2.6 判断别IP不可访问
# 如果访问的ip地址为192.168.9.115,则返回403
if ($remote_addr = 192.168.9.115) {
return 403;
}
2.7 限制浏览器访问
## 不允许谷歌浏览器访问 如果是谷歌浏览器返回500
if ($http_user_agent ~ Chrome) {
return 500;
}
2.8 请求头设置
add_header Cache-Control no-cache; 关闭缓存设置
2.9 Rewrite&try_files
location /abc {
try_files /4.html /5.html @qwe;
#检测文件4.html和5.html,如果存在正常显示,不存在就去查找@qwe值
}
location @qwe {
rewrite ^/(.*)$ http://www.baidu.com;
#跳转到百度页面
}
location / {
add_header Cache-Control no-cache;
alias /usr/local/nginx/static/; # 指定当前静态文件目录
try_files $uri $uri/ @router; # 尝试读取 $uri (比如请求localhost/ht/index,则uri = /ht/index 最后都路由到 index.html)
}
location @router {
rewrite ^.*$ /index.html last;
}
# ^.*$ ^是正则开始,$是结束,.*代表 任意字符出现零次或多次
常见变量
变量 | 含义 |
---|---|
$args | 这个变量等于请求行中的参数,同$query_string |
$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相同。 |