当前位置首页 > Nginx知识

50.运维7-nginx负载均衡

阅读次数:243 次  来源:admin  发布时间:

67.网站服务:

0. 回顾 
ansible批量管理软件概念
2. ansible批量管理软件组成
   a 软件的模块
   b 软件主机清单
   c 软件剧本编写
3. ansible软件部署安装
   基于秘钥的远程连接---三件事
4. ansible模块使用方法
       ansible 主机信息 -m 模块名 -a "模块参数"
    5. ansible主机清单配置方法
       a 利用分组进行配置
       b 设置变量信息管理  
       c 利用嵌入方式配置
    6. ansible软件剧本编写方法
       语法规范:  3点
       剧本扩展功能: 
       剧本角色功能:

       - import_tasks: server
         when: ansible_ip_address
   - import_tasks: client
            
    7. ansible常见问题总结
   1) 无法远程管理  ping
      秘钥没有合理分发
  主机清单配置有关
  远程服务是否开启
   2) 剧本批量执行
      检查剧本语法
  检查剧本模块应用 --- 尽量不要都使用shell
          剧本执行卡死     --- ansible-playbook xxx  -vvvv
          指定主机清单    --- ansible-playbook -i /etc/ansible/hosts_1

1. 内容介绍
1. 用户访问网站的流程
2. HTTP协议的数据包
   HTTP请求报文
   HTTP响应报文
3. 状态码信息
4. 请求访问的资源信息
   静态资源/动态资源
5. 网站好坏评测方法
6. 常用的网站服务
7. nginx软件部署
    
2. 掌握网站页面访问流程
    00. 客户端  浏览器输入网址信息点击回车(www.oldboyedu.com)
01. 客户端  完成域名的解析过程(DNS) 
02. 客户端  直接访问相应网站服务器建立TCP三次握手过程
    03. 客户端  访问网站服务器          发送HTTP请求报文  多次
04. 服务端  响应客户端请求             回复HTTP响应报文  多次
05. 客户端  浏览器看到网站页面
06. 客户端  结束访问网站过程           完成TCP四次挥手过程
3.HTTP协议请求和响应过程
    HTTP请求报文
    1) 请求行
   请求方法: Get--读/看---获取/拿过来
post--写/提交
   请求信息: index.html(首页文件)  oldboy.jpg 
   请求协议:  http 1.1
   HTTP: 1.0TCP短连接
   HTTP: 1.1    TCP长连接
   HTTP: 2.0    TCP长连接优化  提高用户并发(同时)访问的效率 
2) 请求头
   请求主机信息
3) 空行
4) 请求主体
   使用get方法时, 没有请求主体信息
   使用post方法时,具有请求主体内容

HTTP响应报文
1) 起始行
   状态码信息   访问请求是成功响应/失败响应
   面试: 写出几种常见的状态码???
2) 响应头部
3) 空行
4) 响应主体
    
4. HTTP协议资源信息
    URL: 全称为Uniform Resource Location,中文翻译为统一资源定位符
URI: 全称为Uniform Resource Identifier,中文翻译为统一资源标识符

docs.ansible.com   / ansible/latest/user_guide/playbooks_reuse_roles.html
       URL                            URI 
   
网站页面静态资源:
要什么给我什么, oldboy.jpg  index.html
    特点说明:
1)网页内容是固定不变的,因此,容易被搜索引擎收录(容易被用户找到)(优点)。
2)  因为网页没有数据库的支持,所以在网站制作和维护方面的工作量较大,当网站信息量很大时,
    完全依靠静态网页比较困难(缺点)。
    3)  网页的交互性较差,在程序的功能实现方面有较大的限制(缺点)。
4)  当客户端向服务器请求数据时,服务器会直接从磁盘文件系统上返回数据(不做任何解析)。

    网站页面动态资源:
    要什么信息,需要进行查询数据库进行解析后发送给客户端
    查看班级人员信息表

班级   人名   年龄   学历
    sz-01  张三   18     高中   ---> 数据库中 oldboy=123  <--- post 
    sz-01  李四   20     大专

    班级   人员   年龄   学历
    代码信息直接调用数据库的内容
1) 采用动态网页技术的网站可以实现更多的功能,如用户注册、用户登录、在线调查、
   投票、用户管理、订单处理、发博文等。
2) 动态资源页面会出现 "?" "&", 不便于被搜索引擎收录
3) 接收到用户请求,需要让动态服务和数据库服务进行处理

伪静态资源(动态页面)
1. 可以便于搜索引擎进行收录
2. 有数据库服务支持,实现网页交互功能
    
5.  评测网站好坏的指标:
    IP: 根据用户IP地址数量进行统计   300万~400万  一个星期
    局域网多个用户访问:  网站服务器只记录一个IP访问   NAT技术
断电了家用电脑会重新拨号: wan--公网地址

PV: 页面访问量                   700~800万     一个星期
参考值:

UV: 记录独立访客数量
cookie:  标识用户身份信息, 会保存在用户客户端本地                     内存中
session: 记录用户的一些会话操作, eg: 记录用户登录信息  记录在服务端  内存中

    网站的并发: (压测技术 1 10 100 1000 10000)
A种理解:网站服务器每秒能够接收的最大用户请求数。
    B种理解:网站服务器每秒能够响应的最大用户请求数。
    C种理解:网站服务器在单位时间内能够处理的最大连接数。 

饭店吃饭: 10:00  每个桌子--4个  10个桌子
10:00:00~01  40个人
10:30: 
    高速公路: 5月1日 - 5月3日 
    三车道: 三辆

补充:
    wget与curl命令?

68.nginx介绍:

1.常用的网站服务软件
    处理静态资源的服务:
apache软件: http://apache.org/
nginx软件: http://nginx.org

处理动态资源的服务:
    PHP: php.net    终端浏览器进行访问  ***
Tomcat(java):   利用移动端查看网页  安卓-java
PYTHON:         开发难度比较低   
        
2.nginx服务的软件特点:
    1) 支持高并发,消耗内存资源少
2) 具有多种功能
   网站web服务功能  --- apache 
   网站负载均衡功能 --- LVS
   网站缓存服务--- Squid
3) 在多种系统平台都可以进行部署
    4) nginx实现网络通讯时使用的时异步网络IO模型: epoll模型(apache -- select模型)
       epoll模型:
   宿舍管理员: 找人,查看人员登记信息 
   幼儿园阿姨: 小朋友上厕所, 都站在教室的某个位置
   
   select模型:
   宿舍管理员: 找人,一个一个屋子去问, --线性轮询
       幼儿园阿姨: 小朋友上厕所, 一个一个小朋友去询问
        
3. nginx软件的安装部署过程:
    两种安装方式:
01. yum安装软件
    a 使用官方yum源进行安装    安装的是最新版本  软件目录结构比较标准 (推荐)
b 使用非官方yum源进行安装  安装的不是最新版  目录结构会发生变化
02. 编译安装软件 
    第一个步骤:
    wget http://nginx.org/download/nginx-1.16.0.tar.gz
    PS: 解决软件的依赖 openssl-devel pcre-devel
第二个步骤: 
解压下载好的软件, 并进入到软件目录中
第三个步骤:
        编译安装三步曲
        a 进行配置操作
        ./configure --prefix=  --user=USER 
        --prefix=PATH     set installation prefix    
                  指定程序安装路径
--user=USER       set non-privileged user for worker processes
                  设置一个虚拟用户管理worker进程(安全)
        --group=GROUP     set non-privileged group for worker processes
                          设置一个虚拟用户组管理worker进程(安全)
        b 进行软件的编译过程:
        make 编译(翻译)
        C(英国人)       代码(任务文件)  系统识别  翻译  系统(中国人)处理代码
翻译效率比较低  翻译官(gcc)
python(日本人)  代码(任务文件)  系统识别  翻译  系统(中国人)处理代码
        翻译效率比较高  百度翻译(python解释器)  

c 编译安装过程
make install
    
yum官方源安装方法:
第一个历程: 更新nginx官方yum源
vim /etc/yum.repos.d/nginx.repo
[nginx-stable]
    name=nginx stable repo
    baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
    gpgcheck=1
    enabled=1
    gpgkey=https://nginx.org/keys/nginx_signing.key

第二个历程: yum安装nginx软件
yum install -y nginx

    第三个历程: 启动nginx服务,检查服务是否安装正确
systemctl start nginx
    systemctl enable nginx
测试访问nginx服务
    
4.查看软件的目录结构
    1) /etc/logrotate.d
   实现nginx日志文件定时切割处理
   日志切割方法一: 利用脚本实现切割
   #!/bin/bash
   
   mv /var/log/nginx/access.log  /var/log/nginx/access_$(date +%F).log
   systemctl restart nginx
   日志切割方法二: 利用专用文件切割程序--logrotate
   vim /etc/logrotate.conf
       # rotate log files weekly
       weekly                     --- 定义默认日志切割的周期
       
       # keep 4 weeks worth of backlogs
       rotate 4                   --- 定义只保留几个切割后的文件
       
       # create new (empty) log files after rotating old ones
       create                     --- 创建出一个相同的源文件
       
       # use date as a suffix of the rotated file
       dateext                    --- 定义角标(扩展名称信息)
       
       # uncomment this if you want your log files compressed
       #compress                  --- 是否对切割后的文件进行压缩处理
       
       # RPM packages drop log rotation information into this directory
       include /etc/logrotate.d   --- 加载包含/etc/logrotate.d/目录中文件配置
       
       # no packages own wtmp and btmp -- we\'ll rotate them here
       /var/log/wtmp {            --- 单独对某个文件进行切割配置
           monthly
           create 0664 root utmp
          minsize 1M             --- 最小大小为1M,小于1M不进行切割              
           rotate 1
       }
       
       /var/log/btmp {
           missingok
           monthly
           create 0600 root utmp
           rotate 1
       }
   
   前端开发:
   html     页面代码
       css      定义页面样式
       js       定义页面特效功能   

       总结:
   01. /etc/nginx       配置文件
       02. /var/log/nginx 日志文件
       03. /usr/bin/nginx   命令文件
       04. /usr/share/nginx/html   站点目录???
           图片  附件信息  音频  视频
            
5.  nginx服务配置文件
    /etc/nginx/nginx.conf       --- 主配置文件
第一个部分: 配置文件主区域配置
user  www;                --- 定义worker进程管理的用户
补充: nginx的进程
master process:  主进程---管理服务是否能够正常运行   boss
worker process:  工作进程---处理用户的访问请求         员工  
    worker_processes  2;        ---定义有几个worker进程  == CPU核数 / 核数的2倍
    error_log  /var/log/nginx/error.log warn;   --- 定义错误日志路径信息
    pid        /var/run/nginx.pid;              --- 定义pid文件路径信息

第二个部分: 配置文件事件区域
    events {                    
        worker_connections  1024;   --- 一个worker进程可以同时接收1024访问请求
    }

第三个部分: 配置http区域
    http {
        include       /etc/nginx/mime.types;      --- 加载一个配置文件
        default_type  application/octet-stream;   --- 指定默认识别文件类型
        log_format  oldboy  \'$remote_addr - $remote_user [$time_local] "$request" \'
                            \'$status $body_bytes_sent "$http_referer" \'
                            \'"$http_user_agent" "$http_x_forwarded_for"\';
                     --- 定义日志的格式
        access_log  /var/log/nginx/access.log  oldboy;
                     --- 指定日志路径          
        sendfile       on;    --- 指定文件的传输方式,通过sendfile减少了数据进入user buffer的过程,直接在kernel buffer中进行数据的读取与写入
        tcp_nopush     on;    --- 与sendfile配合使用,当有数据时,先别着急发送, 确保数据包已经装满数据, 避免了网络拥塞
        tcp_nodelay    on     ---有时要抓紧发货, 确保数据尽快发送, 提高可数据传输效率,和sendfile配合使用,tcp_nopush和tcp_nodelay同时只可出现一个
        keepalive_timeout  65;   --- 超时时间
        gzip  on;    --- 传输数据的时候进行压缩,传输
        include /etc/nginx/conf.d/*.conf;        --- 加载一个配置文件
    }


/etc/nginx/nginx.d/default  --- 扩展配置(虚拟主机配置文件)
第四个部分: server区域信息(配置一个网站 www/bbs/blog -- 一个虚拟主机)
server {
        listen       8080;                --- 指定监听的端口
        server_name  www.oldboy.com;      --- 指定网站域名                     
        root   /usr/share/nginx/html;     --- 定义站点目录的位置
        index  index.html index.htm;      --- 定义首页文件
        error_page   500 502 503 504  /50x.html;   --- 优雅显示页面信息
        location = /50x.html {
            root   /usr/share/nginx/html;
        }
    }
    
6.作用
    1) 常用的网站web服务 (静态请求 动态请求)
2) nginx服务的特点   apache
    3) nginx软件安装部署 yum官方源如何安装部署
4) nginx程序重要目录结构 
5) nginx服务配置文件默认参数

补充:
    1.如何查看centos7中的cpu核数?
     在系统文件/proc/cpuinfo记录了关于cpu的信息
    2.301和302的区别?
      https://blog.csdn.net/jyg0723/article/details/52942163
      https://blog.csdn.net/liouswll/article/details/81288601
    3. 熟悉排序和去重命令,对文件中数值信息进行统计分析 2组 
        统计用户访问哪个页面的次数比较多,取出前10名
        https://blog.csdn.net/baidu_38981831/article/details/105509059
    4. 如何对网站进行压力测试   3组 周五前
    5.poll和epoll
    https://www.cnblogs.com/aspirant/p/9166944.html

69.nginx应用:

0.回顾
1. nginx服务一些特点介绍
   a 支持高并发能力比较强 消耗资源少
   b 软件功能比较多样 
   c 支持系统平台比较广泛
     可以制作yum仓库
 1. 收集仓库中的软件          --- yum.conf
 2. 客户端访问到制作yum仓库   --- nginx (linux windows)
    2. nginx软件部署安装
   a yum安装方式
   b 编译安装软件
3. nginx目录结构
4. nginx配置文件参数说明
1.nginx服务的企业应用
    1. 利用nginx服务搭建一个网站(www)
第一个历程: 编写虚拟主机配置文件
cd /etc/nginx/conf.d/
vim www.conf
server {
       listen        80;
       server_name   www.oldboy.com;
       location  /oldboy {
         root  /usr/share/nginx/html;
         index oldboy.html;
       }
    }

    第二个历程: 需要获取开发人员编写的网站代码
    <html>
      <meta charset="utf-8">
      <head>
        <title>老男孩深圳01最牛x</title>
      </head>
      <body>
        老男孩教育深圳01-脱产班
        <table border=1>
          <tr> <td>01</td> <td>oldboy</td> </tr>
          <tr> <td>02</td> <td>oldgirl</td> </tr>
          <tr> <td>03</td> <td>olddog</td> </tr>
        </table>
        <a href="http://blog.oldboyedu.com">
          <img src="oldboy.jpg" />
        </a>
       </body>
    </html>

第三个历程: 重启nginx服务(平滑重启)
两种方法:
systemctl reload nginx 
nginx -s reload

nginx命令参数
-t            : test configuration and exit
                检查测试配置文件语法
-s            : send signal to a master process: stop, quit, reopen, reload
                控制服务停止或者重新启动

    第四个历程: 编写DNS配置信息
    真实域名: 在阿里云上进行DNS解析记录配置
模拟域名: 在windows主机的hosts文件中进行配置即可
          C:\Windows\System32\drivers\etc\hosts
  
第五个历程: 进行测试访问
浏览器中: http://www.oldboy.com

    部署搭建网站常见错误:
01. 网站服务配置文件编写不正确
    404 错误
解决方法一: 修改nginx配置文件---location
解决方法二: 在站点目录中创建相应目录或文件数据信息
403 错误
解决方法一: 不要禁止访问
解决方法二: 因为没有首页文件
    
02. DNS信息配置不正确

03. nginx配置文件修改一定要重启服务;
    站点目录中代码文件信息调整,不需要重启服务
        
2.利用nginx服务搭建一个多网站(www bbs blog)
    第一个历程: 创建多个虚拟主机配置文件
bbs.conf
    server {
       listen        80;
       server_name   bbs.oldboy.com;
       location  / {
         root  /html/bbs;
         index index.html;
       }
    }
blog.conf
    server {
       listen        80;
       server_name   blog.oldboy.com;
       location  / {
         root  /html/blog;
         index index.html;
       }
    }
    www.conf
    server {
       listen        80;
       server_name   www.oldboy.com;
       location  / {
         root  /html/www;
         index index.html;
       }
    }
systemctl reload nginx

    第二个历程: 创建站点目录和目录中首页文件
[root@web01 conf.d]# mkdir /html/{www,bbs,blog} -p
    [root@web01 conf.d]# for name in {www,bbs,blog};do echo "10.0.0.7 $name.oldboy.com" >/html/$name/index.html  ;done
    [root@web01 conf.d]# for name in {www,bbs,blog};do cat /html/$name/index.html  ;done
    10.0.0.7 www.oldboy.com
    10.0.0.7 bbs.oldboy.com
    10.0.0.7 blog.oldboy.com

第三个历程: 编写hosts解析文件
10.0.0.7            www.oldboy.com  bbs.oldboy.com blog.oldboy.com

第四个历程: 进行访问测试
1. 利用windows进行浏览器访问测试
2. 利用linux进行命令访问测试
   [root@web01 conf.d]# curl www.oldboy.com
       10.0.0.7 www.oldboy.com
       [root@web01 conf.d]# curl bbs.oldboy.com
       10.0.0.7 bbs.oldboy.com
       [root@web01 conf.d]# curl blog.oldboy.com
       10.0.0.7 blog.oldboy.com
    
3.企业中虚拟主机访问方式
a 基于域名的方式进行访问:
b 基于地址的方式进行访问: (只能用指定地址访问)   --- 负载均衡+高可用服务
  server {
         listen        10.0.0.7:80;  # 指定监听地址
         server_name   www.oldboy.com;
         location  / {
           root  /html/www;
           index index.html;
         }
      }
  PS: 服务配置文件中涉及到地址修改,必须重启nginx服务,不能平滑重启 nginx -s reload

c 基于端口的方式进行访问:        zabbix服务(apache:80)  + web服务(nginx:80) --> 主机
server {
       listen        8080;
       server_name   www.oldboy.com;
       location  / {
         root  /html/www;
         index index.html;
       }
    }
    
网站页面的访问原理:
01. 将域名进行解析   www.oldboy.com  --- 10.0.0.7
02. 建立TCP的连接(四层协议)
    10.0.0.7   目标端口   8080   # 接着找满足端口的,可以理解为端口的优先级高
    03. 根据应用层HTTP协议发出请求
    请求报文: hosts: bbs.oldboy.com
04. 没有相同域名的server主机,会找满足端口要求的第一个主机
        显示主机的网站页面
    
4. 企业中网站的安全访问配置
a 根据用户访问的地址进行控制
  10.0.0.0/24   www.oldboy.com/AV/  不能访问
  172.16.1.0/24 www.oldboy.com/AV/  可以访问
  
  nginx访问模块: ngx_http_access_module
  举例配置:
  location / {
          deny  192.168.1.1;
          allow 192.168.1.0/24;
          allow 10.1.1.0/16;
          allow 2001:0db8::/32;
          deny  all;
      }
  指令用法
  Syntax:deny address | CIDR | unix: | all;
      Default:—
      Context:http, server, location, limit_except
  
  第一个历程: 编写配置文件
  [root@web01 conf.d]# vim www.conf 
      server {
         listen        80;
         server_name   www.oldboy.com;
         location / {
           root  /html/www;
           index index.html;
         }
         location /AV {
           deny  10.0.0.0/24;
           allow 172.16.1.0/24;
           root  /html/www;
           index index.html;
         }
      }
      补充: 
  location外面的信息, 全局配置信息
  location里面的信息, 局部配置信息

b 根据用户访问进行认证
  nginx认证模块: ngx_http_auth_basic_module
  举例配置: 
  location / {
         auth_basic           "closed site";    --- 开启认证功能
         auth_basic_user_file conf/htpasswd;    --- 加载用户密码文件
      }
 
      # 认证模块
  第一个历程: 编写虚拟主机配置文件 
      server {
         listen        80;
         server_name   www.oldboy.com;
         location / {
           root  /html/www;
           index index.html;
           auth_basic      "oldboy-sz-01";   # auth_basic配置上就说明开启了,后面的是提示信息
           auth_basic_user_file ../password/htpasswd;  # 文件在nginx的目录下面创建,这里的相对路径需要这样写,否则一直报403错误
         }

      第二个历程: 创建密码文件(文件中密码信息必须是密文的)
      htpasswd  创建一个有密文信息的密码文件
  [root@web01 conf.d]# rpm -qf `which htpasswd` 
      httpd-tools-2.4.6-89.el7.centos.x86_64
      # htpasswd -c ./htpasswd oldboy   交互式创建密码 
      # htpasswd -bc ./htpasswd oldboy 123456  免交互式创建密码
      htpasswd命令参数说明:
  -c  Create a new file.  *****
      创建一个密码文件
      -n  Don\'t update file; display results on stdout.
      不会更新文件; 显示文件内容信息
      -b  Use the password from the command line rather than prompting for it. *****
      免交互方式输入用户密码信息
      -i  Read password from stdin without verification (for script usage).
      读取密码采用标准输入方式,并不做检查 ???
      -m  Force MD5 encryption of the password (default).
      md5的加密算法
      -B  Force bcrypt encryption of the password (very secure).
      使用bcrypt对密码进行加密  
      -C  Set the computing time used for the bcrypt algorithm
          (higher is more secure but slower, default: 5, valid: 4 to 31).
  使用bcrypt algorithm对密码进行加密
      -d  Force CRYPT encryption of the password (8 chars max, insecure).
      密码加密方式
      -s  Force SHA encryption of the password (insecure).
      加密方式
      -p  Do not encrypt the password (plaintext, insecure).
      不进行加密
      -D  Delete the specified user.
      删除指定用户
      -v  Verify password for the specified user.
       认证用户密码
      修改密码文件权限: ???   # 用户访问过来之后不管你是什么用户,都会映射为nginx的管理用户
  chmod 600 ./htpasswd    # 密码文件权限最低600,以及所属组和所属用户
      chown www. ./htpasswd    # www为nginx的管理用户
  
  500 Internal Server Error
  01. 内部程序代码编写有问题
  02. 程序服务中文件权限不正确
  
  curl命令参数:
  -u, --user USER[:PASSWORD]  Server user and password
  [root@web01 password]# curl www.oldboy.com -u oldboy
      Enter host password for user \'oldboy\':
      10.0.0.7 www.oldboy.com
      [root@web01 password]# curl www.oldboy.com -u oldboy:123456
      10.0.0.7 www.oldboy.com
  

70.nginx企业用例:

0.回顾
1) 利用nginx搭建单个网站
2) 利用nginx搭建多个网站
   尽量每一个网站有单独的虚拟主机配置文件
   每一个网站有独立的站点目录
3) 利用nginx配置安全控制
       根据用户访问的域名地址  www.oldboy.com/Av  access模块 --403
       根据用户访问进行认证                       认证模块
    4) 网站服务访问方式
       基于域名访问
       基于地址访问 
    
1.nginx的企业实践应用
    1) 利用nginx服务搭建网站文件共享服务器
    第一个步骤: 编写配置文件(www.conf)
nginx模块功能: ngx_http_autoindex_module

Syntax:autoindex on | off;
    Default:
    autoindex off;
    Context:http, server, location

    server {
       listen        80;
       server_name   www.oldboy.com;
       location / {
         root  /html/www;
         auth_basic      "oldboy-sz-01";
         auth_basic_user_file password/htpasswd;
         autoindex on;    --- 开启nginx站点目录索引功能
    }
    PS: 1. 需要将首页文件进行删除  # 需要将html站点目录下的index.html该名称,否则还是会显示首页
    2. mime.types媒体资源类型文件作用
   文件中有的扩展名信息资源,   进行访问时会直接看到数据信息
   文件中没有的扩展名信息资源, 进行访问时会直接下载资源
   
网站页面目录数据,中文出现乱码,如何解决:
    location / {
       root  /html/www;
       #index index.html;
       auth_basic      "oldboy-sz-01";
       auth_basic_user_file password/htpasswd;
       autoindex on;
       charset utf-8;   --- 修改目录结构中出现的中文乱码问题
     }


    2) 利用nginx服务搭配置文件别名功能
第一个历程: 编写配置文件 
server_name   www.oldboy.com old.com;  # 访问两个域名是一样的,便于用户方法
    第二个历程: 配置好解析信息

作用:
01. 编写网站访问测试
02. 定位要访问的网站服务器


3) 利用nginx状态模块功能对网站进行监控
状态模块: ngx_http_stub_status_module
location = /basic_status {
        stub_status;
    }
    第一个历程: 编写配置文件 
    [root@web01 conf.d]# vim state.conf
    server {
       listen    80;
       server_name  state.oldboy.com
       stub_status;
    }

第二个历程: 重启nginx服务,并且编写解析文件
systemctl reload nginx 
10.0.0.7     state.oldboy.com
   
    Active connections:  激活的连接数信息  4000用户  3500
accepts: 接收的连接数汇总(综合)  TCP
handled: 处理的连接数汇总(综合)  TCP
requests: 总计的请求数量  HTTP协议请求 
    Reading: nginx服务读取请求报文的数量    100人点餐
Writing: nginx服务响应报文信息数量      100人响应
Waiting: nginx队列机制,要处理(读取或者响应保存进行保存)   监控

4) nginx日志功能配置
访问日志: /var/log/nginx/access.log    ngx_http_log_module
log_format  main  \'$remote_addr - $remote_user [$time_local] "$request" \'   定义日志内容格式
                      \'$status $body_bytes_sent "$http_referer" \'
                      \'"$http_user_agent" "$http_x_forwarded_for"\';
    access_log  /var/log/nginx/access.log  main;                                调用日志格式

$remote_addr   显示用户访问源IP地址信息
    $remote_user            显示认证的用户名信息
[$time_local]           显示访问网站时间
"$request"              请求报文的请求行信息
    $status                 用户访问网站状态码信息
$body_bytes_sent        显示响应的数据尺寸信息
$http_referer           记录调用网站资源的连接地址信息(防止用户盗链)                    
                            老男孩nginx---access.log---莫文杰(荒原饮露---老男孩图片链接)---http_referer(链接)
$http_user_agent        记录用户使用什么客户端软件进行访问页面的  (谷歌 火狐 IE 安卓 iphone)
$http_x_forwarded_for   ??? 负载均衡


错误日志: /var/log/nginx/error.log  --- Core functionality
Syntax:    error_log file [level];  指定错误日志路径以及错误日志记录的级别
    Default:error_log logs/error.log error;
    Context:main, http, mail, stream, server, location

    error_log  /var/log/nginx/error.log warn;
错误级别:
debug:调试级别, 服务运行的状态信息和错误信息详细显示     信息越多
info        :信息级别, 只显示重要的运行信息和错误信息
notice      :通知级别: 更加重要的信息进行通知说明
warn        :警告级别: 可能出现了一些错误信息,但不影响服务运行
error:错误级别: 服务运行已经出现了错误,需要进行纠正      推荐选择
crit        :严重级别: 必须进行修改调整
alert       :严重警告级别: 即警告,而且必须进行错误修改
emerg       :灾难级别: 服务已经不能正常运行                      信息越少

PS: 日志文件信息需要做切割处理   几个G

5) nginx服务location作用说明
模块说明: ngx_http_core_module
location进行匹配(uri)
错误页面优雅显示
location /oldboy {
   root /html/www;
   error_page  404  /oldboy.jpg;
}
location /oldgirl {
   root /html/www;
   error_page  404  /oldgirl.jpg;
}

location详细配置:
Syntax:location [ = | ~ | ~* | ^~ ] uri { ... }
            location @name { ... }
    Default:—
    Context:server, location
location = / {              --- 精确匹配    优先级01 最高
    [ configuration A ]
    }
    
    location / {                --- 默认匹配    优先级04 最低
        [ configuration B ]
    }
    
    location /documents/ {      --- 按照目录进行匹配    优先级03
        [ configuration C ]
    }
    
    location ^~ /images/ {      --- 优先匹配/不识别uri信息中符号信息       优先级02
        [ configuration D ]
    }
    [root@web01 /opt/nginx1-12/html/images]# tree  # 上面的^~ /images/这种类型路由,需要在images中在嵌套一个images目录才能访问到,/documents/类似
    .
    ├── 1.jpg
    ├── 2.jpg
    └── images
        ├── 1.jpg
        └── 2.jpg
     
    location ~* \.(gif|jpg|jpeg)$ {  --- 不区分大小写进行匹配  优先级03
        [ configuration E ]
    }

6) 利用nginx实现页面跳转功能
利用rewrite模块是跳转功能:  http_rewrite_module
Syntax:rewrite regex replacement [flag];   rewite  匹配的正则信息  替换成什么信息
    Default:—
    Context:server, location, if

rewrite www.oldboy.com/(.*) http://www.oldboy.com/$1 permanent;   重写规则配置
    ^/        (.*)
baidu.com    /  oldboy.html                  跳转方式

www.baidu.com/oldboy.html

跳转方式:
永久跳转:  permanent   301    会将跳转信息进项缓存
临时跳转:  redirect    302    不会缓存跳转信息

出现无限跳转如何解决:
第一种方法: 利用不同server区块配置打破循环
server {
   server_name  oldboy.com;
   rewrite ^/(.*) http://www.oldboy.com/$1 permanent;
}
第二种方法: 利用if判断实现打破循环
server {
        server_name old.com;
        if ($host ~* "^old.com$") {
              rewrite ^/(.*) http://www.oldboy.com/$1 permanent;
        }
    }

www.oldboy.com/oldboy01/oldboy02/oldboy.jpg   --- www.oldboy.com/oldboy.jpg

71.LNMP架构:

0.回顾
1) nginx服务的企业应用(nginx模块)
   a 实现网站页面目录索引功能 (yum仓库搭建)
   b 实现网站访问别名功能     server_name
   c 实现网站页面用户访问监控 keepalived_timeout 65s
   HTTP请求报文: 请求头---connection: keepalived.../closed 短连接
   HTTP响应报文: 响应头---connection: closed 短连接
   VPN---无法访问外网/xshell无法远程连接
   d 实现网站服务日志功能配置 
     错误日志: 错误日志级别 
 访问日志: 日志的格式信息 自动化分析日志(ELK 三个软件)???
   e 根据用户访问uri进行匹配处理
         location = xxx    精确匹配优先级01
     location ^~ xxx   优先匹配   优先级02
 location ~        区分大小写匹配 优先级03
 location ~*     不区分大小写优先级03
 location uri    根据uri进行匹配优先级03
 location /    默认匹配        优先级最低
 企业应用: 京东网站location应用 --- 11.11 12.12 6.18 --- 页面信息和平常不一样
 有两个站点目录:
 平常网站的站点目录   /html/jd-normal
         节日网站的站点目录   /html/jd-teshu
         location / { root /html/jd-normal }
         location /特殊 { root /html/jd-teshu }
       f 网站页面跳转功能
         rewrite  匹配地址(url uri)   跳转成什么地址(url uri)
         return   301  http://xxxx

1.内容介绍
1) LNMP架构的组成(作用)
2) LNMP架构的部署
3) LNMP架构通讯原理
4) LNMP服务之间如何建立管理
   nginx + php  运维负责
   php + mysql  开发负责
5) 运维人员代码上线 (www bbs blog)
   *6) NFS服务和web服务
       mysql服务和web服务 (企业案例:数据库迁移方法)
   补充: 企业经验总结(简历项目)
   01. 全网备份项目 (项目背景 项目实施 项目时间??)
   02. 实时同步项目
       03. 网站服务自动化 (网站服务自动化部署 网站应用自动化部署) ansible
       04. 网站LNMP环境搭建
   05. 数据库迁移项目
    
2. 网站的LNMP架构是什么:
    L   --- linux系统
    注意:  
        a selinux必须关闭  防火墙关闭
        b /tmp 1777 mysql服务无法启动

N --- nginx服务部署
作用:
处理用户的静态请求 html jpg txt mp4/avi

    P  --- php服务部署
作用:
1. 处理动态的页面请求
2. 负责和数据库建立关系

M   --- mysql服务部署 (yum会很慢 编译安装会报错) mariadb
作用:
存储用户的字符串数据信息
    
3. 网站的LNMP架构部署
    nginx服务    --- ansible一键化部署 修改yum源
mysql服务部署:
第一个历程: 安装数据库软件
yum install mariadb-server mariadb -y

补充: 数据库初始化过程 mysql_install_db
--basedir=path       The path to the MariaDB installation directory.
                     指定mysql程序目录
--datadir=path       The path to the MariaDB data directory.
                     指定数据信息保存的目录
--user=mysql         让mysql管理数据目录  700

信息输出内容:
创建数据库的密码信息:
PLEASE REMEMBER TO SET A PASSWORD FOR THE MySQL root USER !
    To do so, start the server, then issue the following commands:
    /application/mysql/bin/mysqladmin -u root          password \'new-password\'   --- 给本地数据库设置密码
    /application/mysql/bin/mysqladmin -u root -h web01 password \'new-password\'   --- 给远程数据库设置密码

第二个历程: 启动数据库服务
systemctl start mariadb.service 
systemctl enable mariadb.service

    第三个历程: 给mysql数据库服务设置密码
    mysqladmin -u root  password \'oldboy123\'    --- 设置密码  
mysql -u root -poldboy123

PHP服务部署流程:
第一个历程: 更新yum源/卸载系统自带的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

第二个历程: 安装php软件
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

第三个历程: 编写配置文件
vim /etc/php-fpm.d/www.conf
user = www   nginx---www
    group = www
PS: 保证nginx进程的管理用户和php服务进程的管理用户保持一致

第四个历程: 启动php服务
systemctl start php-fpm 
    
4.LNMP架构的原理
    用户访问网站--->nginx(fastcgi_pass) --FastCGI-->(php-fpm -- wrapper) php (php解析器) --->  mysql(读取或写入)
    
5.实现LNMP之间建立关系
    1. 实现nginx + php 建立关系
   第一个历程: 编写nginx文件
   编写nginx配置文件
   location ~ \.php$ {
                root /www;
                fastcgi_index index.php;          url               uri
                fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
                fastcgi_pass  127.0.0.1:9000;
                include fastcgi_params;   变量配置文件
       }
   重启nginx服务
   
   第二个历程: 编写动态资源文件
   [root@web01 conf.d]# cat /html/blog/test_php.php 
       <?php
       phpinfo();
       ?>

       第三个历程: 进行访问测试
   blog.oldboy.com/test_php.php
2. 实现php + mysql 建立关系 
       编写php代码文件
       [root@web01 blog]# vim test_mysql.php
       <?php
        $servername = "localhost";
        $username = "root";
        $password = "oldboy123";
        //$link_id=mysql_connect(\'主机名\',\'用户\',\'密码\');
        //mysql -u用户 -p密码 -h 主机
        $conn = mysqli_connect($servername, $username, $password);
        if ($conn) {
              echo "mysql successful by root !\n";
           }else{
              die("Connection failed: " . mysqli_connect_error());
           }
       ?>
    
6.部署搭建网站页面(代码上线)
    第一个历程: 获取代码信息(git)---使用开源的网站代码
www网站页面: http://www.dedecms.com/
bbs网站页面: http://www.discuz.net/forum.php
blog网站页面: https://cn.wordpress.org/
wecenter网站页面: http://www.wecenter.com/?copyright

第二个历程: 将代码解压,将解压后信息放入到站点目录中
tar xf wordpress-5.2.1.tar.gz
mv ...

第三个历程: 修改站点目录权限
chown -R www.www blog
   
第四个历程: 进行网站页面初始化操作
    
第五个历程: 对数据库服务进行配置
    创建数据库: create databases wordpress;  
检查: show databases;
    创建数据库管理用户: grant all on wordpress.* to \'wordpress\'@\'172.16.1.%\' identified by \'oldboy123\';
检查: select user,host from mysql.user 

第六个历程: 利用blog网站发布博文  
        
作业:
01. 上传主题提示主题比较大
    413 Request Entity Too Large  --- nginx需要添加一个指令???
    1.client_max_body_size 20M; # 加到对应的location中就可以了
    2.vim /etc/php.ini   # upload_max_filesize = 2M 这个这改为你想要的大小
02. 图片保存在服务器什么位置了,如何将图片保存在存储服务器中
03. 数据库服务安装在web服务器本地有没有问题???
04. 如何将数据库数据迁移到指定服务器中
05. 预习nginx反向代理负载均衡
06. 预习keepalived高可用服务
07. 预习zabbix监控服务  客户端配置文件 服务端配置文件

72.LNMP企业引用:

0.回顾
1) 网站服务器nginx服务概念
2) 网站服务器nginx服务部署
3) 网站服务器nginx服务配置
4) 网站服务器nginx服务应用
5) 网站LNMP架构(搭建网站页面-wordpress)
    
1.课程说明:
    1) LNMP架构和存储服务器建立关系
2) LNMP架构和数据库服务器建立关系(数据迁移)
3) nginx负载均衡概念介绍
4) nginx负载均衡环境准备
5) nginx负载均衡设置过程
6) nginx负载均衡扩展说明
7) nginx负载均衡企业应用
   a 根据用户的访问uri信息进行负载均衡(动静分离的架构)
   b 根据用户的user-agent信息进行负载均衡(手机和客户端显示不同页面)
    
2.  1) 上传wordpress主题,报413错误,如何解决?
总结:
第一个历程: 修改nginx配置文件
vim blog.conf
server {
      client_max_body_size 50m;   --- 指定用户上传数据的大小限制(默认1M)
}

    第二个历程: 修改php.ini配置文件
upload_max_filesize = 50M     --- 使PHP接收用户上传的更大的数据(默认2M)

2) 如何让LNMP架构和存储服务器建立关系
第一个历程: 找出图片存储的目录
01方法: 根据图片链接地址获取图片存储位置
http://blog.oldboy.com  /wp-content/uploads/2019/05/meinv-1024x1024.jpg
    url                               uri
    02方法: 先定位数据存放在站点目录中
find /html/blog -type f -mmin -5
inotifywait -mrq /html/blog

第二个历程: 使web服务器和存储服务器建立关系
检查存储服务是否正常
编写存储服务配置文件
[root@nfs01 ~]# showmount -e 172.16.1.31
    Export list for 172.16.1.31:
    /data/bbs  172.16.1.0/24
    /data/www  172.16.1.0/24
    /data/blog 172.16.1.0/24
mkdir /data/{bbs,blog,www}
将web服务器blog存储的数据进行迁移
mv /tmp/2019/ /html/blog/wp-content/uploads/

    默认存储服务器无法存储数据:
管理用户无法存储: root_squash  --- nfsnobody
普通用户无法存储: no_all_squash
解决:
    第一个历程: 修改nfs配置文件,定义映射用户为www
    [root@web01 /]# useradd -u 1003 -M -s /sbin/nologin www
chown -R www /data

    第二个历程: 使root用户可以上传数据
sed -ri.bak \'s#(sync)#\1,anonuid=1002,anongid=1002#g\' /etc/exports

3) 如何让LNMP架构和数据库服务器建立关系???
第一个历程: 将web服务器本地数据库数据进行备份
mysqldump -uroot -poldboy123 --all-database >/tmp/web_back.sql

    第二个历程: 将备份数据进行迁移
scp -rp /tmp/web_back.sql 172.16.1.51:/tmp

第三个历程: 恢复数据信息
yum install -y mariadb-server mariadb
    mysqladmin -u root  password \'oldboy123\'    --- 设置密码  
mysql -uroot -poldboy123 </tmp/web_back.sql
    
第四个历程: 修改数据库服务器中数据库用户信息
MariaDB [(none)]> select user,host from mysql.user;
    +-----------+-----------+
    | user      | host      |
    +-----------+-----------+
    | root      | 127.0.0.1 |
    | root      | ::1       |
    |           | localhost |
    | root      | localhost |
    | wordpress | localhost |
    |           | web01     |
    | root      | web01     |
    +-----------+-----------+
    7 rows in set (0.00 sec)

优化: 删除无用的用户信息
delete from mysql.user where user="" and host="localhost";
    delete from mysql.user where user="" and host="web01";

添加: 添加新的用户信息
grant all on wordpress.* to \'wordpress\'@\'172.16.1.%\' identified by \'oldboy123\'; # 允许内容IP连接数据库
flush privileges;  # 刷新数据

第五个历程: 修改web服务器代码文件信息
vim Services/phpqrcode/qrconfig.php 或者又的是vim system/config/database.php
/** MySQL hostname */
    define( \'DB_HOST\', \'172.16.1.51\' );

第六个历程: 停止web服务器上数据库服务
....

    问题01:
数据库服务没有正确启动: Error establishing a database connection  连接不上3306端口
问题02: 
PHP服务没有开启,报502错误

4) web01代码信息迁移到web02服务器,并且修改了网站域名无法正确访问
访问新域名会自动跳转到老的域名
方法一: 
修改wordpres后台设置信息,将后台中老的域名改为新的域名
方法二:
修改数据库中的一个表, 在表中修改一个和域名有关的条目信息 (update phpmyadmin)
    
3.  (反向代理)负载均衡的概念说明
    什么是集群?
完成相同任务或工作的一组服务器 (web01 web02 web03 -- web集群)
# 特点:高新能,价格有效性,可伸缩性,高可用
什么是负载均衡?
1) 实现用户访问请求进行调度分配
2) 实现用户访问压力分担

什么是反向代理?
反向代理: 外网 ---> (eth0外网) 代理服务器 (eth1内网) ---> 公司网站服务器web(内网)
外网用户(客户端)   ---  代理服务器 (服务端)
代理服务器(客户端) ---  web服务器(服务端)
正向代理:   内网(局域网主机)  --- (内网)代理服务器(外网) --- 互联网 --- web服务器(日本)
                                     FQ的操作

4.  准备负载均衡的环境
    集群服务器部署:
PS: 集群中每天服务器的配置一模一样
企业中: 
01. 先部署好一台LNMP服务器,上传代码信息
02. 进行访问测试
03. 批量部署多台web服务器
04. 将nginx配置文件进行分发
05. 将站点目录分发给所有主机
    
教学中:
01. 将web01作为模板主机克隆
sed -i \'s#\.7#.8#g\' /etc/sysconfig/network-scripts/ifcfg-eth[01]
hostnamectl set-hostname web02

利用手动方式实现负载均衡:  # 其实这一步中的是假的,知识数据库有web服务器分离
    修改hosts主机地址和域名映射文件 

    负载均衡服务器部署:
    第一个历程: 安装部署nginx软件
    ....

    第二个历程: 编写nginx负载服务配置文件
    ngx_http_upstream_module   --- upstream   负载均衡  OK
    ngx_http_proxy_module   --- proxy_pass 反向代理

upstream oldboy {
       server 10.0.0.7:80;
       server 10.0.0.8:80;
       server 10.0.0.9:80;
    }
    server {
        listen       80;
        server_name  www.oldboy.com;
        location / {
           proxy_pass http://oldboy;
        }
    }

第三个历程: 实现负载功能测试
搭建集群测试环境:
for name in www bbs blog;do echo "$name 10.0.0.7">/html/$name/wenwen.html;done
for name in www bbs blog;do echo "$name 10.0.0.8">/html/$name/wenwen.html;done
for name in www bbs blog;do echo "$name 10.0.0.9">/html/$name/wenwen.html;done
修改windows解析文件
10.0.0.5    www.oldboy.com  blog.oldboy.com bbs.oldboy.com

负载均衡访问网站异常排错思路:
第一步: 负载均衡 测试后端web节点服务器是否能够正常访问
[root@lb01 conf.d]# curl -H host:www.oldboy.com 10.0.0.7/wenwen.html
    www 10.0.0.7
    [root@lb01 conf.d]# curl -H host:www.oldboy.com 10.0.0.8/wenwen.html
    www 10.0.0.8
    [root@lb01 conf.d]# curl -H host:www.oldboy.com 10.0.0.9/wenwen.html
    www 10.0.0.9

第二步: 负载均衡 利用curl命令访问负载均衡服务器
查看两个配置文件

第三步: 打开一个xshell连接  ping www.oldboy.com
第四步: 配置文件编写不正确
        
5. 负载均衡配置模块详细说明
    ngx_http_upstream_module   --- upstream
实现不同调度功能
1. 轮询分配请求(平均)
2. 权重分配请求(能力越强责任越重)
   upstream oldboy {
          server 10.0.0.7:80 weight=3;
          server 10.0.0.8:80 weight=2;
          server 10.0.0.9:80 weight=1;
       }
3. 实现热备功能(备胎功能)
       upstream oldboy {
          server 10.0.0.7:80;
          server 10.0.0.8:80;
          server 10.0.0.9:80 backup;
       }
4. 定义最大失败次数                 健康检查参数
   max_fails=5    # 发送失败之后,循环方法几次之后,尝试其他服务器
5. 定义失败之后重发的间隔时间健康检查参数
   fail_timeout=10s  会给失败的服务器一次机会

实现不同调度算法
1. rr  轮询调度算法
2. wrr 权重调度算法
3. ip_hash 算法  (出现反复登录的时候)
4. least_conn  根据服务器连接数分配资源

ngx_http_proxy_module   --- proxy_pass
01. 访问不同的网站地址,不能显示不同的网站页面  (面试题)
    原因:在经过负载均衡服务器的时候,我们设置的proxy_pass http://oldboy;这个参数,会将发给web服务器的host改为http://oldboy,这个是时候,我的web服务器中虽然有三个不同的server虚拟主机,但是我找不到server_name是oldboy的主机,这个时候我就把排在最前面的虚拟主机对应的页面返回.
proxy_set_header Host $host; # 这个参数的作用就将用户发过来host替换我在负载中的host使其始终保持一致
02. 访问网站用户地址信息无法进行分析统计       (面试题)
proxy_set_header X-Forwarded-For $remote_addr;  # 在access_log日志中,不能一直记录负载均衡服务器得ip,影响我获取获取用户真实ip,设置这个参数可以获取用户真实ip地址
03. 访问负载均衡会出现错误页面,影响用户体验
proxy_next_upstream error timeout http_404 http_502 http_403;  # 如果某一台web服务器挂了,返回错误信息,这个时候跳过这个服务器,让他去访问其他的web服务器
    
补充:
    01. 总结Module ngx_http_proxy_module
    02. 总结Module ngx_http_upstream_module
    03. 高可用服务 keepalived 
        提前克隆好一台新的lb02主机 lb01+lb02 高可用集群(HA)
上一篇:ubuntu卸载程序软件
下一篇:Nginx学习笔记(四):基本数据结构-陈心朔