nginx2-网站服务部署

老男孩教育61期--week15--网站web服务

  1. 课程介绍部分:

    1. 网站web服务扩展应用说明
      a 网站状态模块配置说明
      b 网站日志信息详细说明
      d 网站location配置说明
      e 网站服务跳转功能配置
      f 网站服务如何安全访问 HTTPS
      2)网站LNMP架构
      a LNMP架构搭建配置
      b LNMP架构代码上线 jenkins

    负载均衡/高可用

  2. 知识重点回顾:

    1. nginx网站服务概念介绍
      a 高并发消耗资源少
      b 功能丰富
    2. nginx网站服务部署安装
      yum安装 (官方源安装 非官方源安装)
      编译安装 (源码包 依赖软件 配置参数)
    3. nginx网站服务目录结构
      /etc/nginx /var/log/nginx /html /usr/bin/
    4. nginx网站服务配置文件 (默认信息)
      多参见官方网站资料
    5. nginx网站服务应用配置
      a 实现部署多个网站页面
      b 实现不同方式访问网站
      c 实现网站服务目录索引
      d 实现网站安全访问功能
      根据地址控制 根据认证控制(401)
  1. nginx网站服务企业应用
    1)nginx服务监控状态页部署
    第一个历程:创建一个新的server虚拟主机
    vim conf.d/state.conf
    server {
    listen 80;
    server_name state.oldboy.com;
    location / {
    stub_status;
    }
    }
    第二个历程:创建域名解析
    state.oldboy.com 10.0.0.7

    监控状态页面信息:
    Active connections: 2
    server accepts handled requests
    2 2 1
    Reading: 0 Writing: 1 Waiting: 1

    Active connections: 激活的连接数(总的并发连接数)
    server accepts: 已经接收的客户端访问服务端总的链接数量
    handled: 已经处理的客户端访问服务端总的链接数量
    requests: 接收到用户请求报文的总数量

    Reading: 目前读取用户访问请求头数量
    Writing: 目前响应用户访问响应头数量
    waiting: 目前在内存/队列中未处理请求报文数量
    http://nginx.org/en/docs/http/ngx_http_stub_status_module.html

    2)nginx服务日志信息
    access 访问日志: /var/log/nginx/access.log
    log_format main 'remote_user [request" '
    'body_bytes_sent "http_user_agent" "remote_addr 10.0.0.1 用户访问源地址信息
    time_local] [20/Jul/2019:10:31:52 +0800] 用户访问网站时间信息
    status 404 显示状态码信息
    http_referer ???
    http_x_forwarded_for

    error 错误日志:/var/log/nginx/access.log
    配置方法:
    error_log /var/log/nginx/error.log warn;
    http://nginx.org/en/docs/ngx_core_module.html#error_log
    2019/07/20 10:31:52 [error] 11763#11763: *6 open() "/html/www/favicon.ico" failed (2: No such file or directory), client: 10.0.0.1, server: www.oldboy.com, request: "GET /favicon.ico HTTP/1.1", host: "www.oldboy.com", referrer: "http://www.oldboy.com/"

3) 网站服务location配置
http://nginx.org/en/docs/http/ngx_http_core_module.html#location
location [ = | ~ | ~* | ^~ ] uri { ... }
location: 局部配置
server:   全局配置

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

异常问题: 
第一步: www.oldboy.com/            ---> location /           --> www.oldboy.com/oldboy.jpg
第二步: www.oldboy.com/oldboy.jpg  ---> location = /oldboy           --> www.oldboy.com/oldboy.jpg


4) 网站服务页面跳转功能
    什么是页面跳转:
    1. 将url信息做改变
    2. 将uri信息做改变
    3. 完成伪静态配置    动态页面地址--看到的静态页面???

    如何实现页面跳转:
    方法一:rewrite
    Syntax: rewrite regex                replacement      [flag];
                    匹配需要跳转的信息   跳转成什么地址    标记
    Default:    —
    Context:    server, location, if
    http://nginx.org/en/docs/http/ngx_http_rewrite_module.html#rewrite
    跳转的标记信息:
    last:
    break:
    redirect:  临时跳转  302  
    permanent: 永久跳转  301
    301跳转:
    客户端(浏览器)                   ---->                       京东网站服务器(.100)
    www.360buy.com          HTTP请求:host-www.360buy.com
    10.0.0.100                         <----
                            HTTP响应:跳转告知 www.jx.com 301
                                      告知浏览器记录跳转
                                       ---->
                            HTTP请求:host-www.jd.com
                                       <----
                            HTTP响应:页面信息进行响应    200
                            
                                       --->                        京东网站服务器(.100)
    www.360buy.com          HTTP请求:host-www.360buy.com
                            HTTP请求:host-www.jd.com
                                       <---
                            HTTP响应:页面信息进行响应    200
    
    302跳转
    客户端(浏览器)                   ---->                       京东网站服务器(.100)
    www.360buy.com          HTTP请求:host-www.360buy.com
    10.0.0.100                         <----
                            HTTP响应:跳转告知 www.jd.com 302
                                       ---->
                            HTTP请求:host-www.jd.com
                                       <----
                            HTTP响应:页面信息进行响应    200

                                       --->                        京东网站服务器(.100)
    www.360buy.com          HTTP请求:host-www.360buy.com
                                       <----
                            HTTP响应:跳转告知 www.jd.com 302            
                                       ---->
                            HTTP请求:host-www.jd.com
                                       <----
                            HTTP响应:页面信息进行响应    200
    
    方法二:return  配置简单方便
    Syntax:     return code URL;
    Default:    —
    Context:    server, location, if
    www.jd.com/oldboy.html   --- return  301   www.jx.com/oldboy.html 
    
    页面跳转实践操作:
    01. 跳转配置中last与break区别对比示例
    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';
       }
    }

    break:一旦跳转完毕,默认停止后续操作(没有相应信息)  不会再地址栏显示跳转页面地址
    last: 一旦跳转完毕,会继续访问页面配置信息


    03. 常见跳转示例情况测试说明
    例1: 用户访问/abc/1.html实际上真实访问是/ccc/bbb/2.html
    #http://rewrite.oldboy.com/abc/1.html ==> http://rewrite.oldboy.com/ccc/bbb/2.html
    实现uri信息跳转
    
    /html/abc/1.html   收藏夹
    
    
    第一里程:准备真实的访问路径
    [root@web03 ~]# mkdir /html/ccc/bbb -p
    [root@web03 ~]# echo "ccc_bbb_2" > /html/ccc/bbb/2.html
    
    第二个里程:Nginx跳转配置
    [root@web03 conf.d]# cat ccbb.conf 
    server {
        listen 80;
        
        location / {
            root /html;
            index index.html;
        }
        location /abc {
            rewrite (.*) /ccc/bbb/2.html redirect;
            #return 302 /ccc/bbb/2.html;
        }
    }
    
    第三个里程:重启Nginx服务
    [root@web03 ~]# systemctl restart nginx

    例2:用户访问/2014/ccc/bbb/2.html实际上真实访问是/2018/ccc/bbb/2.html
    #http://rewrite.oldboy.com/2014/ccc/bbb/2.html ==> http://rewrite.oldboy.com/2018/ccc/bbb/2.html
    
    第一个里程:准备真实的访问路径
    [root@web03 ~]# mkdir /html/2018/ccc/bbb -p
    [root@web03 ~]# echo "2018_ccc_bbb_2" > /html/2018/ccc/bbb/2.html
    
    第二个里程:Nginx跳转配置
    [root@web03 conf.d]# cat ccbb.conf 
    server {
        listen 80;
        location / {
            root /code;
            index index.html;
        }
        location /2014 {
            rewrite ^/2014/(.*)$ /2018/$1 redirect;
            #return 302 /2018/ccc/bbb/2.html;
        }
    }

   第三个里程:重启Nginx服务
   [root@web03 ~]# systemctl restart nginx

   例3:用户访问/test目录下任何内容, 实际上真实访问是http://www.oldboy.com
   准备环境:
   mkdir /html/test/     oldboy.jpg

   配置
   location /test {
       rewrite (.*) http://rewrite.oldboy.com redirect;
   }
   location / {
       root /html;
       index oldboy.jpg index.html;
   }


   例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  
   跳转目的,不要让用户得知企业站点目录结构
   
   第一个里程 准备真实的访问路径
   [root@web03 ~]# mkdir /html/course/11/22/33/ -p
   [root@web03 ~]# echo "Curl docs.etiantian.org" > /html/course/11/22/33/course_33.html

   第二个里程 Nginx跳转配置
   [root@web03 conf.d]# cat ccbb.conf 
   server {
           listen 80;
           root /code;
           index index.html;
           location / {
               #灵活rewrite ^/course-(.*)-(.*)-(.*).html$ /course/$1/$2/$3/course_$3.html redirect;
               #固定rewrite ^/course-(.*)  /course/11/22/33/course_33.html redirect;
           }
       
   第三个里程 重启Nginx服务
   [root@web03 ~]# systemctl restart nginx
   说明: last break 做跳转不会显示跳转的地址信息
   
   例5:将http请求,跳转至https
   如何部署HTTPS网站:
   第一个历程:环境准备工作
   安装nginx程序时,需要开启ssl模块功能() --with-http_ssl_module
   
   第二个历程:配置文件中加载ssl配置信息
   http://nginx.org/en/docs/http/ngx_http_ssl_module.html
   server {
      listen              443 ssl;
      server_name         rewrite.oldboy.com;
      ssl_certificate     /etc/nginx/server.crt;    公钥
      ssl_certificate_key /etc/nginx/server.key;    私钥
   }
   
   解释说明:
   为什么HTTPS访问需要有公钥和私钥:
   www.jd.com(真)  ---- 公钥 --- 浏览器(公钥--www.jd.com)
        私钥(真)                     公钥(真)         
   www.jd.com(假)
        私钥(假)                     公钥(真)
   
   
   www.jd.com(真)               浏览器(公钥--www.jd.com)
        私钥(真)                     公钥(真)         
   www.jd.com(假)
        私钥(假)                     公钥(真)
   
                     CA 证书颁发机构
   
   第三个历程: 创建私钥和证书
   先有私钥:
   openssl genrsa -idea -out server.key 2048
   私钥密码
   
   创建证书:
   openssl req -days 36500 -x509 -sha256 -nodes -newkey rsa:2048 -keyout server.key -out server.crt
   -days 36500     --- 设置证书时效
   -x509           --- 设置证书文件信息格式
   -sha256         --- 证书数据加密方式
   -nodes -newkey  --- 去掉密码信息
   rsa:2048        --- 识别私钥加密信息
   -keyout         --- 读取私钥文件
   -out            --- 输出一个证书
   
   第四个历程:重启nginx服务,进行测试
   
   第五个历程:实现http跳转为HTTPs
   server {
           listen 80;
           server_name rewrite.oldboy.com;
           rewrite ^(.*) https://$server_name$1 redirect;
           #return 302 https://$server_name$request_uri;    ???
   }
   
   rewrite.oldboy.com/oldboy.jpg          ---> https://rewrite.oldboy.com/oldboy.jpg
   
   rewrite ^(.*) $scheme://rewrite.oldboyedu.com$request_uri redirect;
   https://rewrite.oldboy.com/oldboy.jpg  ---> https://rewrite.oldboyedu.com/oldboy.jpg
   
   server {
       listen 443 ssl;
       server_name rewrite.oldboy.com;
       ssl_certificate     /etc/nginx/server.crt;    公钥
       ssl_certificate_key /etc/nginx/server.key;    私钥;
   }

   Rewrite常用内置变量,在匹配过程中可以引用一些Nginx的全局变量
   $server_name       当前用户请求的域名
   $request_filename  当前请求的文件路径名(带网站的主目录/html/images/test.jpg)
   $request_uri       当前请求的文件路径名(不带网站的主目录/images/test.jpg)
   $scheme            用的协议,比如http或者https

   实际配置:
   [root@web01 nginx]# cat /etc/nginx/conf.d/rewrite.conf 
   server {
      listen 80;
      server_name rewrite.oldboy.com;
      rewrite ^(.*) https://$server_name$1 redirect;
      #return 302 https://$server_name$request_uri;
          }
   server {
      listen            443 ssl;
      server_name       rewrite.oldboy.com;
      ssl_certificate     /etc/nginx/server.crt;
      ssl_certificate_key /etc/nginx/server.key;
      location / {
          root   /html;
          index  index.html index.htm;
      }
   }
   以上都是实现uri信息跳转
   
   实现url信息跳转:rewrite.oldboy.com  ---  www.jd.com
   第一个历程:配置好解析信息
   10.0.0.7  rewrite.oldboy.com rewrite.oldboyedu.com
   第二个历程:编写配置文件
   编写方法一:
   [root@web01 conf.d]# cat rewrite.conf 
   server {
      listen            80;
      server_name       rewrite.oldboy.com;
      rewrite  ^/(.*)    http://www.jd.com/$1  permanent;  
   }
   server {
      listen            80;
      server_name       www.jd.com;
      location / {
          root   /html;
          index  index.html index.htm;
      }
   }
   编写方法二:
   location / {
       root   /html;
       index  index.html index.htm;
       if ($http_host ~* ^rewrite.oldboy.com) {
           rewrite  ^/(.*)    http://www.jd.com/$1  permanent;
       }
   }  
  1. nginx网站服务阶段总结:

    1. 软件部署安装过程

    2. 软件配置文件编写
      http://nginx.org/en/docs/

    3. 软件企业应用配置
      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"

      mv access_info access_info_date
      mv error_info error_info_date
      systemctl restart nginx
      编写定时任务
      g. 服务程序location匹配uri信息功能
      h. 服务程序rewrite(return)实现网站页面跳转功能

    4. 网站服务实现HTTPs访问

  2. 网站LNMP架构
    web01: 处理静态请求 nginx
    架构组成部分
    L: linux (selinux没关 防火墙关闭 /tmp 1777)
    n: nginx web服务功能
    p: php
    M: mysql(mariadb) 数据库

    LNMT:
    n: nginx 负载均衡功能
    t: tomcat
    LNMP:
    p: python
    架构功能原理:
    用户访问网站(静态) --- nginx
    用户访问网站(动态) --- nginx --- php --- mariadb(查/写)

  3. 网站LNMP搭建过程:
    第一个历程: 软件安装部署 OK

    mariadb: 安装部署
    yum install -y mariadb-server mariadb

    PHP: 安装部署
    yum remove php-mysql php php-fpm php-common
    rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
    rpm -Uvh https://mirror.webtatic.com/yum/el7/webtatic-release.rpm
    yum install -y php71w php71w-cli php71w-common php71w-devel php71w-embedded php71w-gd php71w-mcrypt php71w-mbstring php71w-pdo php71w-xml php71w-fpm php71w-mysqlnd php71w-opcache php71w-pecl-memcached php71w-pecl-redis php71w-pecl-mongodb

    第二个历程: 软件配置 测试过程
    nginx + php 建立关系
    php + mysql 建立关系 (代码信息)
    第三个历程: 手动代码上线
    代码使用开源代码:
    blog 博客: wordpress
    www 网站: dedecms
    bbs 论坛: discuz
    zhihu 知乎: wecenter

    云主机: 1台 域名:(备份) ssl证书: 免费 高并发: CDN
    nginx-不能yum安装(编译安装)

    第四个历程: 数据库迁移过程
    第五个历程: 实现数据共享存储

作业:

  1. LNMP架构服务软件部署好
  2. 负载均衡 / 高可用
    lb01 lb02 --- nginx keepalived

你可能感兴趣的:(nginx2-网站服务部署)