美文网首页
Nginx(三)Nginx进阶

Nginx(三)Nginx进阶

作者: 7ColorLotus | 来源:发表于2020-06-09 22:56 被阅读0次
  • 内置变量
    $host:请求中的主机头(Host)字段,如果请求中的主机头不可用或者空,则为处理请求的server名称
    $http_HEADER: HTTP请求头中的内容,HEADER为http请求中的内容转为小写,-变为_。例如:$http_user_agent(User-Agent的值)
    $remote_addr: 客户端的IP地址
    $remote_port: 客户端的端口
    $request_method: 这个变量是客户端请求的动作,通常为GET或POST
    $request_uri: 这个变量等于包含一些客户端请求参数的原始URI
    $scheme: 所用的协议,比如http或者Https
    $server_name: 服务器名称
    $server_port: 请求到达服务器的端口号
    $server_protocol: 请求使用的协议,通常是HTTP/1.0或者HTTP/1.1
    $uri: 请求中的当前URI(不带请求参数,参数位于$args)
    $http_origin: 浏览器携带的origin头
  • if语句(没有else)

    1. 常用正则:
          =, !=   比较的一个变量和字符串
          ~, ~*   与正则表达式匹配的变量,如果这个正则表达式中包含
          -f, !-f   检查一个文件是否存在
          -d, !-d   检查一个目录是否存在
          -e, !-e   检查一个文件,目录,符号链接是否存在
          -x, !-x   检查一个文件是否可执行
    
    1. 示例
          静态资源:location ~ /rex/.*\.(html|js|css)$
          域名校验:if($http_origin ~ http:/ /(.*).enjoy.com)
          浏览器校验:if($http_user_agent ~ Firefox)
    
  • 浏览器的跨域问题

    1. 解决跨域的方式:
      1)JSONP
      2)domain+iframe
      3)Nginx配置

         if($http_origin ~ http://(.*).enjoy.com){
             set $allow_url $http_origin;
         }
         
         #是否允许请求带有验证信息
         add_header Access-Control-Allow-Credentials true;
         #允许跨域访问的域名,可以是一个域的列表,也可以是通配符*。最主要的点,其他可不配置
         add_header Access-Control-Allow-Origin $allow_url
         #允许脚本访问的返回头
         add_header Access-Control-Allow-Headers 'x-request-with,content-type,Cache-Control,Pragma,Date,x-time-stamp'
         #允许使用的请求方法,以逗号隔开
         add_header Access-Control-Allow-Methods 'POST,GET,OPTIONS,PUT,DELETE';
         #允许自动的头部,以逗号隔开,大小写不敏感
         add_header Access-Control-Expose-Headers 'www-Authenticate,Server-Authorization';
         #p3p支持跨域cookie操作
         add_header P3P 'policyref="/w3c/p3p.xml", CP="NOI DSP PSAa OUR BUS IND ONL UNI COM NAV INT LOC"';
      
  • 防盗链

    1. valid_referers: 匹配域名白名单,如果不匹配,把内置变量$invalid_referer设置为1
    2. 示例
          location ^~ /mall{
              valid_referers *.enjoy.com;
              if($invalid_referer){
                  return 404;
              }
              root html/gzip;
          }
    
  • 缓存与压缩

    1. 缓存 :expries liveTime
    2. 压缩
         location ~ /(.*)\.(html|js|css) {
             gzip on; #启用gzip压缩,默认不启用
             gzip_types application/javascript text/css image/jpeg image/png; #对哪些格式进行压缩
             gzip_min_length 1024; #所压缩文件的最小值,小于这个的不会压缩
             gzip_buffers 4 1k; #设置压缩响应的缓冲块的大小和个数,默认是内存一个页的大小
             gzip_comp_level 1; #压缩水平,默认1.取值范围1-9,取值越大压缩比率越大,但越耗CPU时间
             root html/gzip;
         }
    
  • https

    1. 生成证书(不能用于生产,生产一般都是通过购买)
        1)创建服务器私钥,命令会让你输入一个口令:
              openssl genrsa -des3 -out server.key 1024
        2)创建签名请求的证书(CSR)
              openssl req -new -key server.key -out server.csr
        3)在加载SSL支持的Nginx并使用上述私钥时出去必须的口令:
              openssl rsa -in server.key -out server_nopass.key
        4)最后标记证书上使用上述私钥和CSR:
              openssl x509 -req -days 365 -in server.csr -signkey server_nopass.key -out server.crt
    
    1. conf文件中
          ssl_certificate /etc/nginx/conf.d/server.crt;
          ssl_certificate_key /etc/nginx/conf.d/server_nopass.key;
    
    1. nginx -V 查看安装的Nginx环境,检查是否安装openssl
    2. 有https方式之后,对http请求重定向,使所有的请求都使用https
          rewrite ^/ https:/ /sales.enjoy.com redirect;
    
    1. 配置https后ajax请求普通http,会报错。解决办法是对请求的服务器配置https
  • nginx的高可用--keepalived

    1. LVS思想--虚拟网关
    2. keepalived的思路,由2台服务器软件虚拟出来一台虚拟网关vip,此vip由两台机器共同协商生产,当有一台宕机时,另一台机器一样能维持vip,这保证了,只要两台机器不同时宕机,vip就一直存在
    3. keepalived的安装,使用以及应用到nginx的集群步骤如下:
          1)centos6的keepalived下载地址:https://pan.baidu.com/s/1G7sLL-YKZGSMu8G76yz1Rw 密码:adbw
          2)安装步骤
              1>./configure --prefix=/data/program/keepalived --sysconf=/etc ## 因为keepalive启动时候会默认读取/etc/keepalived/keepalived.conf 
              2>make && make install
          3)修改/etc/keepalived/keepalived.conf配置文件信息
          4)启动keepalived 
              /data/program/keepalived/sbin/keepalived
          5)keepalived主从故障测试
              启停主从keepalived,查看对应的vip=192.168.244.200
          6)加nginx监控脚本
              停止nginx,观察keepalived自动拉起nginx服务
          7)查看keepalived日志: tail -f /var/log/messages
          8)配置:
              global_defs{    #全局配置
                  router_id nginx_backup #表示运行keepalived服务器的一个标识,唯一的
              }
              vrrp_script chk_http_port{
                  script "/usr/local/src/chk_nginx_pid.sh" #心跳执行的脚本
                  interval 2  #检测脚本执行的间隔,单位是秒
                  weight 2
              }
              vrrp_instance VI_1{ #vrrp实例定义部分
                  state BACKUP    #指定keepalived的角色,MASTER为主,BACKUP为备
                  interface eth0  #当前进行vrrp通讯的网络接口卡(当前centos的网卡)
                  virtual_router_id 66    #虚拟路由编号,主从要一致
                  priority 100    优先级,数值越大,获取处理请求的优先级越高
                  advert_int 1    #检查间隔,默认为1s(vrrp组播周期秒数)
                  authetication{
                      auth_type   PASS #设置验证类型和密码,MASTER和BACKUP必须使用相同的密码才能正常通信
                      auth_pass   1111
                  }
                  track_script{
                      chk_http_port   #调用检测脚本
                  }
                  virtual_ipaddress{
                      192.168.244.200 #定义虚拟Ip(VIP),可多设,每行一个
                  }
              }
          9)启动成功后,查看指定的网卡上的Ip判断虚拟ip是否成功。ip addr 
    
    1. 监控Nginx的检测脚本,名字为上面使用到的chk_nginx_pid.sh
          #!/bin/bash
          A=`ps -C nginx --no-header |wc -l`
          if [ $A -eq 0 ];then 
              /usr/local/nginx/sbin/nginx     #重启nginx
              if [`ps -C nginx --no-header |wc -l` -eq 0 ];then   #nginx重启失败,则停掉keepalived服务,进行VIP转移
                  killall keepalived
              fi
          fi
    
    1. keepalived只能是2台机器之间
    2. keepalived主备之间相互发送心跳检测,如果一个死掉,另一个活的得不到回应了,此时启动vip到自己机器上。如果相互是通的,比较priority的优先级,值大的机器绑vip
    3. Nginx本身不支持集群,通常借助其他外部应用如当前说的keepAlived,而keepAlived也一般不会用在生产上。生产上一般可以使用域名对应多个Ip的操作,达到nginx高可用的效果

相关文章

网友评论

      本文标题:Nginx(三)Nginx进阶

      本文链接:https://www.haomeiwen.com/subject/kjrytktx.html