My-Note-Blog icon indicating copy to clipboard operation
My-Note-Blog copied to clipboard

Nginx学习(第二部分)

Open huangchucai opened this issue 7 years ago • 0 comments

nginx学习

4 Nginx的中间键架构

4.1 http请求
// 1. curl 就相当于window下面的浏览器,打开网页,但是由于Linux没有可视化界面,所以看不到
# curl www.baidu.com
// 2. 查看具体的请求体和请求头, 响应体
# curl -v www.baidu.com
// curl -v www.baidu.com > /dev/null 把请求放入一个类似临时文件中,方便查看
4.2 Nginx的日志类型
  1. error.log : 记录nginx处理http请求的错误状态以及nginx本身服务运行的错误状态(比较简单)

    //  1. 进入 /etc/nginx 下面的nginx.conf
    //  2. /var/log/nginx/error.log warn  日志的目录
    error_log  /var/log/nginx/error.log warn;
    # tail -f /var/log/nginx/error.log warn  // 循环查看日志的内容
    
  2. access.log :每一次http请求的访问状态,用于分析每一次请求和用户的行为

    // main是格式  log_format和acces_log对应 
    http {
        log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                          '$status $body_bytes_sent "$http_referer" '
                          '"$http_user_agent" "$http_x_forwarded_for"';
    
        access_log  /var/log/nginx/access.log  main;
    }
    // 字段意义 (-)
    $remote_addr  客户端地址
    $remote_user  http客户端请求nginx的log_format日志的用户名(没有开启认证模块是不会记录的)
    $time_local   nginx的时间
    $request  request头的请求行
    $status reponse返回的状态
    $body_bytes_sent  从服务端返回给客户端body信息的大小
    $http_referer   上一级页面的url地址
    $http_user_agent  客户端的类型
    $http_x_forwarded_for  协议标准的头,记录每一级http请求所携带的信息  
    

    3 log_ format(只能配置到大的http范围内)

    作用: 实现日志的分析

    类型:

 Syntax: log_format name [escape=default|json] string ...;
 Default: log_format combined "...";
 Context: http
4.3 Nginx 变量
  1. HTTP请求变量: arg_PARAMETER、http_HEADER(http头信息)、sent_http_HEADER
  2. 内置变量: Nginx内置的
  3. 自定义变量: 自己定义
4.4 Nginx 模块讲解

Nginx官方模块

 1. nginx -V  (查看安装编译参数, 里面就包裹了Nginx的官方模块)
 2. --with后面基本就是官方模块
编译选项 作用
--with-http_stub_status_module Nginx的客户端状态,监控Nginx的状态信息
--with-http_random_index_module 目录中选择一个随机主页
--with-http_sub_module HTTP内容替换
  • 官方模块语法

    1. http_stub_status_module的配置:

      Syntax:   stub_status  
      Default: --(默认没有配置)
      Context: (server/location下才可以)
      
      
    2. http_random_index_module的配置 (随机展示首页,不会展示隐藏文件)

      Syntax: random_index on|off;
      Default: random_index off;
      Context: location
      
    3. http_sub_module的配置

      // 替换指定的字符串
      Syntax: sub_filter string replacement;
      Default: --
      Context: http server location;
      // 缓存
      Syntax: sub_filter_last_modified on|off;
      Default: sub_filter_last_modified off;
      Context: http server location;
      // 默认替换第一个匹配的值
      Syntax: sub_filter_once on|off;
      Default: sub_filter_once on;
      Context: http server location;
      

  • 使用说明:

    1. http_stub_status_module
    1. 由于http_stub_status_module模块只能在server/location中,默认也是没有配置的,所以我们修改nginx的默认配置
    2. cd /etc/nginx/conf.d 
    3. vim default.conf
    4. 添加location 
    location /mytest {
    	stub_status;
    }
    5.浏览器访问地址  http://www.huangchucaivip.cn/mytest
    	Active connections: 2 
    	server accepts handled requests
     	902 902 638(总的请求数) 	
    	Reading: 0 Writing: 1 Waiting: 1 (keep-alive的时候)
    
    1. http_random_index_module
    1. cd /etc/nginx/conf.d 
    2. vim default.conf
    3. 修改location,随机展示/opt/app/code下面的文件
        location / {
            root   /opt/app/code;
            # index  index.html index.htm;
            random_index on;
        }
    
    1. http_sub_module
    location / {
        root   /opt/app/code;
        index  index.html index.htm;
        sub_filter 'hcc' 'HCC'; // 替换hcc 成 HCC
        sub_filter_once off;	// 全部替换		
    }
    
4.5Nginx的请求限制
  1. 连接频率限制 - limit_conn_module
 Syntax:  limit_conn_zone key zone=name:size
 Default: --
 Context: http
 
 Syntax: limit_conn zone number;
 Default: --
 Context: http, server, location
  1. 请求频率限制 - limit_req_module

我们知道http协议是基于TCP协议下的传输,一次TCP请求至少可以产生一次HTTP请求,http2.0的多路复用和http1.1的顺序性TCP复用,都是一个TCP请求连接多个HTTP请求。

所以对于请求的限制会大于对于连接的限制,因为一个连接可以发送多个HTTP请求

 Syntax:  limit_req_zone key zone=name:size rate=rate
 Default: -- 
 Context: http
 
 Syntax: limit_req zone=name [burst=number] [nodelay];
 Default: --
 Context: http, server, location
工具
  1. ab: 基于Apache的一个压力测试工具

    $ ab -n 50 -c 20 http://www.huangchucaivip.cn/1.html
    总共发送50次,同时并发20次 
    
使用
 
 limit_conn_zone $binary_remote_addr zone=conn_zone:1m;
 limit_req_zone $binary_remote_addr zone=req_zone:1m rate=1r/s;
 server {
     listen       80;
     server_name  localhost;
 
     #charset utf-8;
     #access_log  /var/log/nginx/host.access.log  main;
     location / {
         root   /opt/app/code;
         index  index.html index.htm;
         // 服务端同一时刻只允许一个ip访问
         #limit_conn conn_zone 1;  
         // 三个限速返回,其他直接返回503,相比于limit_req zone=req_zone会少3个错误日志
         #limit_req zone=req.zone burst=3 nodelay;  
         // 三个限速返回
         #limit_req zone=req.zone burst=3;
         limit_req zone=req_zone;
     }
     ...
 }
4.6 Nginx的访问控制
  1. 基于IP的访问控制 - http_access_module

    // 允许
    Syntax: allow address | CIDR | unix: |all;
    Default: --
    Context: http, server, location, limit_except
    
    // 拒绝
    Syntax: deny address | CIDR | unix: |all;
    Default: --
    Context: http, server, location, limit_except
    
    // 使用
    location ~ ^/admin.html {
    	root  /opt/app/code;
    	index index.html index.htm;
    	allow 10.100.146.33;
        deny all;
    } 
    

    局限性: http_access_module中间键只会记录最后访问的ip地址,如果我们使用转发的话,就不能限制住原始的ip地址了。

  2. 基于用户的信任登录 - http_auth_basic_module

    // 账号和密码
    Syntax: auth_basic string | off;
    Default: auth_basic off; (默认关闭)
    Context: http, server, location, limit_except
    
    // 文件(存放账号和密码,密码需要加密: htpasswd)
    Syntax:	auth_basic_user_file file;
    Default:	—
    Context:	http, server, location, limit_except
    // 使用 (www.huangchucaivip.cn/admin.html)1. 安装密码加密的软件2. htpasswd -c ./auth_conf hcc3. 修改文件location ~ ^/admin.html {	root  /opt/app/code;	auth_basic "Auth access test! input you password!";	auth_basic_user_file /etc/nginx/auth_conf;  (密码存放目录)	index index.html index.htm;}
    
  3. http_x_forwarded_for: 它是一个http的请求的一个字段,会不断的带着请求经过的ip地址。这样我们就可以得到所有的访问ip地址(但是不是所有的请求都统一)

4.7 静态资源WEB服务
  1. 静态资源类型: 非服务器动态运行生成的文件
类型 种类
浏览器端类型 HTML、CSS、JS
图片 JPEG、GIF、PNG
视频 FLV、MPEG
文件 TXT、等任意下载文件
  1. 静态资源服务场景-CDN(就近原则)

image

  1. 静态资源web服务的核心模块和语法

    • 文件读取

      Syntax: sendfile on | off;
      Default: sendfile off;
      Context: http, server, location, if in location
      
      --with-file-aio  异步文件读取(还是不流行)
      
    • tcp_nopush: 把多个包做成一个组合,一次性发送给客户端

      Syntax: tcp_nopush on | off;
      Default: tcp_nopush off;
      Context: http, server, location;
      

      作用: sendfile开启的情况下,提高网络包的传输效率

    • Tcp_nodelay: 数据包及时发送给客户端,不要等待

      Syntax: tcp_nodelay on | off;
      Default: tcp_nodelay off;
      Context: http, server, location;
      

      作用:keepalive连接下,提高网络包的传输实时性

    • 压缩: 压缩传输

      // 压缩
      Syntax: gzip on|off
      Default: gzip off;
      Context: http, server, location, if in location
      // 压缩比例
      Syntax: gzip_comp_level level;
      Default: gzip_comp_level 1;
      Context: http server location;
      // 服务版本
      Syntax: gzip_http_version 1.0|1.1
      Default: gzip_http_version 1.1;
      Context: http, server, location;
      // 对应的模块
      1. http_gzip_static_module  预读gzip功能(优先返回gzip压缩的内容)
      

      服务器压缩,浏览器解压,减少中间网络传输的网络消耗。

    • 服务器缓存 expires

      // 添加Cache-Control、Expires头
      Syntax: expires[modified] time;
      Default: expires off;
      Context: http, server, location, if in location
      
    • 跨域访问

      Syntax: add_header name value [always];
      Default: --;
      Context: http, server, location, if in location 
      Access-Control-Allow-Origin
      
    • 防盗链($http_referer)

      我们都知道http的请求头中会携带Referer参数,来说明页面的来源

      Syntax: valid_referers none | blocked | server_names | string ...;
      Default: --;
      Context: server, location
      // 说明
      1. none: “Referer” 来源头部为空的情况
      2. blocked: 不以http或https开头的字段
      3. 具体的ip
      // 使用 
      valid_referers none blocked 119.29.161.100;
      # 注意没有s  referer 注意要有空格;
      	if ($invalid_referer) {
              return 403;
          }
      
4.8 代理服务
 Syntax: proxy_pass URL;
 Default: --;
 Context: location, if in location
 
 // url的格式
 1. http://location:8000/uri/ (http协议)
 2. https://192.168.1.1:8000/url/ (https协议)
 3. http://unix:/tmp/backend.socket:/uri/;
 
 // 主要的使用
 location / {
     proxy_pass http://127.0.0.1:8080;
     proxy_redirect default;
     proxy_set_header Host $http_host;   // 额外的添加请求头
     proxy_set_header X-Real-IP $remote_addr;
     proxy_connent_timeout 30;
     proxy_send_timeout 60;
     proxy_read_timeout 60;
     proxy_buffer_size 32k;
     proxy_buffering on;
     proxy_buffers 4 128k;
     proxy_busy_buffers_size 256k;
     proxy_max_temp_file_size 256k;
 }
  1. 正向代理:往往不知道真实的客户端的地址,需要客户端做相应的改动,例如我们翻墙的时候设置的浏览器的插件(switchyOmega)

    • 图解

image

  • 例子

    # 正向代理
    
    # A不是116.62.103.228服务器 jeson.t.imooc
    
    1./opt/app/code  下面有一个jesonc.html  (<h1>Jeson</h1>)
    
    2./ect/nginx/cof.d  下面的admin.conf  
    
      location / {
    
         // 不等于116.62.103.228就返回403
    
         if ( $http_x_forwarded_for !~* “^116\.62\.103\.228”) {
    
    	  return 403
    
    	}
    
         root /opt/app/code;
    
         Index index.html index.htm
    
      }
    
    # B登录228服务器配置正向代理
    1./etc/nginx/con.d/zx.proxy.conf 
    
    server {
    
    	listen  80;
    
    	resolver 8.8.8.8(谷歌的DNS解析)
    
    	location / {
    
    		proxy_pass  http://$http_host$request_uri;
    
    	}
    
    }
    
    www.huangchucai.cn/test.html 
    
    $http_host:  主机名   www.huangchucai.cn
    
    $request_uri: 参数  test.html
    
    2.正向代理
    浏览器设置代理(switchysharp  116.62.103.228:80)  => 浏览器输入 jeson.t.imooc/jesonc.html =>  代理就会走116.62.103.228:80  => 228服务器然后走jeson.t.imooc/jesonc.html  => jeson.t.imooc可以让228服务器通过 => 返回结果
    
    
  1. 反向代理

    • 图解

image

  • 例子

    # 反向代理
    
    docker容器只提供了80端口对外访问,通过反向代理,利用80端口来访问其他端口。
    服务器开启了8080(jeson.t.imooc.io)端口,有一个页面welcome to jeson.t.imooc.io  (不对外) realserver.conf 
       	location / {
    
    		root /opt/app/code2;
    
    		index index.html index.htm
    
      	}
      	/opt/app/code2 下面有一个test_proxy.html
    
    3. 服务器开启80端口,对外开放  fx.proxy.conf
    
    	location ~ /test_proxy.html$ {
    
    	proxy_pass http://127.0.0.1:8080
    
    	}
    
    4.反向代理
    
    客户端请求服务器80端口 => 服务器80端口通过proxy_pass 去请求服务器的8080端口 => 返回给客户端 
    
    
  1. 正向代理和反向代理的区别

    区别在于对象的不一样

    正向代理代理的对象是客户端,往往服务器不知道真真的客户端(例如:翻墙)

    反向代理代理的对象是服务端,客户端以为自己发送给了真实的服务器,但是服务器内部进行了转换,例如反向代理

4.9 负载均衡调度器SLB
  1. 利用pass_proxy 和 upstream

    // 1. upstream写在server的外面  
    upstream hcc {
      server 119.29.161.100   weight=5;
      server 119.29.161.100:8080;
    }
    server {
      listen 8001;
      server_name  localhost;
      location / {
        #root /Users/huangchucai/Desktop/code;
        index index.html index.htm;
        proxy_pass http://hcc;
      }
    }
    
  2. 配置规则

    down 当前server暂时不参与负载均衡
    backup 预备的备份服务器
    max_fails 允许请求失败的次数
    fail_timeout 经过max_fails失败后,服务暂停的时间
    max_conns 限制最大的接收的连接数
  3. 调度算法

    轮询 按时间顺序逐一分配到不同的后端服务器
    加权轮询 weight值越大,分配到访问几率越高
    ip_hash 每个请求访问按IP的hash结果分配,这样来自同一个IP的固定访问一个后端服务器(有弊端,如果客户端有代理的话,记录的是代理服务器的ip,无法定位到用户真正的ip, 始终定位到的是代理的ip)
    least_conn 最少链接数,那个机器连接数少就分发
    url_hash 按照访问的URL的hash结果来分配请求,是每个URL定向到同一个后端服务器
    hash关键数值 hash自定义的key
    # ip_hash
    upstream hcc {
      ip_hash;
      server 119.29.161.100;
      server 119.29.161.100:8080;
    }
    ## url_hash和hash关键值是一个意思,一般在一起使用
    # url_hash (nginx 1.72)
    Syntax: hash key [consistent];
    Default: --;
    Context: upstream 
    upstream hcc {
      hash $request_uri;  // todo 只提取路径  /url?h&&! 
      server 119.29.161.100;
      server 119.29.161.100:8080;
    }
    
4.10 动态缓存
  1. proxy_cache_path

    参数 含义
    /opt/app/cache 存放目录
    levels=1:2 目录的分级(2层目录分级)
    keys_zone imooc_cache:10m 定义开辟的zone空间的名字,大小为10兆( proxy_cache)
    max_size 最大的大小
    inactive 在60分钟内,缓存文件没有被访问就删除
    use_temp_path 临时的存放文件(一般会删除)
  2. 具体配置

 upstream hcc {
   ip_hash;
   server 119.29.161.100;
   server 119.29.161.100:8080;
 }
 ## 最先配置
 proxy_cache_path  /opt/app/cache levels=1:2 keys_zone=imooc_cache:10m max_size=10g 
 inactive=60m use_temp_path=off;
 server {
     listen  80;
     server_name localhost jeson.t.imooc.io;
     access_log /var/log/nginx/test_proxy.access.log main;
     location / {
         proxy_cache imooc_cache; // cache 空间  proxy_cache off;关闭缓存
         proxy_pass http://imooc; // 代理的模式
         proxy_cache_valid 200 304 12h; // 对于请求的为200和304的缓存 12小时过期
         proxy_cache_valid any 10m; // 对于除了200,304的缓存10分钟
         proxy_cache_key $host$uri$is_args$args; //重写cache的key
         add_header Nginx-Cache "$upstream_cache_status"; // 增加头信息
         proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504; // 如果upstream中的server的有一台返回的是500的错误代码,就跳过这台服务器,走下一台服务器
         include proxy_params;
     }
 }
  1. 让部分页面不缓存
 # proxy_no_cache
 Syntax:  proxy_no_cache string ...;
 Default: --;
 Context http, server, location;
 
 server {
     listen  80;
     server_name localhost jeson.t.imooc.io;
     access_log /var/log/nginx/test_proxy.access.log main;
     # 部分的请求不缓存
     if ($request_uri ~ ^/(url3|login|register|password\/reset)) {
     	set $cookie_nocache 1;    
     }
     location / {
         proxy_cache imooc_cache; // cache 空间  proxy_cache off;关闭缓存
         proxy_pass http://imooc; // 代理的模式
         proxy_cache_valid 200 304 12h; // 对于请求的为200和304的缓存 12小时过期
         proxy_cache_valid any 10m; // 对于除了200,304的缓存10分钟
         proxy_cache_key $host$uri$is_args$args; //重写cache的key
         add_header Nginx-Cache "$upstream_cache_status"; // 增加头信息
         proxy_no_cache $cookie_nocache $arg_nocache $arg_comment;
         proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
         include proxy_params;
     }
 }
  1. 大文件分片请求
 # http_slice_module
 Syntax: slice size;
 Default: slice 0;
 Context: http, server, location;

基于中间件的深度学习

1. 动静分离

  • 作用:分离资源,减少不必要的请求消耗,减少请求延时。

    image-20180826120452024

    upstream nodeServer {
    server  127.0.0.1:1234;  // 服务器开启一个1234的服务
    }
    server {
      listen       80;
      server_name  119.29.161.100 hcc.nginx.com;
      sendfile on;
      charset utf-8;
      access_log  /var/log/nginx/host.access.log  main;
      root /opt/app/code; // 资源根目录
      location ~ \.jsp$ { // 假如这是一个动态资源
    	proxy_pass http://nodeServer;
    	index index.html index.htm;
      }
      location ~  \.(jpg|png|gif)$ {  // 静态资源
    	expires 1h;
    	gzip on;
      }
      location / {
    	index index.html index.htm;
      }
    }
    

2. Rewrite规则

**rewrite:**实现url重写以及重定向

  • 场景

    1. URL访问跳转,支持开发设计(页面跳转,兼容性支持,展示效果等)
    2. SEO优化
    3. 维护 (后台维护,流量转发等)
    4. 安全(将真实的网站进行伪装)
  • 配置语法

    Syntax: rewrite regex replacement [flag];
    Default: --;
    Context: server, location, if;
    
    //eg: rewrite ^(.*)$ /pages/maintain.html break
    
  • rewrite规则的优先级

    1. 执行server块的rewrite指令
    2. 执行location匹配
    3. 执行选中的location中的rewrite
  • rewrite的规则书写

  • flag的配置

    类型 含义
    last 停止rewrite检测(会模拟下一个请求,返回对应的数据)
    break 停止rewrite检测 (不会模拟下一个请求)
    redirect 返回302临时重定向,地址栏会显示跳转后的地址,浏览器每次都会请求服务器,返回服务器返回重定向的地址,关掉服务器后,不会有响应。
    permanent 返回301永久重定向,地址栏会显示跳转后的地址,关掉服务器后,浏览器会根据缓存实现重定向

    last和break的区别:

    server {
        listen       80;
        server_name  119.29.161.100 hcc.nginx.com;
        sendfile on;
        charset utf-8;
        error_log /var/log/nginx/host.error.log;
        access_log  /var/log/nginx/host.access.log  main;
        root /opt/app/code;
        location ~ ^/break {
        	rewrite ^/break /test/ break;
        }
        location ~  ^/last {
    		#rewrite ^/last /test/ last;
       		rewrite ^/last /test/ redirect;
        }
        location /test/ {
       		default_type application/json;
    		return 200 '{"status": "success"}';
        }
    }
    
    1. 直接请求www.huangchucaivip.cn/test/ 会返回200 ,{status: "success"}
    2. **Break:**当location 以break开头的时候,会被rewrite到 www.huangchucaivip.cn/test/ 去寻找/opt/app/code/test 文件下面的index.html文件,如果没有找到就返回403,不会走下面的其他location
    3. Last: 当匹配到以last开头的时候,就会被rewrite到www.huangchucaivip.cn/test/ , 发现下面有一个location 的路径匹配到了,就会直接的定位到,不会去寻找/opt/app/code/test 文件下面的index.html文件。如果没有下面的一个location /test/ ,就会去寻找/opt/app/code/test 文件下面的index.html文件

Nginx高级模块

1. secure_link_module模块

含义:

  • 制定并允许检查请求的链接的真实性以及保护资源免遭未经授权的访问
  • 限制链接生效周期(例如你通过wget请求下载资源的话,过一段时间失效了)

配置语法:

Syntax: secure_link expression;
Default: --
Context: http, server, location

Syntax: secure_link_md5 expression;
Default: --;
Context: http, server, location

//解析文档:  https://blog.csdn.net/qq_34853874/article/details/76461868

验证的机制图示:

image

演示:

server {
    location 80;
    server_name localhost;
    #charset koi8-r;
    #access_log /var/log/nginx/log/host.access.log main;
    root /opt/app/code;
    location  / {
        secure_link $arg_md5,$arg_expires;
        secure_link_md5 "$secure_link_expires$uri hcc";
        
        if ($secure_link == "") {
        	return 403;
        }
        if ($secure_link = "0") {
        	return 401
        }
    }
	#error_page  404  /404.html;
}
// openssl  /opt/work/

2. Geoip_module模块

含义:

  • 基于IP地址匹配MaxMind GeoIP 二进制文件,读取IP所在的地域信息。
  • 场景
    • 区别国内外作HTTP访问规则
    • 区别国内城市地域作HTTP访问规则

3. HTTPS

协议原理:对传输内容进行加密和身份验证

  1. 发起SSH连接(非对称加密,对性能要求大)

检查配置项:

  1. openssl version
  2. nginx -V --with-http_ssl_module

生成密钥和CA证书:

  1. 生成key密钥

    openssl genrsa -idea -out jesonc.key 1024

  2. 生成证书签名请求文件(csr文件)

    openssl req -new -key jesonc.key -out jesonc.ssr

  3. 生成证书签名文件(根据key和csr生成CA文件)

    openssl x509 -req -days 3650 -in jesonc.ssr -signkey jesonc.key -out jesonc.crt

配置:

// 是否开启ssl连接请求
Syntax: ssl on|off;
Default: ssl off;
Context: http,server 
// ssl的证书文件
Syntax: ssl_certificate file;
Default: --;
Context: http, server;
// ssl的证书的密码文件
Syntax: ssl_certificate_key file;
Default: --;
Context: http, server

server {
    listen       443;
    server_name huangchucaivip.cn;
    ssl on;
    ssl_certificate /etc/nginx/ssl_key/jesonc.crt;
    ssl_certificate_key /etc/nginx/ssl_key/jesonc.key;
    #sendfile on;
    #charset utf-8;
    #error_log /var/log/nginx/host.error.log;
    #access_log  /var/log/nginx/host.access.log  main;

    location / {
       	root  /opt/app/code;
        index  index.html index.htm;
    }
    #error_page  404  /404.html;
}
// 去掉保护码
openssl rsa -in ./jesonc.key -out ./jesonc_nopass.key

生成免密码的符合苹果要求的crt

  1. 生成对应的key

  2. 根据key直接生成对应的crt

    openssl req -days 36500 -x509 -sha256 -nodes -newkey rsa:2048 -keyout

    jesonc.key -out jesonc_apple.crt

HTTPS的服务优化

  1. 激活keepalive长连接
  2. 设置ssl session缓存
keepalive_timeout  100;
ssl_session_cache  shared:SSL:10m;   // 10兆
ssl_session_timeout 10m;  // 10分钟

4. Nginx与Lua开发

4.1 Lua

  • 概念: 是一个简洁、轻量、可扩展的脚本语言

  • 优点: 充分的结合Nginx的并发处理epoll优势和Lua的轻量实现简单的功能且高并发的场景

  • 安装: yum install lua (centos7.0 只带lua)

  • 交互

    1. > lua 
    2. 脚本运行  
    

4.2 Lua和Nginx调用

  • Nginx+Lua环境编写

    1. LuaJIT
    2. ngx_devel_kit和lua-nginx-module
    3. 重新编译Nginx
  • Nginx调用lua模块指令

    Nginx的可插拔模块化加载执行,共11个处理阶段

    语法 作用
    set_by_lua
    set_by_lua_file
    设置nginx变量,可以实现复杂的赋值逻辑
    access_by_lua
    access_by_lua_file
    请求访问阶段处理,用于访问控制
    content_by_lua
    content_by_lua_file
    内容处理器,接收请求处理并输出响应
  • Nginx Lua API

    Lua调用nginx的api接口

    语法 作用
    ngx.var nginx变量
    ngx.req.get_headers 获取请求头
    ngx.req.get_uri_args 获取url请求参数
    ngx.redirect 重定向
    ngx.print 输出响应内容体
    ngx.say 同ngx.print,但是会最后输出一个换行符
    ngx.header 输出响应头
    ....

4.3 实战场景 - 灰度发布

  1. 含义: 按照一定的关系区别,分部分的代码进行上线,使代码的发布能平滑过渡上线。
  2. 根据什么区分:
    • 用户的信息cookie等信息区别
    • 根据用户的IP地址

5. Nginx的架构

5.1 Nginx中的主要问题

  1. 相同server_name多个虚拟主机优先级访问

    答案: 对于相同的server_name的多个虚拟主机,nginx会首先读取它最先读取到的配置文件,来展示给客户端

    ## conf.d 文件夹下的conf
    test_server1.conf test_server2.conf  test_server3.conf // 展示test_server1.conf的内容
    
  2. location匹配优先级(一个server中有多个location)

    符号 用法
    = 进行普通字符精确匹配,也就是完全匹配
    ^~ 表示普通字符匹配,使用前缀匹配
    ~ ~* 表示执行一个正则匹配(~ 区分大小写 ~*不区分大小写)
    // 会优先使用code1 > code2 > code3
    server {
        listen       80;
        root /opt/app;
        // 完全匹配
        location = /code1/ {
            rewrite ^(.*)$ /code/index.html break;
        }
        // 正则匹配
        location ~ /code.* {
            rewrite ^(.*)$ /code3/index.html break;
        }
    	// 前缀匹配
        location ^~ /code {
            rewrite ^(.*)$ /code2/index.html break;
        }
    }
    
  3. Nginx的try_files使用

    用法:按顺序检查文件是否存在

       //当访问的uri不在/opt/app/code/cache中的时候,就内部重定向到9090端口
        location / {
            root /opt/app/code/cache;
            try_files $uri @java_page;
        }
    
        location @java_page{
            proxy_pass http://127.0.0.1:9090;
        }
    
  4. Nginx的alias和root区别

    // 配置文件
    location /request_path/image {
        root /local_path/image/;
    }
    location /request_path/image {
        alias /local_path/image/;
    }
    
    // 用户输入
    www.huangchucai.top/request_path/image/cat.png
    
    // root定位到服务器位置
    /local_path/image/request_path/image/cat.png
    // alias定位到服务器的位置
    /local_path/image/cat.png
    
  5. 用什么方法传递用户的真实IP

    答案: 协商在第一级代理中,设置一个请求头 set x_real_ip=$remote_addr,来相互传递。

  6. 其他

    • Nginx常见的错误码

      code 含义 解决方法
      413 Request Entity Too Large (用户上传的资料过大) 修改限制用户上传文件的字段(client_max_body_size)
      502 Bad gateway(后端的网关错误) 后端服务无响应
      504 Geteway time-out(后端服务执行超时)

5.2 Nginx性能优化

  1. 性能优化考虑点

    • 当前系统结构瓶颈(观察指标、压力测试)
    • 了解业务模式(接口的业务模型、系统层次化结构)
    • 性能和安全
  2. 压测工具ab

    • 安装 yum install httpd-tools(这个包带了ab工具)

    • 使用

      ab -n 2000 -c 2 http://127.0.0.1/
      -n 总请求数
      -c 并发数
      -k 是否开启长链接
      
  3. 系统与Nginx性能优化

    1. 具体优化点
    • 网路
    • 系统(硬件)
    • Nginx服务本身(连接优化,资源的优化)
    • 后端程序
    • 数据库、底层服务(分布式储存)
    1. 具体实现
      • 概念
        • 文件句柄: linux/Unix一切皆文件,文件句柄就是一个索引
        • 设置方式:系统全局性修改,用户局部性修改,进程局部性修改

5.3Nginx架构的安全

  1. 常见的恶意行为

    • 行为:爬虫行为和恶意抓取、资源盗用

      解决:

      1. 基础的防盗链功能($http_referer)
      2. secure_link_module:对数据完全性提高加密验证和失效性,适合核心重要的数据
      3. access_module:对后台、部分用户服务的数据提供IP防控
  2. 常见的应用层攻击手段

    • 后台密码撞库

    • 文件上传漏洞

      location ^~ /upload {
          root /opt/app/images;
          if($request_filename ~* (.*)\.php) {
              return 403;
          }
      }
      
    • SQL注入

  3. Nginx防攻击策略

  4. Nginx+lua的安全waf防火墙

5.4 Nginx在服务器中的角色

  1. 静态资源服务
    • 类型分类
    • 浏览器缓存(是否缓存,缓存周期)
    • 防盗链
    • 流量限制
    • 防资源盗用
    • 压缩
  2. 代理服务
  3. 动静分离

huangchucai avatar Sep 19 '18 12:09 huangchucai