• Nginx自学笔记


    Nginx相关

    标签(空格分隔): nginx 享学


    安装部署

    • 通过源代码的方式安装
    • 使用
      • ./sbin/nginx #启动
      • ./sbin/nginx -t #检查是否有错
      • ./sbin/nginx -s reload #重新加载

    具体的使用

    location 匹配规则

    1. = 全匹配
    2. ^~ 前缀匹配
    3. ~ 正则匹配
    4. ~* 正则不区分大小写匹配
    5. 空格前缀匹配。这种匹配和^~匹配方式一样,但是它是在正则之后匹配
    location /taobao {
        rewirte ^(.*) http://www.baidu.com #重定向
    }
    location / {
        root html;
        index index.html index.htm;
    }
    

    虚拟主机

    我理解的虚拟主机就和IIS的虚拟主机差不多,可以让nginx监听多个端口。同时也可以配置通过不同的server_name过来的数据能够独立处理

    虚拟主机可以单独配置到不同的文件中。然后在nginx.conf里面引用
    一般配置路径是:/etc/nginx/con.d
    引用:include /etc/nginx/con.d/*.conf

    alias的使用(配合root学习)

    root与alias主要区别在于nginx如何解释location后面的uri,这会使两者分别以不同的方式将请求映射到服务器文件上。
    root的处理结果是:root路径+location路径
    alias的处理结果是:使用alias路径替换location路径
    alias是一个目录别名的定义,root则是最上层目录的定义。
    还有一个重要的区别是alias后面必须要用“/”结束,否则会找不到文件的。。。而root则可有可无~~

    注意:

    1. 使用alias时,目录名后面一定要加"/"。
    2. alias在使用正则匹配时,必须捕捉要匹配的内容并在指定的内容处使用。
    3. alias只能位于location块中。(root可以不放在location中)
    4. 都是对预置变量rootPath赋值

    参考文章[ http://www.nginx.cn/4658.html ]

    rewrite的使用

    rewrite regex replacement [flag]

    location / {
        rewrite ^/(.*) http://www.czlun.com/$1 permanent;
    }
    

    rewrite就是重定向的意思,从上面的示例可以看到有1个关键字和3个参数

    参数 说明
    regex 表示匹配url的正则表达式,不包含ip和端口那部分。
    replacement 表示跳转后的地址,$1表示正则匹配的第一个值,如果不需要参数,上面的正则可以写为^/
    flag 这个值总共有四个选项,如果为空,则类似于last,但是会将rewrite执行完
    • last #本条规则匹配完成后,继续向下匹配新的location URI规则
    • break #本条规则匹配完成即终止,不再匹配后面的任何规则, url不会变
    • redirect #返回302临时重定向,浏览器地址会显示跳转后的URL地址
    • permanent #返回301永久重定向,浏览器地址栏会显示跳转后的URL地址

    set命令

    就是赋值

    set $a 32;
    

    proxy_pass 反向代理

    反向代理就是将请求的地址代理到其它地址去,浏览器地址会发生变化。 [ https://blog.csdn.net/zhongzh86/article/details/70173174 ]

    location /proxy/ {
        proxy_pass http://127.0.0.1/;
    }
    
    • 关于代理地址后面的斜杠/

      • 没有斜杠表示相对路径,将全url追加到新代理的url
      • 有斜杠表示绝对路径,闭包,匹配成功的内容不追加到新url
    • 另外路径里面的/proxy/后面的斜杠也会影响匹配结果

    • 复杂的代理里面还可以通过正则获取url里面的内容并拼装为新的url进行代理

      location ~* /wap/(d+)/(.+)
      {
          proxy_pass http://mx$1.test.com:6601/$2?$args;
      }
      

    upstream 负载均衡

    1.在http节点下,加入upstream节点。

    upstream linuxidc { 
          server 10.0.6.108:7080; 
          server 10.0.0.85:8980; 
    }
    

    2.将server节点下的location节点中的proxy_pass配置为:http:// + upstream名称,即“http://linuxidc”.

    location / { 
        root  html; 
        index  index.html index.htm; 
        proxy_pass http://linuxidc; 
    }
    

    默认是轮询,每个ip访问一次。

    • 轮询
    • 权重 weight
    • ip_hash 可以解决session问题
    • fair 根据服务器响应时间动态分配
    • url_hash 根据url进行hash,同一个请求落到一台服务器

    3.注意

    • 如果存在不能轮询的情况,也有可能是浏览器缓存问题

    Nginx请求执行阶段

    http://wangjixiang.iteye.com/blog/2255553

    1. rewrite阶段
    2. access阶段
    3. content阶段
    4. 其他阶段
    location=/{
        set $a 32;
        echo $a;
        
        set $a 64;
        echo $a;
    }
    

    上面的代码将输出2个64。这里就涉及到Nginx的执行阶段问题了。

    index作用

    示例

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

    这里的index是根据url匹配,如果url的结尾不是/,那么就不会去匹配index,因为此时会被当作文件,因此不需要默认文件

    内置变量

    if语句

    https://www.cnblogs.com/songxingzhu/p/6382007.html

    1. if语句没有else

    -f, !-f:判断指定的路径是否为存在且为文件;
    -d, !-d:判断指定的路径是否为存在且为目录;
    -e, !-e:判断指定的路径是否存在,文件或目录均可;
    -x, !-x:判断指定路径的文件是否存在且可执行;

    跨域处理

    location / {
      // 没有配置OPTIONS的话,浏览器如果是自动识别协议(http or https),那么浏览器的自动OPTIONS请求会返回不能跨域
      if ($request_method = OPTIONS ) {
        add_header Access-Control-Allow-Origin "$http_origin";
        add_header Access-Control-Allow-Methods "POST, GET, PUT, OPTIONS, DELETE";
        add_header Access-Control-Max-Age "3600";
        add_header Access-Control-Allow-Headers "Origin, X-Requested-With, Content-Type, Accept, Authorization";
        add_header Access-Control-Allow-Credentials "true";
        add_header Content-Length 0;
        add_header Content-Type text/plain;
        return 200;
      }
      add_header 'Access-Control-Allow-Origin' '$http_origin';
      add_header 'Access-Control-Allow-Credentials' 'true';
      add_header 'Access-Control-Allow-Methods' 'GET, PUT, POST, DELETE, OPTIONS';
      add_header 'Access-Control-Allow-Headers' 'Content-Type,*';
      proxy_pass http://127.0.0.1:8080;
      
      }
    }
    

    防盗链

    location ~* .(gif|jpg|png|jpeg)$ {
        valid_referers *.baidu.com *.google.com;
        if ($invalid_referer) {
            return 404;
        }
    }
    

    防止客户端保存图片

    缓存

    location ^~ /qq.png{
        #expires 2s;#缓存2秒
        expires 2m;#缓存2分钟
    }
    

    压缩

    https配置

    首先把服务的定义代码贴出来

    server {
    	listen       443 ssl; #注意这里的端口和ssl
    	server_name  localhost;
    
    	ssl_certificate      server/server.crt;
    	ssl_certificate_key  server/server_nopass.key;
    
    	location / {
    		root   html;
    		index  index.html index.htm;
    	}
    }
    
    1. 通过./sbin/nginx -V查看是否安装https模块
      --with-http_ssl_module代表安装了的

    2. 执行四步生成ssl上面的server.crt和erver_nopass.key文件

      1.openssl genrsa -des3 -out server.key 1024
      提示输入密码,就输入123456。会再次确认密码
      2.openssl req -new -key server.key -out server.csr
      提示输入密码就输入:123456,输入国家:cn,输入省份:cq,其它的直接按回车
      3.openssl rsa -in server.key -out server_nopass.key
      提示输入密码就输入:123456
      4.openssl x509 -req -days 365 -in server.csr -signkey server_nopass.key -out server.crt

    3. 就按上面的服务配置就可以了

    keepalived高可用

    可以把keepalived和nginx当作独立的两个程序。keepalived主要是用来提供一个虚拟的ip地址,我们把这个ip称为vip。当主服务器挂了的时候,从服务器就自动暴露一个vip出来。

    1. 首先需要安装keepalived

    重点说明

    1. Peter老师提到的,根据url进行分割,然后通过location判断命中和未命中的path。根据最后的/去决定是否将命中的路径加进去。
      同时对于rootalias也适用这种方式。
    2. 高可用、高并发。死了还能用就是高可用
    3. keepalived也可以和tomcat实现高可用

    有时间研究一下:

    • 源码安装 nginx 的时候 配置上 --with-debug 可以看到 nginx执行的每一步,很好使,有小伙伴用的没
    • 阿里云带宽收费标准
    • 回顾那次公司使用的服务守护程序

    学到第三课了(09-18)

  • 相关阅读:
    Java面向对象
    Java方法
    Java控制语句
    Java接收用户键盘输入
    Java运算符
    Java类型转换
    Java的加载与执行
    Java关键字
    Java常见的DOS命令及JDK
    nginx学习要点记录
  • 原文地址:https://www.cnblogs.com/duanjt/p/9705131.html
Copyright © 2020-2023  润新知