Linux_网络服务架构部署(LNMP)

1.LNMP架构介绍说明

LNMT: Linux nginx mysql tomcat

LNMP: Linux nginx mysql php/python

LAMP: Linux apache mysql php

作用:可以使用架构处理动态请求

 

2.LNMP架构部署安装

Linux:

1) 系统安全服务需要关闭 selinux iptables

2) 确认系统/tmp目录权限 777

nginx:

1) 安装 yum 官方源nginx

 

mysql/maridb:

1.# 下载安装数据库程序软件
yum install mariadb-server mariadb -y

2.# 启动数据库程序服务进程
systemctl start mariadb.service 
systemctl enable mariadb.service 

启动服务异常: 无法启动服务
原因: 服务配置文件不正确
\cp /usr/share/mysql/my-small.cnf /etc/my.cnf


数据库特殊的管理命令: SQL语句(库 -- 表 -- 列/行(字段-数据信息))
show databases; --- 查看所有数据库信息
use 数据库名称; --- 切换数据库
show tables; --- 查看库中所有表信息
select * from user;--- 查看表中的数据信息

数据库服务设置登录密码信息
mysqladmin -uroot password "oldboy123" --- 设置密码或者修改密码
mysql -uroot -poldboy123

 

错误原因:数据库没有启动

php:解析动态请求的服务

 PHP服务部署 http://php.net/
    # 解决yum安装软件冲突问题
    yum remove php-mysql php php-fpm php-common
    # 准备yum安装软件扩展源信息
    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源之后,新生成的文件信息:
    webtatic-archive.repo/webtatic.repo/webtatic-testing.repo
    epel.repo.rpmnew/epel-testing.repo
    
    # 利用yum安装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

    # 修改php服务进程管理用户信息(建议修改的用户和nginx worker进程用户一致)
    vim /etc/php-fpm.d/www.conf
    8 user = www
   10 group = www
    
    # 启动运行php-fpm程序

 

 

3.LNMP架构工作原理

nginx (fastcgi_pass) -接口fastcgi- (php-fpm进程) php -- php解释器 --> 数据库服务(SQL语句)
                                                                                增 删 改 查

   

 

 

 

 

4.LNMP架构配置过程

第一个历程: 建立nginx--php通讯过程
    1) 编写nginx配置
    server {
      listen        80;
      server_name   blog.oldboy.com;
      location / {
          root         /html/blog;
          index        index.php index.html;
      }
      location ~ \.php$ {
          root /html/blog;
          fastcgi_pass  127.0.0.1:9000;
          fastcgi_index index.php;
          fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
          include fastcgi_params;
      }
    }

    2) 进行动态访问测试
    vim test_phpinfo.php
    <?php
      phpinfo();
    ?>

    第二个历程: php + mariadb建立联系  编写代码信息
    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());
        }
    ?>

 

 

5.搭建动态资源网站页面

第一个历程: 下载获取动态网站代码信息
    博客网站开源代码: wordpress   --- blog.oldboy.com 
    代码下载地址: https://cn.wordpress.org/download/
    论坛网站开源代码: discuz      --- bbs.oldboy.com
    代码下载地址: https://www.discuz.net/thread-3796882-1-1.html
    官方网站开源代码: dedecms/phpcms   --- www.oldboy.com
    phpcms   http://www.phpcms.cn/html/download/phpcms/#content
    dedecms 
    知乎网站开源代码: wecenter    --- zhihu.oldboy.com    
    
    第二个历程: 将代码信息进行上传/修改代码文件权限
    chown -R www.www /html/blog/

    第三个历程: 进行网站页面初始化/和网站数据库服务建立连接
    创建数据库信息:
    create database wordpress;
    
    创建管理数据库用户信息:
    grant all on wordpress.* to 'wordpress'@'localhost'  identified by 'oldboy123';
    select user,host from mysql.user;

 5.1 博客网站如何上传数据

    方法一: 修改目录权限信息 
       chmod o+w /html/blog/wp-content
       方法二: 修改目录属主信息(php进程用户信息)
       chown apache.apache xxx
       方法三: 保证nginx程序和php程序进程用户一致
       chown nginx和php进程用户
       修改php-fpm进程用户信息
       vim /etc/php-fpm.d/www.conf
       8 user = www
       10 group = www

5.2 博客网站如何更改主题

常见错误: 上传数据达到了nginx程序最大限制
       413 Request Entity Too Large    
       如何解决: 
       client_max_body_size 10m;   --- 将指令放入到server http location区域中

       默认wordpress程序会有上传文件大小限制
       vim /etc/php.ini
       upload_max_filesize = 10M     --- 指定最大上传文件大小限制
       post_max_size = 10M           --- 请求主体最大尺寸
       max_execution_time = 300      --- 执行上传数据操作最大执行时间

 5.3 利用负载均衡访问网站页面有报错信息 静态页面排错思路

1. 域名解析问题 --> 负载均衡VIP
2.利用lb01访问后端每一个节点
 curl -v -H host:www.oldboy.com 10.0.0.9
3.检查负载均衡配置
4.检查确认后端节点 nginx.conf 扩展.conf nginx -t  eror.log

 

6.数据库数据迁移方法(三步:备份,迁移,恢复)

     分离数据库作用:
       1) 可以让数据进行统一存储
       2) 磁盘空间限制问题         
       
       分离数据库过程(迁移数据过程)
       第一个历程: 部署数据库服务器
       yum install -y mariadb mariadb-server
       systemctl start mariadb.service
       mysqladmin -uroot password 'oldboy123'
       
       第二个历程: 数据迁移过程
       1) 先进行数据备份
          mysqldump -uroot -poldboy123 -A >/tmp/mysql_backup.sql
       
       2) 将备份数据传输到新的数据库服务器中
          scp/rsync -rp /tmp/mysql_backup.sql  172.16.1.51:/tmp
          
       3) 将备份数据进行还原
          mysql -uroot -poldboy123 < /tmp/mysql_backup.sql   
       
       第三个历程: 实现网站连接新的数据库
       a 修改代码文件连接新的数据库
         vim /html/blog/wp-config.php
         32 define( 'DB_HOST', '172.16.1.51' )
       b 修改数据库用户信息, 允许内网网段地址连接
         grant all on wordpress.* to 'wordpress'@'172.16.1.%'  identified by 'oldboy123';

6.1数据库备份恢复后, root用户密码失效了?

	   mysql数据库:
	   备份数据库: 所有数据信息 -转换-> 命令信息(SQL)
	   恢复数据库: 执行SQL语句  创建库 创建表 添加没有信息
	   mysql.user: 用户信息记录表 
	   grant  授权操作 ---> 立即生效
	   insert 插入操作 ---> 不会立即生效 ---> flush privileges(刷新权限)
	   
	   恢复完数据之后 ---> flush privileges(刷新权限) --> 识别到root用户的密码信息
	   
	   第一个历程: 在web01服务器上备份数据
	   第二个历程: 将备份数据传输到51数据库服务器
	   第三个历程: 在51数据库服务器中安装mariadb服务, 恢复数据 
	   第四个历程: 空密码直接进入数据库,刷新权限 
	   第五个历程: 重新登录数据
	   mysql -uroot -poldboy123

6.2  网站数据库连接不上排错问题

      1) 检查连接数据库代码文件配置是否正确
          mysql -uwordpress -p211314 -h172.16.1.51
       2) 修改数据库用户信息
          方法一: 允许用户使用 wordpres@'web01' 连接
          grant all on wordpress.* to 'wordpress'@'web01' identified by 'oldboy123';
          方法二: 关闭数据库反向解析操作(跳过反向解析过程)    
          delete from mysql.user where user='wordpress' and host='web01'; 删除表信息
          flush privileges;
          vim /etc/my.cnf
          [mysqld]
          skip-name-resolve
          重启数据库服务 

 

7.实现图片附件数据统一存储(三步:备份 挂载 恢复 测试)

 

 如何让 web + nfs 建立关系
       第一个历程: 找出web服务器本地存储数据目录信息
                   /html/blog/wp-content/uploads
                   
       第二个历程: 将存储数据进行迁移保存
       mv /html/blog/wp-content/uploads/* /tmp/wordpress_bak/
       
       第三个历程: 确认存储服务部署完毕
       # 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
       
       useradd www -u 1003
       chown -R www.www /data/
       
       
       第四个历程: web服务器进行挂载存储服务操作
       mount -t nfs 172.16.1.31:/data/blog  /html/blog/wp-content/uploads

       第五个历程: 还原之前备份数据
       mv /tmp/wordpress_bak/* /html/blog/wp-content/uploads/

 8. 动态网站页面修改域名信息(三点: nginx服务域名信息更换 DNS服务域名解析配置 程序代码/数据库 )

第一个历程: 修改nginx配置文件信息
server_name blog.oldboy.com blog.oldgirl.com;

第二个历程: 修改代码或数据库信息

第四个历程: 编写DNS域名解析信息

第三个历程: 重启nginx程序服务

 

9.负载均衡服务概念

负载作用:

01: 对用户访问请求进行调度处理

02:减少web服务器访问压力

负载实现:

硬件方式实现:F5 A10 (厂商培训)

软件方式实现:

nginx:利用网络4层或7层实现负载均衡

Lvs : 利用网络4层功能负载

haproxy : 利用网络4层或7层功能实现负载均衡(功能配置更强大/网站页面图形界面)

10. 集群:

  对台服务器完成相同的工作(提高网站架构并发处理能力/架构伸缩性更高/架构冗余能力强/架构成本降低)

  1):部署软件程序相同

  2):部署软件配置相同

  3):部署网站代码相同

反向代理:

  可以让外网用户 -- 访问 --内网主机服务器

  外网用户--> nginx(方向代理)--发送给内网web服务器

 

正向代理:

  可以让内网主机 --访问 --外网主机服务器

内网用户访问 --代理服务器(正向代理)-->国外网站服务器

负载均衡 与 反向代理的区别

 

11. 7层 - 负载均衡部署配置过程:(负载模块  upstream   代理模块  proxy)

第一个历程: 编写配置web集群服务器    
    www.conf   
    server {
       listen            80;
       server_name       www.oldboy.com;
       root              /html/www;
       index             index.html;
       }
    }
    
    rsync -avz /etc/nginx/conf.d/www.conf  172.16.1.7:/etc/nginx/conf.d/
    rsync -avz /etc/nginx/conf.d/www.conf  172.16.1.9:/etc/nginx/conf.d/
    
    第二个历程: 编写站点目录测试文件
    web01:
    echo web01.oldboy.com >/html/www/oldboy.html
    web02:
    echo web02.oldboy.com >/html/www/oldboy.html    
    web03:
    echo web03.oldboy.com >/html/www/oldboy.html    
        
    第三个历程: 进行访问测试
    [root@oldboyedu ~]# curl -H host:www.oldboy.com  10.0.0.7/oldboy.html
    web01.oldboy.com
    [root@oldboyedu ~]# curl -H host:www.oldboy.com  10.0.0.8/oldboy.html
    web02.oldboy.com
    [root@oldboyedu ~]# curl -H host:www.oldboy.com  10.0.0.9/oldboy.html
    web03.oldboy.com

    
    第四个历程: 部署负载均衡服务
    更新yum源
    yum install -y nginx
    
    vim /etc/nginx/nginx.conf 
    upstream  设置负载均衡

    upstream oldboy {
       server   10.0.0.7:80;
       server   10.0.0.8:80;
       server   10.0.0.9:80;
    }    
    
    proxy     设置反向代理 
    
    proxy_pass  http://oldboy;
    
[root@lb01 nginx]# vim /etc/nginx/nginx.conf

worker_processes  1;
events {
    worker_connections  1024;

}
http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    upstream oldboy {             -------设置负载均衡(此配置不能放在server中)
        #least_conn;
        ip_hash;
        server 172.16.1.7:80 max_fails=3 fail_timeout=60s;
        server 172.16.1.8:80 max_fails=3 fail_timeout=60s;
        server 172.16.1.9:80 max_fails=3 fail_timeout=60s;
    }
    server {
        listen   80;
        server_name localhost;
        location / {
            root html;
            index  index.html index.htm;
            proxy_pass http://oldboy;     ---设置反向代理
            proxy_set_header Host $host;  #修改反向代理后端节点 发出请求的时候 带请求头的信息
            proxy_set_header X-Forwarded-For $remote_addr;
        }
    }
}

实现负载均衡模块的详述

分配后端节点方式方法:
    1. 根据能力进行分配用户访问请求
       weight --权重 按比例进行权重分配访问资源
       upstream oldboy {
          server   10.0.0.7:80 weight=3;
          server   10.0.0.8:80 weight=1;
          server   10.0.0.9:80 weight=2;
       }    
    
    2. 根据后端节点健康状态分配资源
       max_fails=3       --- 向有问题的节点发送请求的次数
       fail_timeout=5s   --- 指定多久以后给用问题节点再次发送请求

注意:在特大并发情况下,后端upstream出现 no live upstream 需要关闭这个 max_fails=0
3. 根据后端节点状态进行热备节点使用 upstream oldboy { server 10.0.0.7:80; server 10.0.0.8:80; server 10.0.0.9:80 backup; } 4. 根据后端节点连接数进行分配请求 least_conn 连接数少的多分配请求; upstream oldboy { least_conn; server 10.0.0.7:80; server 10.0.0.8:80; server 10.0.0.9:80; } 5. 根据用户源IP地址hash值分配请求 ip_hash; 缺陷: 负载不均 企业不使用了? (企业:session回话共享(缓存))
--- 每次IP一样访问同一个web,不设置的话在登录wordpress会无线登录
10.0.0.1 --- 100 0 - 100 web01 wordpress 10.0.0.2 --- 202 负载均衡 101 - 200 web02 wordpress 10.0.0.3 --- 300 201 - 300 web03 wordpress

实现反向代理模块的详述

 

    Syntax:        proxy_pass URL;
    Default:    —
    Context:    location, if in location, limit_except


    第一个功能配置: 经过负载均衡访问网站看到不同的页面信息
    环境准备:
    第一个历程: web01-web03服务器配置三个网站文件
    第二个历程: 配置站点目录资源
    web01
    mkdir /html/{www,bbs,blog} -p
    for name in www bbs blog; do echo "web01 $name.oldboy.com" >/html/$name/oldboy.html;done
    web02 
    mkdir /html/{www,bbs,blog} -p
    for name in www bbs blog; do echo "web02 $name.oldboy.com" >/html/$name/oldboy.html;done    
    web03
    mkdir /html/{www,bbs,blog} -p
    for name in www bbs blog; do echo "web03 $name.oldboy.com" >/html/$name/oldboy.html;done    

    proxy_set_header -- 修改请求头信息
    proxy_set_header Host  $host;

    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     localhost;
       location / {
           proxy_pass   http://oldboy;
           proxy_set_header Host  $host;
       }
    }

    第二个功能配置: 让web节点日志中显示真实用户IP地址
    proxy_set_header -- 在请求头中添加信息
    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     localhost;
       location / {
           proxy_pass   http://oldboy;
           proxy_set_header Host  $host;
           proxy_set_header X-Forwarded-For  $remote_addr;
       }
    }
         
    第三个功能配置:  根据页面显示信息进行健康检查  
    server {
       listen          80;
       server_name     localhost;
       location / {
           proxy_pass   http://oldboy;
           proxy_set_header Host  $host;
           proxy_set_header X-Forwarded-For  $remote_addr;
           proxy_next_upstream error timeout invalid_header http_404;
       }
    }
    说明: 给用户显示的页面一定是正常的页面信息
 补充: 页面出现错误代码如何进行健康检查
                  location / {
                    root   html;
                    index  index.html index.htm;
                    proxy_pass http://oldboy;
                    proxy_set_header Host $host; 
                    proxy_set_header X-Forwarded-For  $remote_addr; 
                    proxy_next_upstream   error timeout invalid_header http_403 http_502;
                }

 扩展proxy模块参数

proxy_connect_timeout 30;  --nginx代理与后端服务器连接超时时间(代理连接超时时间)

proxy_send_timeout 60;     --nginx代理等待后端服务器的响应时间
proxy_read_timeout 60;     --后端服务器数据回传给nginx代理超时时间   

 

注:nginx会把后端返回的内容先放到缓冲区中,然后再返回给客户端,边收边传,不是全部接受完再传给客户端

proxy_buffering on;        
proxy_buffer_size 32k;     --nginx代理保存用户头信息的缓冲区大小
proxy_buffers 4 128k;      --设置缓存区数量大小,nginx代理的后端服务器获取响应信息会放置到缓存区 

 

~

 

proxy_buffer_size  设置缓存区大小,默认该缓存区等于

proxy_buffers设置的大小  设置代理服务器,保存用户头信息缓冲区大小  

默认:proxy_buffer_size 4k

proxy_buffering   主要实现被代理服务器数据和客户端的请求异步   

默认:proxy_buffering on;

proxy_buffers     

默认proxy_buffers 8 4k; 具体取决于平台

proxy_busy_buffers_size   用于设置系统很忙时可以使用的proxy_buffers大小   

默认:proxy_busy_buffers_size 8K;

*********企业中配置: ********

proxy_buffering off;

proxy_buffer_size 128k;

proxy_buffers 4 256k;

proxy_busy_buffers_size 256k;

 

12. 企业实际应用过程

实现企业网站动静分离

 

 

 

 

 

 

 

准备环境:
    动态集群:     web01    uri  /dynamic   --- 显示页面 dynamic.oldboy.com 
    静态集群:     web02    uri  /static    --- 显示页面 static.oldboy.com 
    上传集群:     wen03    uri  /upload    --- 显示页面 upload.oldboy.com 
    
    web01:
mkdir /html/www/dynamic echo
dynamic.oldboy.com >/html/www/dynamic/index.html web02:
mkdir /html/www/dynamic echo
static.oldboy.com >/html/www/static/index.html web03:
mkdir /html/www/upload echo upload.oldboy.com
>/html/www/upload/index.html 负载均衡服务器配置: upstream dynamic { server 10.0.0.7:80; } upstream static { server 10.0.0.8:80; } upstream upload { server 10.0.0.9:80; } server { listen 80; server_name localhost; location /dynamic/ { proxy_pass http://dynamic; proxy_set_header Host $host; proxy_set_header X-Forwarded-For $remote_addr; proxy_next_upstream error timeout invalid_header 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 invalid_header 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 invalid_header http_404; } }

 

实现不同客户端访问显示不同页面

 

准备环境:
    iphone   iphone  web01   iphone.oldboy.com 
    chrome   chrome  web02   chrome.oldboy.com 
    default  default web03   default.oldboy.com 
    
    web01
    echo iphone.oldboy.com  > /html/bbs/index.html 
    web02 
    echo chrome.oldboy.com  > /html/bbs/index.html
    web03 
    echo default.oldboy.com > /html/bbs/index.html
    
    配置负载均衡服务器:
    location / {    
           if ($http_user_agent ~* Android) {              ---匹配请求头中的user_agent
              proxy_pass   http://iphone;
           }  
           if ($http_user_agent ~* chrome) {
              proxy_pass  http://chrome;
           }  
           proxy_pass http://default;
           proxy_set_header Host  $host;
           proxy_set_header X-Forwarded-For  $remote_addr;
           proxy_next_upstream error timeout invalid_header http_404;
       }

 

 

10.0.0.6 - - [14/Nov/2019:14:16:35 +0800] "GET /index.html HTTP/1.0" 200 18 "-" "Mozilla/5.0 (iPhone; CPU iPhone OS 10_3_1 like Mac OS X) AppleWebKit/603.1.30 (KHTML, like Gecko) Version/10.0 Mobile/14E304 Safari/602.1" "10.0.0.1"

 

 

 

posted @ 2019-11-10 13:51  堪舆先森  阅读(652)  评论(0编辑  收藏  举报