第三章·Nginx实现基础Web架构

2022-09-26 14:34:41 浏览数 (1)

  • LNMP架构概述
  • LNMP架构环境部署
  • LNMP架构环境配置
  • 部署博客产WordPress
  • 部署知乎产品Wecenter
  • 拆分数据库至独立服务器
  • 扩展多台相同的Web服务器
  • 拆分静态资源至独立服务器

-曾老湿, 江湖人称曾老大。


-多年互联网运维工作经验,曾负责过大规模集群架构自动化运维管理工作。 -擅长Web集群架构与自动化运维,曾负责国内某大型金融公司运维工作。 -devops项目经理兼DBA。 -开发过一套自动化运维平台(功能如下): 1)整合了各个公有云API,自主创建云主机。 2)ELK自动化收集日志功能。 3)Saltstack自动化运维统一配置管理工具。 4)Git、Jenkins自动化代码上线及自动化测试平台。 5)堡垒机,连接Linux、Windows平台及日志审计。 6)SQL执行及审批流程。 7)慢查询日志分析web界面。


LNMP架构概述

什么是LNMP

LNMP是一套技术的组合,L=Linux、N=Nginx、M~=MySQL、P~=PHP


LNMP架构是如何工作的

首先Nginx服务是不能处理动态请求,那么当用户发起动态请求时, Nginx又是如何进行处理的。

当用户发起http请求,请求会被Nginx处理,如果是静态资源请求Nginx则直接返回,如果是动态请求Nginx则通过fastcgi协议转交给后端的PHP程序处理,具体如下图所示


Nginx与Fast-CGO详细工作流程

1.用户通过http协议发起请求,请求会先抵达LNMP架构中的Nginx

2.Nginx会根据用户的请求进行判断,这个判断是有Location进行完成

3.判断用户请求的是静态页面,Nginx直接进行处理

4.判断用户请求的是动态页面,Nginx会将该请求交给fastcgi协议下发

5.fastgi会将请求交给php-fpm管理进程, php-fpm管理进程接收到后会调用具体的工作进程warrap

6.warrap进程会调用php程序进行解析,如果只是解析代码php直接返回

7.如果有查询数据库操作,则由php连接数据库(用户 密码 IP)发起查询的操作

8.最终数据由*mysql->php->php-fpm->fastcgi->nginx->http->user

LNMP架构环境部署

使用官方仓库安装Nginx

代码语言:javascript复制
[root@nginx ~]# cat /etc/yum.repos.d/nginx.repo 
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/7/$basearch/
gpgcheck=0
enabled=1
 
#安装Nginx
[root@nginx ~]# yum install nginx -y

修改nginx用户

代码语言:javascript复制
[root@nginx ~]# groupadd www -g 666
[root@nginx ~]# useradd www -u 666 -g 666 -s /sbin/nologin  -M

#修改nginx配置文件
[root@nginx ~]# sed -i '/^user/c user www;' /etc/nginx/nginx.conf

启动Nginx加入开机自启

代码语言:javascript复制
[root@nginx ~]# systemctl start nginx
[root@nginx ~]# systemctl enable nginx

使用第三方扩展源安装php7.1

代码语言:javascript复制
# 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

[root@nginx ~]# yum remove php-mysql-5.4 php php-fpm php-common

#配置第三方源
[root@nginx ~]# vim /etc/yum.repos.d/php.repo
[php-webtatic]
name = PHP Repository
baseurl = http://us-east.repo.webtatic.com/yum/el7/x86_64/
gpgcheck = 0

[root@nginx ~]# yum -y install 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-fpm用户与Nginx的运行用户保持一致

代码语言:javascript复制
[root@nginx ~]# sed -i '/^user/c user = www' /etc/php-fpm.d/www.conf 
[root@nginx ~]# sed -i '/^group/c group = www' /etc/php-fpm.d/www.conf

启动php-fpm加入开机自启

代码语言:javascript复制
[root@nginx ~]# systemctl start php-fpm
[root@nginx ~]# systemctl enable php-fpm

安装Mariadb数据库

代码语言:javascript复制
[root@nginx ~]# yum install mariadb-server -y

启动Mariadb加入开机自动

代码语言:javascript复制
[root@nginx ~]# systemctl start mariadb
[root@nginx ~]# systemctl enable mariadb

给Mariadb配置登陆密码

代码语言:javascript复制
[root@nginx ~]# mysqladmin password 'Zls123.com'
[root@nginx ~]# mysql -uroot -pZls123.com

LNMP架构环境配置

在将Nginx与PHP集成过程中,需要先了解Fastcgi代理配置语法

1.设置fastcgi服务器的地址,该地址可以指定为域名或IP地址,以及端口

代码语言:javascript复制
Syntax: fastcgi_pass address;
Default: —
Context: location, if in location
 
#语法示例
fastcgi_pass localhost:9000;
fastcgi_pass unix:/tmp/fastcgi.socket;

2.设置fastcgi默认的首页文件,需要结合fastcgi_param一起设置

代码语言:javascript复制
Syntax: fastcgi_index name;
Default: —
Context: http, server, location

3.通过fastcgi_param设置变量,并将设置的变量传递到后端的fastcgi服务器

代码语言:javascript复制
Syntax: fastcgi_param parameter value [if_not_empty];
Default: —
Context: http, server, location
 
#语法示例
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /code$fastcgi_script_name;

4.通过图形方式展示fastcgi_indexfastcgi_param作用

5.最终Nginx连接Fastcgi服务器配置如下

代码语言:javascript复制
[root@nginx ~]# cat /etc/nginx/conf.d/php.conf 
server {
        listen 80;
        server_name php.driverzeng.com;

        location / {
                root /code;
                index index.php index.html;
        }

        location ~ .php$ {
                root /code;
                fastcgi_pass 127.0.0.1:9000;
                fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name
        }
}

6.在/code目录下创建info.php文件,测试能否通过浏览器访问,访问成功如下图

代码语言:javascript复制
[root@nginx ~]# cat /code/info.php
<?php
        phpinfo();
?>

按照刚才的配置,页面打开一片空白。

代码语言:javascript复制
[root@nginx ~]# cat /etc/nginx/conf.d/php.conf 
server {
        listen 80;
        server_name php.driverzeng.com;

        location / {
                root /code;
                index index.php index.html;
        }

        location ~ .php$ {
                root /code;
                fastcgi_pass 127.0.0.1:9000;
                fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
                include fastcgi_params;
        }
}

7.在/code目录下创建mysqli.php文件,填入对应的数据库IP、用户名、密码

代码语言:javascript复制
[root@nginx ~]# cat /code/mysqli.php
<?php
    $servername = "localhost";
    $username = "root";
    $password = "Zls123.com";

    // 创建连接
    $conn = mysqli_connect($servername, $username, $password);

    // 检测连接
    if (!$conn) {
        die("Connection failed: " . mysqli_connect_error());
    }
    echo "小哥哥,php可以连接MySQL...";
?>

<img style='width:100%;height:100%;' src=https://blog.driverzeng.com/zenglaoshi/php_mysql.png>

部署博客产WordPress

1)配置Nginx虚拟主机站点,域名为blog.driverzeng.com

代码语言:javascript复制
#1.nginx具体配置信息
[root@nginx ~]# cat /etc/nginx/conf.d/wordpress.conf
server {
    listen 80;
    server_name blog.driverzeng.com;
    root /code/wordpress;
    index index.php index.html;
 
    location ~ .php$ {
        root /code/wordpress;
        fastcgi_pass   127.0.0.1:9000;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }
}

2)重启nginx服务

代码语言:javascript复制
[root@nginx ~]# systemctl restart nginx

3)获取wordpress产品,解压并部署wordress

代码语言:javascript复制
[root@nginx ~]# mkdir /code
[root@nginx ~]# cd /code
[root@nginx code]# wget https://cn.wordpress.org/wordpress-5.0.3-zh_CN.tar.gz
#永远下载最新版
[root@nginx code]# wget https://cn.wordpress.org/latest-zh_CN.tar.gz
[root@nginx ~]# tar xf wordpress-5.0.3-zh_CN.tar.gz
[root@nginx ~]# chown -R www.www /code/wordpress/

4)由于wordpress产品需要依赖数据库,所以需要手动建立数据库

代码语言:javascript复制
[root@nginx ~]# mysql -uroot -pZls123.com
mysql> create database wordpress;
mysql> exit

5)通过浏览器访问wordpress,并部署该产品


思考问题:上传文件报错413,如何解决? 提示:nginx上传大小的限制


部署知乎产品Wecenter

1.配置Nginx虚拟主机站点,域名为zh.driverzeng.com

代码语言:javascript复制
#1.nginx具体配置信息
[root@http-server ~]# cat /etc/nginx/conf.d/zh.conf
server {
    listen 80;
    server_name zh.driverzeng.com;
    root /code/zh;
    index index.php index.html;
 
        location ~ .php$ {
        root /code/zh;
                fastcgi_pass   127.0.0.1:9000;
                fastcgi_index  index.php;
                fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
                include        fastcgi_params;
        }
}
 
 
#2.重启nginx服务
[root@http-server ~]# systemctl restart nginx

2.下载Wecenter产品,部署Wecenter并授权

官方下载地址:TP

代码语言:javascript复制
[root@web02 ~]# wget http://ahdx.down.chinaz.com/201605/WeCenter_v3.2.1.zip
[root@web02 ~]# unzip WeCenter_3-2-1.zip
[root@web02 ~]# mv WeCenter_3-2-1/ /code/zh
[root@web02 ~]# chown -R www.www /code/zh/

3.由于wecenter产品需要依赖数据库, 所以需要手动建立数据库

代码语言:javascript复制
#1.登陆数据库
[root@http-server ~]# mysql -uroot -pZls123.com
 
#2.创建wordpress数据库
MariaDB [(none)]> create database zh;
MariaDB [(none)]> exit

3.通过浏览器访问网站

http://zh.driverzeng.com/install/

当然除了这些产品,还有很多我们可以尝试着搭建的: phpmyadmin zblog discuz edusoho

拆分数据库至独立服务器

为什么要进行数据库的拆分

由于单台服务器运行LNMP架构会导致网站访问缓慢,当内存被占满时,很容易导致系统出现oom从而kill屌MySQL数据库,所以要将web和数据库进行独立部署。


数据库拆分后解决了什么问题

1.缓解web网站的压力 2.增强数据库读写性能 3.提高用户访问速度


数据库拆分架构演变过程,如下图所示


数据库拆分

主机名称

应用环境

外网地址

内网地址

web01

nginx php

10.0.0.7

172.16.1.7

db01

mysql

10.0.0.51

172.16.1.51


数据库拆分

1.web01网站服务器操作如下

1)备份web01上的数据库,Zls123.com是数据库密码

代码语言:javascript复制
[root@web01 ~]# mysqldump -uroot -p'Zls123.com' -A > mysql-all.sql

2)将web01上备份的数据库拷贝至db01服务器上

代码语言:javascript复制
[root@web01 ~]# scp mysql-all.sql  root@172.16.1.51:/tmp

2.db01数据库服务器操作如下

1)将web01服务器上推送的数据库备份文件恢复至db01服务器新数据库中

代码语言:javascript复制
[root@db01 ~]# yum install mariadb mariadb-server -y
[root@db01 ~]# systemctl start mariadb
[root@db01 ~]# systemctl enable mariadb
[root@db01 ~]# mysql -uroot -p'Zls123.com' < /tmp/mysql-all.sql

2)数据库导入完成后,重启数据库,使用新密码进行登录,并检查数据库已被导入成功

代码语言:javascript复制
[root@db01 ~]# systemctl restart mariadb
[root@db01 ~]# mysql -uroot -pZls123.com
mysql> show databases;

3)在新数据库上授权,允许所有网段,通过all账户连接并操作该数据库

代码语言:javascript复制
#授权所有权限   grant all privileges
#授权所有库所有表 *.* 
#将授权赋予给哪个用户,这个用户只能通过哪个网段过来(%所有) 'all'@'%'
#授权该用户登录的密码 identified by
 
mysql> grant all on  *.* to zls@'%' identified by 'Zls123.com';
Query OK, 0 rows affected (0.00 sec)
 
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)

3.web01修改代码连接新数据库环境

1)修改WordPress产品代码连接数据库的配置文件

代码语言:javascript复制
[root@web01 ~]# vim /code/wordpress/wp-config.php
# 数据库名称
define('DB_NAME', 'wordpress');
# 数据库用户
define('DB_USER', 'zls');
# 数据库密码
define('DB_PASSWORD', 'Zls123.com');
# 数据库地址
define('DB_HOST', '172.16.1.51');

2)修改wecenter产品代码连接数据库的配置文件

代码语言:javascript复制
[root@web01 zh]#  grep -iR "Zls123.com"|grep -v cache
system/config/database.php:  'password' => 'Zls123.com',
[root@web01 zh]# vim /code/zh/system/config/database.php
'host' => '172.16.1.51',
'username' => 'zls',
'password' => 'Zls123.com',
'dbname' => 'zh',

3)最后访问网站,成功打开,至此拆分数据库完成

扩展多台相同的Web服务器

为什么要扩展多台web节点

单台web服务器能抗住的访问量是有限的,配置多台web服务器能提升更高的访问速度。


扩展多台web解决了什么问题

1.单台web节点如果故障,会导致业务down机

2.多台web节点能保证业务的持续稳定,扩展性高

3.多台web节点能有效的提升用户访问网站的速度

3.多台web节点技术架构组成,如下图所示


扩展web环境

主机名称

应用环境

外网地址

内网地址

web01

nginx php

10.0.0.7

172.16.1.7

web02

nginx php

10.0.0.8

172.16.1.8

db01

mysql

10.0.0.51

172.16.1.51


快速扩展一台web节点详细步骤

通过web01现有环境快速的扩展一台web02的服务器,数据库统一使用db01

1)创建www用户

代码语言:javascript复制
[root@web02 ~]# groupadd -g666 www
[root@web02 ~]# useradd -u666 -g666 www

2)安装LNP

代码语言:javascript复制
[root@web02 ~]# scp -rp root@172.16.1.7:/etc/yum.repos.d/* /etc/yum.repos.d/
[root@web02 ~]# scp -rp root@172.16.1.7:/etc/pki/rpm-gpg/* /etc/pki/rpm-gpg/
 
[root@web02 ~]# yum install nginx -y
[root@web02 ~]# yum -y install 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

3)将web01的nginx配置文件导入到web02

代码语言:javascript复制
[root@web02 ~]# scp -rp root@172.16.1.7:/etc/nginx /etc/

4)将web01的php配置文件导入到web02

代码语言:javascript复制
[root@web02 ~]# scp -rp root@172.16.1.7:/etc/php-fpm.d /etc/

5)将web01的产品代码打包传输到web02服务器上,在web01上线进行打包操作

代码语言:javascript复制
[root@web01 ~]# tar czf code.tar.gz /code
[root@web01 ~]# scp code.tar.gz root@172.16.1.8:/tmp
 
#在web02服务器上进行解压
[root@web02 ~]# tar xf /tmp/code.tar.gz -C /

6)最后启动nginx与php-fpm,并加入开机自启

代码语言:javascript复制
[root@web02 ~]# systemctl start nginx php-fpm 
[root@web02 ~]# systemctl enable nginx php-fpm

拆分静态资源至独立服务器

为什么拆分静态资源至独立存储服务器

当后端的web节点出现多台时,会导致用户上传的图片、视频附件等内容仅上传至一台web服务器,那么其他的web服务器则无法访问到该图片。


新增一台nfs存储解决了什么问题

1.保证了多台web节点静态资源一致。

2.有效节省多台web节点的存储空间。

3.统一管理静态资源,便于后期推送至CDN进行静态资源加速


多台web节点技术架构组成,如下图所示


环境准备

主机名称

应用环境

外网地址

内网地址

web01

nginx php

10.0.0.7

172.16.1.7

web02

nginx php

10.0.0.8

172.16.1.8

nfs

nfs

10.0.0.31

172.16.1.31

db01

mysql

10.0.0.51

172.16.1.51


nfs服务端,操作步骤如下

1) 安装并配置nfs

代码语言:javascript复制
[root@nfs ~]# yum install nfs-utils -y
[root@nfs ~]# cat /etc/exports
/data/blog 172.16.1.0/24(rw,sync,all_squash,anonuid=666,anongid=666)
/data/zh 172.16.1.0/24(rw,sync,all_squash,anonuid=666,anongid=666)

2) 创建共享目录,并进行授权

代码语言:javascript复制
[root@nfs01 ~]# mkdir /data/{blog,zh} -p
[root@nfs01 ~]# chown -R www.www /data/

3) 启动nfs服务,并加入开机自启

代码语言:javascript复制
[root@nfs01 ~]# systemctl restart nfs-server

web01端操作步骤如下

1) web01节点安装nfs,然后使用showmount查看服务端共享的资源

代码语言:javascript复制
[root@web01 ~]# yum install nfs-utils -y
[root@web01 ~]# showmount -e 172.16.1.31
Export list for 172.16.1.31:
/data/zh   172.16.1.0/24
/data/blog 172.16.1.0/24

2) 如何查找Wordpress静态资源存放的位置

代码语言:javascript复制
浏览器->右键->检查->Network->选择左上角的Select按钮->点击对应的图片,然后能获取到对应的url地址,如下
# http://blog.oldboy.com/wp-content/uploads/2018/11/timg.gif

3) 备份web01服务器上Wordpress的静态资源,因为该服务器上的资源资源最全

代码语言:javascript复制
[root@web01 ~]# cd /code/wordpress/wp-content
[root@web01 wp-content]# cp uploads/ uploads_bak/

4) web01客户端执行挂载操作

代码语言:javascript复制
[root@web01 wp-content]# mount -t nfs 172.16.1.31:/data/blog /code/wordpress/wp-content/uploads/
 
#恢复对应的数据
[root@web01 wp-content]# cp -rp uploads_bak/* uploads/

5) 将挂载信息加入开机自启

代码语言:javascript复制
[root@web01 wp-content]# tail -1 /etc/fstab 
172.16.1.31:/data/blog  /code/wordpress/wp-content/uploads nfs defaults 0 0
[root@web01 wp-content]# mount -a

web02端操作步骤如下

1) web02客户端直接挂载nfs即可

代码语言:javascript复制
[root@web02 ~]# mount -t nfs 172.16.1.31:/data/blog /code/wordpress/wp-content/uploads/

2) 将挂载信息加入开机自启

代码语言:javascript复制
[root@web02 ~]# tail -1 /etc/fstab 
172.16.1.31:/data/blog  /code/wordpress/wp-content/uploads nfs defaults 0 0
[root@web02 ~]# mount –a

0 人点赞