2.深入nginx配置

2021-01-08  本文已影响0人  _少年不知愁

nginx快速入门链接(搭建,组成)

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配置组成.jpg

2.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 相关参数

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相同。
上一篇下一篇

猜你喜欢

热点阅读