Nginx

1. Nginx

  Nginx 是一个高性能的Web服务器,反向代理服务器和邮件服务器。其特点是占有内存少,并发能力强。

2. Nginx 进程

  Nginx 有一个 master 进程和一个或多个 worker 进程。如果启用缓存,Cache Manager 和 Cache Loader 进程也会运行。

  • master 进程:读取配置文件,管理 worker 进程等。

  • worker 进程处理实际的网络请求。进程的数量由 nginx.conf 配置文件中的 worker_processes 指令定义。

  Nginx 启停命令:

./nginx    #启动 nginx
./nginx -s reload|reopen|stop|quit  #-s向主进程发送信号,重新加载配置|重新打开日志|立即关机|正常关机 
./nginx -t    #测试配置是否有语法错误
./nginx -v  #nginx 版本

3. 反向代理

  反向代理:代理服务器接收用户请求,然后将请求通过策略转发给后端服务器,并将后端服务器的响应返回给用户。

  Nginx 反向代理功能通过 location 块中的 proxy_pass 指令配置。

server {
    listen  80;
    server_name  localhost;

    location / {
        proxy_pass http://127.0.0.1:8080; 
    }
}

4. 负载均衡

  Nginx 负载均衡功能是通过 upstream 模块来实现的,使用 server 命令指定后端服务器的 IP 地址和端口,还可以设置状态值。

  • down  表示当前的server暂时不参与负载。

  • weight  负载的权重值。

  • max_fails  允许请求的失败次数,默认为1,配合 fail_timeout 一起使用。

  • fail_timeout  经过 max_fails 失败次数后,暂停服务的时间。

  • backup  当其他所有非备机出现故障或者繁忙的时候,才会请求备机,访问压力最小。

负载均衡策略

(1)轮询(默认):将请求按时间顺序依次分发到不同的后端服务器。

upstream backserver { 
    server 192.168.10.11:80; 
    server 192.168.10.12:80; 
} 

(2)加权轮询:指定轮询权重,weight 值越大,分发的几率就越大,主要用于后端服务器性能不均衡的情况。

upstream backserver { 
    server 192.168.10.11:80;
    server 192.168.10.12:80 weight=3; 
} 

(3)ip_hash:按用户IP的哈希值分发请求,来自同一个IP的请求会转发到同一台后端服务器,可以有效解决 session 共享问题。

upstream backserver { 
    ip_hash;
    server 192.168.10.11:80; 
    server 192.168.10.12:80; 
} 

(4)url_hash:按访问的 URL 的哈希值分发请求,每个 URL 会指向后端固定的某个服务器,可以进一步提高后端缓存服务器的效率。需要安装 hash 软件包。

(5)fair:根据后端服务器的响应时间来分发请求,响应时间短的优先分发。需要安装 upstream_fair 模块。

5. 健康检查

  Nginx 支持两种健康检查模式:

(1)被动检查

  Nginx 在代理请求过程中会监测每个后端服务器对请求的响应状态。通过 upstream 模块中 max_fails,fail_timeout 来实现,是 Nginx 默认健康检查模式。

upstream backserver { 
    server 192.168.10.11:80 max_fails=2 fail_timeout=10s; 
    server 192.168.10.12:80 max_fails=2 fail_timeout=10s; 
} 

(2)主动检查

  Nginx 会按照设定的间隔时间主动检查后端服务器。如果后端服务器异常,就不会将请求转发到该服务器。需要安装 ngx_upstream_check_module 模块。

upstream backserver { 
    server 192.168.10.11:80; 
    server 192.168.10.12:80; 
    check interval=5000 rise=2 fall=2 timeout=3000 type=tcp;
    #check_http_send "HEAD / HTTP/1.0\r\n\r\n";
    #check_http_expect_alive http_2xx http_3xx; }
  • interval:向后端发送的健康检查包的间隔。单位毫秒。

  • rise:如果连续成功达到指定次数,服务器状态就被认为是up。

  • fall:如果连续失败达到指定次数,服务器状态就被认为是down。

  • timeout:后端健康检查请求的超时时间。

6. location

  location 用在虚拟服务器 server 部分,根据请求中的 uri 匹配相应的处理规则。定义 location 可以用前缀字符串,也可以用正则表达式。

location [ = | ~ | ~* | ^~ ] uri { ... }
  • =    精准匹配
  • ^~  普通字符匹配
  • ~    正则匹配,区分大小写
  • ~*   正则匹配,不区分大小写
  • /   通用匹配

匹配顺序

(1)精准匹配。如果命中,停止匹配;

(2)^~ 普通字符匹配。如果命中,停止正则匹配,但仍会普通字符匹配;

(3)正则匹配。根据配置文件中的顺序依次检查,如果命中,停止匹配;

(4)普通字符匹配(不带^~ )。继续正则匹配,如果正则命中,停止匹配。没有命中,遵循最长前缀匹配原则。

alias指令和root指令

  Nginx 指定服务器静态资源文件有两种方式,alias 和 root。

  alias 指令定义路径别名,root 指令定义上层路径。alias 只能位于 location 块中,alias 定义的路径必须以 / 结尾。

location /test/ { 
    alias  /www/root/html/;  #请求/test/1.jpg,返回/www/root/html/1.jpg
}

location /test/ {
    root /www/root/html/;  #请求/test/1.jpg,返回/www/root/html/test/1.jpg
}

index指令

  在前后端分离的基础上,通过 Nginx 配置,指定网站主页。通常与 root 指令同时使用。

  • index 指令后面可以跟多个文件,用空格隔开。

  • 如果有多个文件,Nginx 会根据文件的枚举顺序来查找。

  • 文件可以是相对路径,也可以是绝对路径,绝对路径需要放在最后。

  • 指令默认值,index index.html。

index  index.$geo.html  index.0.html  /index.html;

proxy_set_header指令

  Nginx 允许重新定义或者添加发往后端服务器的请求头。value可以包含文本、变量或者它们的组合。语法格式:

proxy_set_header field value;

  默认情况下,只有两个 field 可以被重新定义。

proxy_set_header Host $proxy_host;
proxy_set_header Connection close;

(1)proxy_set_header  Host  $host

  HTTP请求头 Host 字段的值,如果该字段未设置,则为代理服务器的域名。用来获取客户端要访问的域名。

(2)proxy_set_header  X-Real-IP  $remote_addr

  获取客户端IP地址或上一层代理服务器IP地址。

(3)proxy_set_header  X-Forwarded-For  $proxy_add_x_forwarded_for

  获取客户端IP地址和各层代理服务器IP地址,逗号分隔。

7. 七层负载均衡

  七层负载均衡,也称"内容交换",代理服务器和客户端建立TCP连接,接收客户端的请求。然后再根据请求报文中的URL等应用层内容,代理服务器和后端服务器建立TCP连接,将请求转发到后端服务器。

8. 为什么要做动静分离?

  Nginx 作为 web 服务器时,静态请求处理能力很强,但是动态请求处理能力不足。为了提高网站的响应速度,减轻服务器的压力,对于 jpg、png、js 等静态资源,我们可以在 Nginx 中进行缓存。当浏览器请求一个静态资源时,Nginx 就可以直接处理。用户请求 jsp 等动态资源时,Nginx 将请求转发给应用服务器来处理。

动静分离的 Nginx 配置:

upstream tomcat_server{ 
    server 192.168.10.20:8080; 
}
 
server {
    listen  80;
    server_name  localhost;

    location / {
        root   html;
        index  index.html index.htm;
    }

    location ~ \.jsp$ { 
        proxy_pass  http://tomcat_server; 
    } 

    location ~ \.(gif|jpg|jpeg|png|bmp|swf|css)$ { 
        root /static/ 
    }
}  

9. 日志打印响应时间

log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                  '$status $body_bytes_sent "$http_referer" '
                  '"$http_user_agent" "$http_x_forwarded_for" "$request_time" "$upstream_response_time" ';
access_log  logs/access.log  main;
  • $request_time:指接受客户端请求到响应给客户端的时间。

  • $upstream_response_time:Nginx 与后端服务器建立连接到接收完响应数据并关闭连接的时间。

10. 防盗链

  盗链是指跨站访问其他网站的资源,骗取用户的浏览和点击率。盗链会大量消耗被盗链网站的带宽,严重损害了被盗链网站的利益。浏览器向 web 服务器发送请求的时候,一般会在HTTP请求头中带上 Referer 信息,告诉服务器请求网页的来源。防盗链的原理就是根据 referer 属性实现访问控制。

location ~* \.(gif|jpg|png|jpeg)$ {
    valid_referers none blocked *.test.com;
    if ($invalid_referer) {
        return 403;
    }
}

 

posted @ 2019-10-29 09:48  PIPO2  阅读(175)  评论(0编辑  收藏  举报