Nginx专栏—04.Nginx搭建流行架构

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介: 1.LNMP架构概述
+关注继续查看

1.LNMP架构概述

1.什么是LNMP

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

2.LNMP架构是如何工作的

首先Nginx服务是不能处理动态请求,那么当用户发起动态请求时, Nginx又是如何进行处理的。
当用户发起http请求,请求会被Nginx处理,如果是静态资源请求Nginx则直接返回,如果是动态请求Nginx则通过fastcgi协议转交给后端的PHP程序处理,具体如下图所示

image.png

3.Nginx与Fast-CGI详细工作流程如下图所示

image.png

1.用户通过http协议发起请求,请求会先抵达LNMP架构中的Nginx
2.Nginx会根据用户的请求进行Location规则匹配
3.Location如果匹配到请求是静态,则由Nginx读取本地直接返回
4.Location如果匹配到请求是动态,则由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

2.LNMP架构环境部署

1) 使用官方仓库安装Nginx

[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

2) 配置Nginx进程运行用户

[root@nginx ~]# groupadd -g666 www
[root@nginx ~]# useradd -u666 -g666 www
[root@nginx ~]# sed -i '/^user/c user  www;' /etc/nginx/nginx.conf

3) 启动Nginx,并将Nginx加入开机自启

[root@nginx ~]# systemctl start nginx
[root@nginx ~]# systemctl enable nginx

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

#不要安装如下rpm会导致失败
# 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 ~]# cat /etc/yum.repos.d/php.repo
[webtatic-php]
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

5) 配置php-fpm用户与Nginx的运行用户保持一致

[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

6) 启动php-fpm,并将其加入开机自启

[root@nginx ~]# systemctl start php-fpm
[root@nginx ~]# systemctl enable php-fpm

7) 安装Mariadb数据库

[root@nginx ~]# yum install mariadb-server mariadb -y

8) 启动Mariadb数据库, 并加入开机自动

[root@nginx ~]# systemctl start mariadb
[root@nginx ~]# systemctl enable mariadb

9) 给Mariadb配置登陆密码,并是新密码进行登录数据库

[root@nginx ~]# mysqladmin password 'Bgx123.com'
[root@nginx ~]# mysql -uroot -pBgx123.com

2.LNMP架构环境配置

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

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

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

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

Syntax: fastcgi_index name;
Default: —
Context: http, server, location

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

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_index与fastcgi_param作用

image.png

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

[root@nginx ~]# cat /etc/nginx/conf.d/php.conf 
server {
        server_name php.oldboy.com;
        listen 80;
        root /code;
        index index.php index.html;
        location ~ \.php$ {
            root /code;
            fastcgi_pass   127.0.0.1:9000;
            fastcgi_index  index.php;
            fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
            include        fastcgi_params;
        }
}

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

[root@nginx ~]# cat /code/info.php
<?php
        phpinfo();
?>

image.png

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

[root@nginx ~]# cat /code/mysqli.php
       <?php
        $servername = "localhost";
        $username = "root";
        $password = "Bgx123.com";
        // 创建连接
        $conn = mysqli_connect($servername, $username, $password);
        // 检测连接
        if (!$conn) {
            die("Connection failed: " . mysqli_connect_error());
        }
        echo "php连接MySQL数据库成功";
        ?>

8 最后通过浏览器访问/mysqli.php文件,如成功访问如下图

image.png

4.部署博客产品Wordpress

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

#1.nginx具体配置信息
[root@nginx ~]# cat /etc/nginx/conf.d/wordpress.conf
server {
    listen 80;
    server_name blog.bgx.com;
    root /code/wordpress;
    index index.php index.html;
    location ~ \.php$ {
        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@nginx ~]# systemctl restart nginx


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

[root@nginx ~]# mkdir /code
[root@nginx ~]# cd /code
[root@nginx code]# wget https://cn.wordpress.org/wordpress-4.9.4-zh_CN.tar.gz
[root@nginx ~]# tar xf wordpress-4.9.4-zh_CN.tar.gz
[root@nginx ~]# chown -R www.www /code/wordpress/

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

[root@nginx ~]# mysql -uroot -pBgx123.com
mysql> create database wordpress;
mysql> exit

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

image.png

image.png

image.png

image.png

image.png

image.png

image.png

5.部署知乎产品Wecenter

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

[root@http-server ~]# cat /etc/nginx/conf.d/zh.conf
server {
    listen 80;
    server_name zh.bgx.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;
    }
}
#重启nginx服务
[root@http-server ~]# systemctl restart nginx

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

[root@web02 ~]# wget http://ahdx.down.chinaz.com/201605/WeCenter_v3.2.1.zip
[root@web02 ~]# unzip WeCenter_v3.1.9.zip 
[root@web02 ~]# mv UPLOAD/ /code/zh
[root@web02 ~]# chown -R www.www /code/zh/

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

[root@http-server ~]# mysql -uroot -pBgx123.com  #登陆数据库
MariaDB [(none)]> create database zh;   #创建zh数据库
MariaDB [(none)]> exit

3.通过浏览器访问网站

image.png

image.png

image.png

image.png

image.png

7.拆分数据库至至独立服务器

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

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

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

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

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

image


4.数据库拆分环境规划

image.png

5.数据库拆分架构详细步骤

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

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

[root@web01 ~]# mysqldump -uroot -p'Bgx123.com' --all-databases --single-transaction > mysql-all.sql

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

[root@web01 ~]# scp mysql-all.sql  root@172.16.1.51:/tmp

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

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

[root@db01 ~]# yum install mariadb mariadb-server -y
[root@db01 ~]# systemctl start mariadb
[root@db01 ~]# systemctl enable mariadb
[root@db01 ~]# mysql -uroot -p'Bgx123.com' < /tmp/mysql-all.sql

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

[root@db01 ~]# systemctl restart mariadb
[root@db01 ~]# mysql -uroot -pBgx123.com
mysql> show databases;

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

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

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

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

[root@web01 ~]# vim /code/wordpress/wp-config.php
# 数据库名称
define('DB_NAME', 'wordpress');
# 数据库用户
define('DB_USER', 'all');
# 数据库密码
define('DB_PASSWORD', 'Bgx123.com');
# 数据库地址
define('DB_HOST', '172.16.1.51');

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

[root@web01 zh]#  grep -iR "Bgx123.com"|grep -v cache
system/config/database.php:  'password' => 'Bgx123.com',
[root@web01 zh]# vim /code/zh/system/config/database.php
'host' => '172.16.1.51',
'username' => 'all',
'password' => 'Bgx123.com',
'dbname' => 'zh',

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

8.扩展多台相同的Web服务器

1.为什么要扩展多台web节点

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

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

1.单台web节点如果故障,会导致业务down机
2.多台web节点能保证业务的持续稳定,扩展性高
3.多台web节点能有效的提升用户访问网站的速度

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

image.png

4.快速扩展一台web节点环境规划

image.png

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

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

1) 创建www用户

[root@web02 ~]# groupadd -g666 www
[root@web02 ~]# useradd -u666 -g666 www

2) 安装LNP

[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

[root@web02 ~]# scp -rp root@172.16.1.7:/etc/nginx /etc/

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

[root@web02 ~]# scp -rp root@172.16.1.7:/etc/php-fpm.d /etc/

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

[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,并加入开机自启

[root@web03 ~]# systemctl start nginx php-fpm 
[root@web03 ~]# systemctl enable nginx php-fpm

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

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

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

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

1.保证了多台web节点静态资源一致。
2.有效节省多台web节点的存储空间。
3.统一管理静态资源,便于后期推送至CDN进行静态资源加速

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

image.png

4.快速扩展一台web节点环境规划

image.png

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

1.nfs服务端,操作步骤如下

1) 安装并配置nfs

[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) 配置Nginx进程运行用户

[root@nginx ~]# groupadd -g666 www
[root@nginx ~]# useradd -u666 -g666 www
[root@nginx ~]# sed -i '/^user/c user  www;' /etc/nginx/nginx.conf

3) 启动Nginx,并将Nginx加入开机自启

[root@nginx ~]# systemctl start nginx
[root@nginx ~]# systemctl enable nginx

2.web01端操作步骤如下

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

[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静态资源存放的位置

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

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

[root@web01 ~]# cd /code/wordpress/wp-content
[root@web01 wp-content]# cp uploads/ uploads_bak/

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

[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) 将挂载信息加入开机自启

[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


3.web02端,操作步骤如下

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

[root@web02 ~]# mount -t nfs 172.16.1.31:/data/blog /code/wordpress/wp-content/uploads/

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

[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


相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
11月前
|
应用服务中间件 测试技术 nginx
软件测试|Docker 搭建Web服务器nginx
软件测试|Docker 搭建Web服务器nginx
181 0
软件测试|Docker 搭建Web服务器nginx
|
11月前
|
负载均衡 应用服务中间件 API
Nginx搭建域名访问环境
Nginx搭建域名访问环境
Nginx搭建域名访问环境
|
11月前
|
应用服务中间件 Linux nginx
CentOS 7 Nginx 搭建
CentOS 7 Nginx 搭建
148 0
CentOS 7 Nginx 搭建
|
12月前
|
存储 缓存 算法
Nginx 安装配置 | 图床搭建 | Nginx 限流 三大弹
Nginx(“engine x”)是一款是由俄罗斯的程序设计师Igor Sysoev所开发高性能的 Web和 反向代理 服务器,也是一个 IMAP/POP3/SMTP 代理服务器。 在高连接并发的情况下,Nginx是Apache服务器不错的替代品。
207 0
Nginx 安装配置 | 图床搭建 | Nginx 限流 三大弹
|
12月前
|
消息中间件 监控 NoSQL
ELK搭建(十三):搭建Nginx资源访问率、丢包率、读写率等运行性能监控平台
Nginx是一款轻量级、高性能的流量分发和反向代理的web服务。随着市场业务量的增加,普通的web容器,如tomcat的并发量已经远不能满足我们的业务量,同时随着分布式架构的普及,我们需要一款反向代理服务的支持,于是Nginx应运而生。 Nginx已经在大多数业务中普遍使用,因此针对Nginx的性能监控十分必要,这样我们才能实时掌握服务器请求情况和运行效率 所以今天,我们的目标就是搭建一个Nginx运行性能监控平台
326 0
ELK搭建(十三):搭建Nginx资源访问率、丢包率、读写率等运行性能监控平台
|
12月前
|
消息中间件 数据采集 监控
ELK搭建(十二):搭建Nginx访问、错误日志监控平台
Nginx是一款轻量级、高性能的流量分发和反向代理的web服务。随着市场业务量的增加,普通的web容器,如tomcat的并发量已经远不能满足我们的业务量,同时随着分布式架构的普及,我们需要一款反向代理服务的支持,于是Nginx应运而生。 Nginx已经在大多数业务中普遍使用,因此针对Nginx的流量监控,错误日志监控极其必要,这样才能让我们能够及时了解系统运行情况。 那么今天,我们就来看看如何搭建Nginx访问记录、错误日志监控平台
299 0
ELK搭建(十二):搭建Nginx访问、错误日志监控平台
|
12月前
|
应用服务中间件 PHP nginx
实战 - docker-compose搭建基本的nginx+php环境
docker-compose使用后缀为yml的文件定义你的服务容器关系 下面我们用一个nginx+php的简单例子来演示 创建项目总目录
704 0
|
12月前
|
负载均衡 算法 应用服务中间件
反向代理是什么?利用Nginx+Tomcat来搭建反向代理的负载均衡群集
反向代理是什么?利用Nginx+Tomcat来搭建反向代理的负载均衡群集
98 0
反向代理是什么?利用Nginx+Tomcat来搭建反向代理的负载均衡群集
|
12月前
|
运维 负载均衡 网络协议
部署haproxy代理,搭建基于nginx的高性能反向代理群集
部署haproxy代理,搭建基于nginx的高性能反向代理群集
348 0
部署haproxy代理,搭建基于nginx的高性能反向代理群集
|
应用服务中间件 nginx 容器
wgcloud搭建使用 — 需要安装nginx吗
wgcloud搭建使用 — 需要安装nginx吗
wgcloud搭建使用 — 需要安装nginx吗
热门文章
最新文章
相关产品
云迁移中心
推荐文章
更多