Nginx(三)Nginx进阶

  • 内置变量
    $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高可用的效果
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,098评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,213评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,960评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,519评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,512评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,533评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,914评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,574评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,804评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,563评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,644评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,350评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,933评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,908评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,146评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,847评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,361评论 2 342