美文网首页
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