美文网首页
week15-Nginx企业应用

week15-Nginx企业应用

作者: 刘Huai | 来源:发表于2019-07-30 18:36 被阅读0次

    Nginx网站服务应用

    1. Nginx服务监控状态页部署

    官方说明

    在遇到模块不知道如何配置得时候都可以进进入 nginx官网 去查找相关帮助文档,里边有详细介绍,示例。

    第一步:创建一个新的虚拟主机,在/etc/nginx/conf.d

    创建虚拟主机

    第二步:配置虚拟主机文件

    配置虚拟主机

    第三步:重启服务/重新载入

    第四步:配置本地hosts解析

    本地hosts解析 监控页面显示
    参数含义:
    Active connections: 2         激活的已连接数(总的并发连接数,有多少人在访问)
    server accepts                已接受的客户端访问服务端总的链接数量  
    handled                       '已经处理的'客户端访问服务端的总量
    requests                      接收到的用户请求的报文的总数量
    reading                       读取目前用户访问请求头数量
    writting                      目前响应用户访问响应头数量
    waitting                      目前在内存中/队列中未处理的请求报文数量
    
    

    handle 参数不是绝对的

    worker进程数x worker最大连接数= 总的并发连接数
    worker_processses 2; worker_connections 1024;
    2x1024= 2048 总的并发连接数
    遇到并发超过系统设置的数量,系统会先接收过来,先等待,放到系统内存中,等待处理,因此官方解释handle 数值不是绝对的,因为并不是所有数据都能够立刻接收,立刻处理

    2. Nginx服务日志信息

    access 访问日志

    日志位置 /var/log/nginx/access.log

    日志格式定义:(nginx.conf配置文件中定义)
      log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                          '$status $body_bytes_sent "$http_referer" '
                          '"$http_user_agent" "$http_x_forwarded_for"';
    以上信息都表示定义日志格式 
    main  主题
    $remote_addr
    $xxx
    这些带$符号的字符串,都是Nginx的内置变量
    
    Nginx 官网内置变量介绍
    http://nginx.org/en/docs/varindex.html
    
    

    访问日志详解

    访问日志示例

    $remote_addr :10.0.0.1
    $remote_user : 认证用户名 (这里没有认证,所以显示 --)
    $time_local : [05/Aug/2019:17:47:01 +0800]] 用户访问网站时间信息
    $request" :GET /favicon.ico HTTP/1.1 " HTTP请求行信息
    $status :302 显示状态码信息
    $status $body_bytes_sent :145 响应报文主体尺寸 (消耗网站流量的大小尺寸,尺寸过大需要考虑是否有盗链情况)

    盗链情况:响应报文主体尺寸如果每天增加的越多,产生的流量就越多,增加费用就会越多,有时候需要付费,如果网站访问量不高,还出现这样的情况,可能就出现盗链情况,别人网站盗用了你的照片,但是查看照片的时候使用的是你存储中的图片,消耗你的资源,宣传他人的网站,就会造成费用的损失

    $http_referer:HTTP Referer是header的一部分,当浏览器向web服务器发送请求的时候,一般会带上Referer,告诉服务器该网页是从哪个页面链接过来的,服务器因此可以获得一些信息用于处理。
    $http_user_agent:记录客户端访问信息,例如系统版本,浏览器,什么操作系统,浏览器内核,移动端
    $http_x_forwarded_for

    error 错误日志(产生错误,有问题时需要查看)

    日志位置/var/log/nginx/error.log
    错误日志配置方法:error_log /var/log/nginx/error.log warn;

    时间-级别

    错误日志示例

    2019/08/05 17:47:01 错误发生时间
    /html/www/favicon.ico 在寻找HTML标题左侧图标
    client: 10.0.0.1 客户端地址
    server: \www.oldboy.com 访问域名
    request: "GET /favicon.ico HTTP/1.1 返回请求头信息
    错误日志内容官方说明

    3. 网站location

    location官方说明

    通过指定模式来与客户端请求的URI相匹配

    location 一般是配置server 模块中,location 里面的配置相当与局部配置,而server中的配置相当与全局配置

    location [ = | ~ | ~* | ^~ ] uri { }

        location = / {
            return 301;
        }
        
        location / {
            return 302;
        }
        
        location /documents/ {
            return 401;
        }
        
        location ^~ /images/ {
            return 402;
        }
        
        location ~* \.(gif|jpg|jpeg)$ {
            return 501;
        }
        
        =:     精确匹配  = /oldboy                 www.oldboy.com/oldboy              最优先
        ^~:    优先匹配  ^~ /images                www.oldboy.com/images/oldboy.jpg   优先
        ~:     模糊匹配  ~ /oldboy                 www.oldboy.com/oldboy/oldboy.html  区分大小写
        ~*:    模糊匹配  ~* /oldboy                www.oldboy.com/oldboy/oldboy.html  不区分大小写
                         ~* \.(gif|jpg|jpeg)$     www.oldboy.com/images/oldboy.jpg
        ~* 与 ~的区别在于前者不区分大小写 后者区分
        /目录  路径匹配  /oldboy                   www.oldboy.com/oldboy/oldboy.html  区分大小写
        /      默认匹配  /                         www.oldboy.com/oldgirl
    
    
    默认匹配 location / 精确匹配 ` location /doucments/ lcoation /images/ locaiton (jpg jpeg gif ) 大写同样可以匹配到

    4. 网站页面跳转功能 rewrite

    • 将url信息做改变
    • 将uri信息做改变
    • 完成伪静态配置 动态页面地址--看到的静态页面

    如何实现跳转

    方法一 : rewrite

    Syntax: rewrite regex                replacement         [flag];
            匹配需要跳转的信息            跳转成什么地址     标记(四种标记)
    跳转的标记信息:
    last:
    break:
    redirect:临时跳转 302
    permanent:永久跳转 301 
    

    永久跳转301与临时跳转302

            301跳转:
            客户端(浏览器)        第一次访问 ---->                       京东网站服务器(.100)
            www.360buy.com      1.  HTTP请求:host-www.360buy.com
            10.0.0.100               <---- 
                                2.  HTTP响应:跳转告知 www.jx.com 301
                                              告知浏览器记录跳转
                                               ---->
                                3.  HTTP请求:host-www.jd.com
                                               <----
                                4.  HTTP响应:页面信息进行响应    200
                                    
                                               --->                        京东网站服务器(.100)
            www.360buy.com      1.  HTTP请求:host-www.360buy.com
                                    (根据浏览器记录,直接跳转,不需要服务器告知跳转)
                                    HTTP请求:host-www.jd.com
                                               <---
                                2.  HTTP响应:页面信息进行响应    200
            
            302跳转
            客户端(浏览器)                   ---->                       京东网站服务器(.100)
            www.360buy.com      1.  HTTP请求:host-www.360buy.com
            10.0.0.100                         <----
                                2.  HTTP响应:跳转告知 www.jd.com 302
                                               ---->
                                3.  HTTP请求:host-www.jd.com
                                               <----
                                4.  HTTP响应:页面信息进行响应    200
    
                                               --->                        京东网站服务器(.100)
            www.360buy.com      1.  HTTP请求:host-www.360buy.com
                                               <----
                                2.  HTTP响应:跳转告知 www.jd.com 302            
                                               ---->
                                3.  HTTP请求:host-www.jd.com
                                    (需要服务器再次告知跳转)
                                               <----
                                4.  HTTP响应:页面信息进行响应    200
            如何选择永久跳转与临时跳转(需要分析)
            永久跳转:
            如果有一个长的地址信息或者名称,需要跳转到其他地址,一旦跳转完尽量不要改变,使用301
            例如 mirror.aliyun.com  就是永久跳转
            临时跳转:
            活动页面,短时间内需要跳转,不需要记录信息时候,使用302,如果使用了301 活动结束之后就会报错
    

    rewrite break last跳转

    server {
       listen            80;
       server_name       rewrite.oldboy.com;
       root              /html;
       index             index.html;
       location  ~ ^/break/ {
           rewrite  ^/break/  /test/  break;
       }
       location  ~ ^/last/  {
           rewrite  ^/last/  /test/  last;  
       }
       location   /test/ {
           default_type   application/json; 
          # return 200 'ok';
        root /html/www;
        index oldboy.jpg index.html;
       }
    }
            break:一旦跳转完毕,默认停止后续操作(没有相应信息)  不会再地址栏显示跳转页面地址
            last: 一旦跳转完毕,会继续访问页面配置信息
    
    

    常见跳转示例情况测试说明

    例1. 用户访问html/abc/index.html实际上真实访问是html/bbb/ccc/index.html

    第一步:创建环境

    # html 目录下操作
    mkdir -p bbb/ccc/ 
    # bbb/ccc/目录下操作
    echo 'rewrite.successful' > index.html
    

    第二步:Nginx跳转配置

            server {
                server_name rewrtie.oldboy.com;
                listen 80;
                location / {
                    root /html;
                    index index.html;
                }
                location /abc {
                    rewrite (.*) /bbb/ccc/index.html redirect;
                }
            }
    location 在匹配到访问 /abc/ 目录的时候,跳转访问 bbb/ccc/index.html
    

    测试:访问地址 rewrite.oldboy.com/abc 显示的是 bbb/ccc/index.html 的内容 'rewrite.successful'

    显示信息
    > 第二种方法  return 跳转
            server {
                listen 80;
                
                location / {
                    root /html;
                    index index.html;
                }
                location /abc {
                    return 302 /ccc/bbb/2.html;
                }
            }
    return 会显示跳转后的地址,而rewrite不会
    

    测试:访问地址 rewrite.oldboy.com/abc

    显示结果

    例2. 用户访问/2014/ccc/bbb/2.html实际上真实访问是/2018/ccc/bbb/2.html

    第一步准备环境:

    mkdir /html/2018/ccc/bbb -p  
    echo "2018_ccc_bbb_2" > /html/2018/ccc/bbb/2.html
    

    第二步:配置Nginx跳转

          server {
               listen 80;
               location / {
                   root /html;
                   index index.html;
               }
               location /2014 {  # 记得加 /
                   rewrite ^/2014/(.*)$ /2018/$1 redirect;
                   #return 302 /2018/ccc/bbb/2.html; 第二种跳转方法
               }
           }
    

    方法2

          server {
               listen 80;
               location / {
                   root /html;
                   index index.html;
               }
               location /2014 {  # 记得加 /
                      return 302 /2018/ccc/bbb/2.html; 第二种跳转方法
               }
           }
    

    例3:用户访问/test目录下任何内容, 实际上真实访问是rewrite.oldboy.com

    server {
            server_name rewrite.oldboy.com;
            location / {
                    root /html/;
                    index oldboy.jpg index.html; # 特殊页面时
            }
            location /test {
               rewrite (.*) http://rewrite.oldboy.com redirect; # 设置跳转
               return 302 http://rewrite.oldboy.com; return方法 # 设置跳转
           }
    }
    
    

    例4:用户访问course-11-22-33.html实际上真实访问是/course/11/22/33/course_33.html
    #http://www.oldboy.com/course-11-22-33.html ==> http://www.oldboy.com/course/11/22/33/course_33.html
    跳转目的,不要让用户得知企业站点目录结构

    以上都是实现uri的跳转


    例5:Nginx 实现url 的跳转

    将 rewrite.oldboy.com ---->blog.oldboy.com

    第一步:配置好解析信息

    解析

    第二步:编写配置文件

    # 第一种写法: 可以生效,但是次数过多,会提示重定向次数过多,无法打开网站,避免此问题,使用第二种写法
    server {
    listen 80;
    server_name rewrite.oldboy.com www.jd.com;
    root /html;
    index index.html index.htm; 
    rewrite ^/(.*) http://www.jd.com redirect ;
    }
    
    # 第二种写法:解决重定向次数过多的问题
    
    server {
            listen 80;
            server_name rewrite.oldboy.com;
            index index.html index.htm;
            rewrite ^/(,*) http://jd.com redirect;
    
    
    }
    server {
            server_name www.jd.com;
            location / {
                    root /html/;
                    index  index.html;
            }
    }
    ~     
    # 第三种写法,使用if 判断
           location / {
               root   /html;
               index  index.html index.htm;
               if ($http_host ~* ^rewrite.oldboy.com) {  
                # 判断不区分大小写 ,如果匹配了以 rewrite.oldboy.com 开头的信息,就按照下方语句跳转
                   rewrite  ^/(.*)    http://www.jd.com  redirect;
               }
           }  
           
    

    例6:将http请求,跳转至https

    如何部署HTTPS网站 ?
    ssl模块官方介绍

    第一步:开启 with-http_ssl_moudle 模块(yum安装自动开启,编译安装需要手动开启)
    第二步:配置文件中加载ssl配置信息
    server {
    listen 443 ssl;
    server_name www.oldboy.coml;
    ssl_certificate     /etc/nginx/conf/server.crt;       公钥
    ssl_certificate_key /etc/nginx/conf/server.key;  私钥
    
    
    }
    第三步:创建私钥和证书
    先有私钥
    openssl genrsa -idea -out server.key 2048
    创建证书
    openssl req -days 36500 -x509 -sha256 -nodes -newkey rsa:2048 -keyout server.key -out server.crt
    
     req               ---  设置证书
     -days 36500     --- 设置证书时效
     -x509           --- 设置证书文件信息格式,标准的证书格式
     -sha256         --- 证书数据加密方式
     -nodes -newkey  --- 去掉密码信息 (上边创建私钥时候的密码)
     rsa:2048        --- 识别私钥加密信息
     -keyout         --- 读取私钥文件
     -out            --- 输出一个证书
    
    

    为什么HTTPS 访问要有公钥私钥

    在访问网站时,网站会传输一个公钥给客户端,然后浏览器中就会保存这个公钥,这个公钥对应的就是在访问这个网站的时候会用到,如果网址正确,网站那边有私钥,配对之后就可以正常访问 ,这样就可以避免钓鱼网站;

    1. 查看是否开启了 with-http_ssl_moudle

    nginx -v
    
    模块已开启

    2. 编写配置文件

    server {
       listen               443 ssl;
       server_name          www.oldboy.com;
       ssl_certificate      /etc/nginx/conf/server.crt;
       ssl_certificate_key  /etc/nginx/conf/server.key;
    
    location / {
       root        /html/www;
       index       index.html index.htm;
    }
    }
    
    

    3. 创建公钥 证书

    创建私钥
    openssl genrsa -idea -out server.key 2048    先有私钥
    提示创建一个私钥密码
    
    创建证书:
    openssl req -days 36500 -x509 -sha256 -nodes -newkey rsa:2048 -keyout server.key -out server.crt
    ## 注意,要与配置文件中指定的证书,私钥存放路径一直  /etc/nginx/conf/xxx
    
    
    私钥,证书

    4. 重启nginx,测试网站

    systemctl restart nginx 
    
    测试已经显示https 证书

    目前只能手动输入https://www.oldboy.com 跳转,实现自动跳转如下

    server {
       listen 80;
       root /html/www;
       index index.html index.htm;
       server_name www.oldboy.com;
      # rewrite ^(.*) https://$server_name$1 redirect; rewrite 跳转方法 $1 后向引用前方匹配uri
       return 302 https://$server_name$request_uri;   #return 跳转方法
    }
    server {
       listen               443 ssl;
       server_name          www.oldboy.com;
       ssl_certificate      /etc/nginx/conf/server.crt; 
       ssl_certificate_key  /etc/nginx/conf/server.key;
    
    location / {
       root        /html/www;
       index       index.html index.htm;
    
       Rewrite常用内置变量,在匹配过程中可以引用一些Nginx的全局变量
       $server_name       当前用户请求的域名
       $request_filename  当前请求的文件路径名(带网站的主目录/html/images/test.jpg)
       $request_uri       当前请求的文件路径名(不带网站的主目录/images/test.jpg)
       $scheme            用的协议,比如http或者https
    

    5. Nginx 内容总结

    nginx网站服务阶段总结:
    01. 软件部署安装过程
    02. 软件配置文件编写
        http://nginx.org/en/docs/   
    03. 软件企业应用配置
        a. 实现多个页面配置
        b. 实现不同访问方式
        c. 实现目录索引功能
        d. 实现网站安全访问 
        e. 实现状态信息监控
        f. 服务程序日志功能    日志切割处理(logrotate  切割日志脚本)
           #!/bin/bash
           log_path="/var/log/nginx/"
           access_info="access_log"
           error_info="error_log"
           access_info_date="access_$(date +%F).log"
           error_info_date="error_$(date +%F).log"
           
           mv $log_path$access_info  $log_path$access_info_date
           mv $log_path$error_info   $log_path$error_info_date
           systemctl restart nginx
           编写定时任务
        g. 服务程序location匹配uri信息功能
        h. 服务程序rewrite(return)实现网站页面跳转功能
     04. 网站服务实现HTTPs访问      
    

    相关文章

      网友评论

          本文标题:week15-Nginx企业应用

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