nginx3-网站架构(LNMP)/负载均衡/高可用

2020-02-12  本文已影响0人  mrwangjian

老男孩教育61期--week16--网站架构(LNMP)/负载均衡/高可用

01. 课程介绍部分:

1. LNMP架构配置过程
2. LNMP架构代码上线
3. LNMP架构优化部署
   a 数据库数据信息迁移
   b 将数据信息共享存储
4. LNMP架构安全访问  
5. LNMP网页伪静态访问  
6. 负载均衡服务(nginx)
   如何进行配置
7. 负载均衡指令模块
8. 实现架构动静分离
9. 实现不同客户端显示不同页面

02. 知识重点回顾:

1. nginx网站服务状态监控功能
2. nginx网站日志信息配置
3. nginx网站页面跳转功能      rewrite  url -- url  uri -- uri 伪静态
   四种跳转方式:  last break  redirect permanent
4. nginx网站地址匹配功能      =(匹配uri精确路径信息)     ~ ~* ^~ //  /
                              = /  = /路径/文件信息.jpg
5. nginx网站页面安全访问      HTTPS 私钥(openssl)-->csr--->CA申请   
6. 网站特殊架构LNMP架构       实现访问动态资源

03. LNMP架构配置过程

01. 配置nginx文件 (nginx--php建立连接)  
vim blog.conf
[root@web01 conf.d]# cat blog.conf 
server {
    listen       80;
    server_name  blog.oldboy.com;
    location / {
        root   /html/blog;
        index  index.php index.html index.htm;
    }
    location ~ \.php$ {
        root   /html/blog;
        fastcgi_index index.php;
        fastcgi_pass  127.0.0.1:9000;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;   --- fastcgi内置变量记录文件
    }
}

nginx -- /html/blog/test_info.php    --- /html/blog/test_info.php   --- php

fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

编写动态页面:
cd /html/blog
echo "<?php phpinfo(); ?>" > /html/blog/test_info.php

02. PHP -- mysql
<?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 oldboy !\n";
    }else{
       die("Connection failed: " . mysqli_connect_error());
    }
?>  

mysqladmin -uroot password "oldboy123"   --- 给数据库设置密码
mysql -uroot -poldboy123


03. 实现代码上线
第一个历程: 获取代码信息
第二个历程: 将代码解压放置站点目录中
第三个历程: 调整站点目录数据权限
chown -R www.www blog/    --- 属主为nginx worker进程用户
vim /etc/php-fpm.d/www.conf
user = www
group = www
第四个历程: 进行网站页面初始化配置
创建数据库:
show databases;             --- 查看数据库信息
create database wordpress;  --- 创建数据库 

创建数据管理用户:
grant all on wordpress.* to 'wordpress'@'localhost' identified by 'oldboy123';
select user,host from mysql.user;

413 Request Entity Too Large  --- 上传的数据大于程序默认大小
client_max_body_size 5m;      --- 设置请求主体最大尺寸

04. 数据库如何进行迁移

第一个历程: 备份数据库
mysqldump -uroot -poldboy123 -A >/tmp/backup.sql
第二个历程: 将数据进行传输
scp -rp /tmp/backup.sql  172.16.1.51:/tmp
第三个历程: 恢复数据
mysql -uroot -poldboy123 </tmp/backup.sql
第四个历程: 检查网站页面
grant all on wordpress.* to 'wordpress'@'172.16.1.%' identified by 'oldboy123';
修改代码文件链接指定数据库
vim blog/wp-config.php
define('DB_HOST', '172.16.1.51');

补充: 数据库密码忘记破解方法
https://www.cnblogs.com/LBeautiful/p/10552941.html
MySQL忘记密码破解密码的方法
1、打开mysql配置文件/etc/my.cnf在【mysqld】下面添加一行代码:skip-grant-tables。这行代码意思就是跳过跳过授权表,即是可以跳过密码验证直接进入数据库。
2、service mysqld restart //重启mysql数据库。假如不重启的话,不会生效。
3、mysql -uroot -p  //此时直接回车,既可以进入数据库。
   出现mysql>就说明你已经进入到mysql数据库里了。
4、进数据库后,use mysql   //选择mysql这个库,因为mysql的root密码存放在这个数据库里。
5、show tables  //查看下mysql库里有哪些表,我们需要操作的用户名密码都在user表里。
6、desc user  //查看下user表有哪些字段。
7、update user set password=password('123456') where user="root";  //用户选root,可以随便更改成任意密码,我这里设置的123456,password()是mysql密码加密的一个函数。
   有些数据要执行update user set authentication_string=password('coship') where user="root";才行
8、flush privileges;   //刷新下密码,使更改的生效。
9、exit  //退出数据库。

10、退出数据库,重新登录
mysql -uroot -p //回车输入刚刚更改的密码,就能进去了。
然后再次进入配置文件vi /etc/my.cnf 把skip-grant-tables去掉。

05. 如何实现数据共享存储

第一个历程: 确认数据本地存储位置
方式一: 复制图片地址
http://blog.oldboy.com/wp-content/uploads/2019/07/1_oldboy01-300x300.jpg
方式二: 利用命令操作
inotify + rsync --> 脚本
inotify + rsync --> sersync 实时同步
inotifywait  -mrq  /html/blog
find /html/blog/ -type f -name "oldboy02*"  -mmin -3

本地存储目录--blog
/html/blog/wp-content/uploads/   --- 存储服务挂载点 

第二个历程: 将本地存储数据进行移动备份
mv /html/blog/wp-content/uploads/*  /tmp/blog_backup/

第三个历程: 实现存储目录挂载操作
mount -t nfs 172.16.1.31:/data/blog /html/blog/wp-content/uploads

第四个历程: 还原原来数据
mv   /tmp/blog_backup/*  /html/blog/wp-content/uploads/

第五个历程: 检查测试

06. LNMP架构安全访问:

第一个历程: 创建私钥和证书信息
第二个历程: 编写配置文件  blog.conf 
# cat /etc/nginx/conf.d/blog.conf 
server {
    listen 80;
    server_name blog.oldboy.com;
    rewrite ^(.*) https://$server_name$1 redirect;
    }
server {
    listen       443 ssl;
    server_name  blog.oldboy.com;
    client_max_body_size 5m;
    ssl_certificate     /etc/nginx/server.crt;
    ssl_certificate_key /etc/nginx/server.key;
    location / {
        root   /html/blog;
        index  index.php index.html index.htm;
    }
    location ~ \.php$ {
        root   /html/blog;
        fastcgi_index index.php;
        fastcgi_pass  127.0.0.1:9000;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }
}

07. 实现blog网站伪静态配置

第一个历程: 修改网站后台设置
设置---固定链接---自定义结构
/%post_id%.html

第二个历程: 编写nginx配置文件
[root@web01 html]# cat /etc/nginx/conf.d/blog.conf 
server {
    listen 80;
    server_name blog.oldboy.com;
    rewrite ^(.*) https://$server_name$1 redirect;
    }
server {
    listen       443 ssl;
    server_name  blog.oldboy.com;
    client_max_body_size 5m;
    ssl_certificate     /etc/nginx/server.crt;
    ssl_certificate_key /etc/nginx/server.key;
    rewrite /wp-admin$ $scheme://$host$uri/ permanent;    --- 伪静态地址信息重写
    location / {
        root   /html/blog;
        index  index.php index.html index.htm;
        try_files $uri $uri/ /index.php?$args==$uri;      --- 访问伪静态页面
    }
    location ~ \.php$ {
        root   /html/blog;
        fastcgi_index index.php;
        fastcgi_pass  127.0.0.1:9000;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }
}

08. 反向代理负载均衡服务概述

集群: 一群完成相同工作的服务器   服务软件相同  配置文件信息相同
      作用: 1. 提高服务器处理能力  2. 价格有保证  3. 冗余能力
      分类: 1. 负载均衡集群--lb    2. 高可用集群  3. 高性能运算集群 (沈阳飞机 南京地质勘探)
负载均衡:
      1. 实现用户访问请求进行调度处理
      2. 实现访问压力负载分担
反向代理(中介):  lvs 负载均衡 数据转发(外包)
      用户  -- 负载均衡 --- web服务器           反向代理    外网主机  --- 互联网 --- 主机(中介) --- 内网服务器
            <--         <--
      用户  -- 正向代理 --- 网站服务器(google)  正向代理    内网主机  --- 互联网 --- 主机(中介) --- 外网服务器   翻墙

09. 反向代理负载均衡配置过程

环境准备
lb01   负载均衡服务器    10.0.0.5
web01  web集群服务器     10.0.0.7
web02  web集群服务器     10.0.0.8 
web03  web集群服务器     10.0.0.9

第一个历程: web服务器进行环境配置
配置文件内容: www.conf    
server {
    listen       80;
    server_name  www.oldboy.com;
    location / {
       root /html/www/;
       index index.html;
    }
}
#web01 
mkdir /html/www/ -p
echo "web01 www.oldboy.com" >/html/www/oldboy.html
#web02 
mkdir /html/www/ -p
echo "web02 www.oldboy.com" >/html/www/oldboy.html  
#web03
mkdir /html/www/ -p
echo "web02 www.oldboy.com" >/html/www/oldboy.html      

第二个历程: 在负载均衡服务器上进行测试
[root@lb01 ~]# curl -H host:www.oldboy.com  10.0.0.7/oldboy.html
web01 www.oldboy.com
[root@lb01 ~]# curl -H host:www.oldboy.com  10.0.0.8/oldboy.html
web02 www.oldboy.com
[root@lb01 ~]# curl -H host:www.oldboy.com  10.0.0.9/oldboy.html
web03 www.oldboy.com

第三个历程: 负载均衡配置部署
upstream     --- 负载均衡模块
proxy_pass   --- 反向代理模块

[root@lb01 nginx]# cat nginx.conf
user  www;
worker_processes  2;
error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;
events {
    worker_connections  1024;
}
http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;
    keepalive_timeout  0;
    upstream oldboy {              --- 定义可以进行负载的web节点信息           
        server  10.0.0.7:80;            
        server  10.0.0.8:80;            
        server  10.0.0.9:80;            
    } 
    server {
       listen         80;
       server_name    localhost;
       location / {
        proxy_pass http://oldboy;  --- 反向代理将请求发送给指定集群
       }
    }
}

第四个历程: 进行访问测试
DNS解析
10.0.0.5  www.oldboy.com

10. 负载均衡模块详细说明: upstream 负载均衡模块

Syntax:     upstream name { ... }
Default:    —
Context:    http

upstream backend {
   server backend1.example.com weight=5;
   server 127.0.0.1:8080       max_fails=3 fail_timeout=30s;
   server unix:/tmp/backend3;
   
   server backup1.example.com  backup;
}

upstream模块功能参数:
1) weight:   权重参数
   可以实现权重轮训分配资源, 默认是轮训分配资源
   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;
   }
   
2) least_conn: 按照节点连接数分配资源
   upstream oldboy {
    least_conn;
    server  10.0.0.7:80;
    server  10.0.0.8:80;
    server  10.0.0.9:80;
   }

3) ip_hash: 确保一个用户多次访问, 负载均衡都会分配给相同web节点 了解
   用户01(100人):   10.0.0.1    ---  001     web01 
   用户02:          11.0.0.1    ---  011     web02 
   用户03:          12.0.0.1    ---  112     web03 
   
   000 ~ 150 
   000 ~ 050   -->  web01   100
   051 ~ 100   -->  web02
   101 ~ 150   -->  web03
   负载不均情况
   
   优选:
   用户01              --> web01(缓存客户端 memcache-php)   用户01登录信息
   用户02    ---> lb01 --> web02(缓存客户端 memcache-php)   用户02登录信息  -->  缓存服务器 memcached (会话记录)
   用户03              --> web03(缓存客户端 memcache-php)   用户03登录信息       session会话共享服务器

   upstream oldboy {
    ip_hash;
    server  10.0.0.7:80;
    server  10.0.0.8:80;
    server  10.0.0.9:80;
   }

4) 负载均衡节点健康检查
   max_fails=3        --- 最大的失败次数   lb01  --- http请求 --- web02
   fail_timeout=30s   --- 失败超时时间
   
   请求   ---  web01  1次失败  2次失败  3次失败   1次失败  30s 
   请求   ---  web02  1次成功
    upstream oldboy {
       server  10.0.0.7:80 max_fails=10 fail_timeout=60s;
       server  10.0.0.8:80;
       server  10.0.0.9:80;
    }
5) 节点备份功能
    upstream oldboy {
      server  10.0.0.7:80;
      server  10.0.0.8:80;
      server  10.0.0.9:80 backup;
    } 

11. 反向代理模块详细说明: proxy 反向代理模块

proxy_pass:       反向代理指令
proxy_set_header: 设置请求头信息  
01. 访问负载均衡可以显示不同网站页面
proxy_set_header Host $host;
02. 使网站节点日志可以记录真实IP地址
proxy_set_header X-Forwarded-For $remote_addr;
03. 检查网站页面是否正确
proxy_next_upstream error timeout http_404;
location / {
    proxy_pass http://oldboy;
    proxy_set_header Host $host;
    proxy_set_header X-Forwarded-For $remote_addr;
    proxy_next_upstream error timeout http_404;
}

12. 反向代理负载均衡企业应用

1) 网站服务动静分离
上传集群   upload   10.0.0.7 web01  uri==upload  index.html  upload page 
静态集群   static   10.0.0.8 web02  uri==static  index.html  static page 
默认集群   default  10.0.0.9 web03  uri          index.html  default page 

第一个历程: 部署web集群服务
#web01:
mkdir /html/www/upload/
echo "upload page" >/html/www/upload/index.html
#web02
mkdir /html/www/static/
echo "static page" >/html/www/static/index.html
#web03
echo "default page" >/html/www/index.html

第二个历程: 编写负载均衡配置
[root@lb01 nginx]# cat nginx.conf
user  www;
worker_processes  2;
error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;
events {
    worker_connections  1024;
}
http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;
    keepalive_timeout  0;
    upstream upload {
        server  10.0.0.7:80;
    }  
    upstream static {
        server  10.0.0.8:80;
    }  
    upstream default {
        server  10.0.0.9:80;
    }  
    server {
       listen         80;
       server_name    localhost;
       location / {
          proxy_pass http://default;
          proxy_set_header Host $host;
          proxy_set_header X-Forwarded-For $remote_addr;
          proxy_next_upstream error timeout http_404;
       }
       location /upload/ {
          proxy_pass http://upload;
          proxy_set_header Host $host;
          proxy_set_header X-Forwarded-For $remote_addr;
          proxy_next_upstream error timeout http_404;
       }
       location /static/ {
          proxy_pass http://static;
          proxy_set_header Host $host;
          proxy_set_header X-Forwarded-For $remote_addr;
          proxy_next_upstream error timeout http_404;
       }
    }
}


2) 网站服务根据客户端显示不同页面
   iphone   -->  wap集群      web01    index.html   iphone page 
   Chrome   -->  web集群      web02    index.html   chrome page 
   other    -->  default 集群 web03    index.html   default page     

第一个历程: 部署web集群服务
web01:
echo iphone page > /html/www/index.html
web02:
echo chrome page > /html/www/index.html
web03:
echo "default page" >/html/www/index.html
   
第二个历程: 修改负载均衡配置文件
[root@lb01 nginx]# cat nginx.conf
user  www;
worker_processes  2;
error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;
events {
    worker_connections  1024;
}
http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;
    keepalive_timeout  0;
    upstream iphone {
        server  10.0.0.7:80;
    }  
    upstream chrome {
        server  10.0.0.8:80;
    }  
    upstream default {
        server  10.0.0.9:80;
    }  
    server {
       listen         80;
       server_name    localhost;
       location / {
          proxy_pass http://default;
          proxy_set_header Host $host;
          proxy_set_header X-Forwarded-For $remote_addr;
          proxy_next_upstream error timeout http_404;
          if ($http_user_agent ~* iphone) {
              proxy_pass http://iphone;
          }
          if ($http_user_agent ~* Chrome) {
             proxy_pass http://chrome;
          }
       }
    }
}

13. 课程知识总结

1. LNMP架构部署配置: 
   a nginx-php建立关系
   b php-mysql建立关系 代码
2. LNMP架构代码上线 
   a 下载代码文件, 上传到站点目录
   b 对代码数据信息进行授权
   c 进行网站页面初始化 
   d 创建网站数据 登录数据库用户/密码
3. 数据库迁移过程
4. 数据共享存储   
   01. 本地存储目录信息
   02. 和存储目录进行挂载
5. 网站页面安全访问 HTTPS 
6. 网站页面伪静态配置     开发人员配合
7. 网站负载均衡功能       集群  负载均衡  反向代理 
8. 负载均衡服务部署  lvs haproxy
   upstream   负载均衡模块  详细说明
   proxy      反向代理模块  详细说明  
9. 负载均衡服务企业应用
   a 企业架构动静分离
   b 根据用户客户端显示不同页面

作业:

  1. 部署好LNMP架构 部署好负载均衡
    访问wordpress --- 负载均衡(https信息) --- web01/web02/web03 服务端口80
    http访问 --- https访问
  2. 如何部署www网站 bbs网站 zhihu网站
  3. 高可用服务 zabbix/防火墙
上一篇下一篇

猜你喜欢

热点阅读