1LNMP架构概述

1.1.什么是LNMP

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

1.2.LNMP架构是如何工作的

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

1.3.Nginx与快速CGI详细工作流程如下图所示

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

2LNMP架构环境部署

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

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

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

[root@nginx ~]# yum remove php-mysql-5.4 php php-fpm php-common
[root@nginx ~]# cat /etc/yum.repos.d/php.repo
[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

3)配置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

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

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

5)安装Mariadb数据库

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

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

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

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

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

3LNMP架构环境配置

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

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

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

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

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

3.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;

3.4.通过图形方式展示fastcgi_index与fastcgi_param作用

3.5.最终Nginx的连接FASTCGI服务器配置如下(nginx和php集成)

[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;
}
}

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

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

3.7在/ code目录下创建mysql.php文件,填入对应的数据库IP,用户名,密码(php连接mysql)

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

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

4部署博客产品的WordPress

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

#nginx具体配置信息
[root@nginx ~]# cat /etc/nginx/conf.d/wordpress.conf
server {
listen 80;
server_name blog.tuchuang.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;
}
}

4.2重启nginx服务

[root@nginx ~]# systemctl restart nginx

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

[root@nginx ~]# mkdir /code
[root@nginx ~]# cd /code![](https://img2018.cnblogs.com/blog/1488697/201905/1488697-20190528231702326-1090090313.png) [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.4由于wordpress产品需要依赖数据库,所以需要手动建立数据库

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

4.5通过浏览器访问wordpress,并部署该产品(需要做域名解析)







5部署知乎产品Wecenter

5.1.配置Nginx的虚拟主机站点,域名为zh.tuchuang.com

[root@http-server ~]# cat /etc/nginx/conf.d/zh.conf
server {
listen 80;
server_name zh.tuchuang.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

5.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 WeCenter_3-2-1/ zh
[root@web02 ~]# chown -R www.www /code/zh/

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

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

5.4.通过浏览器访问网站




6.布置在线教育产品edusoho

6.1.配置nginx

[root@web01 code]# cat /etc/nginx/conf.d/edu.oldboy.com.conf
server {
listen 80;
server_name edu.oldboy.com;
root /code/edusoho/web;
client_max_body_size 200m; location / {
index app.php;
try_files $uri @rewriteapp;
}
location @rewriteapp {
rewrite ^(.*)$ /app.php/$1 last;
} location ~ ^/udisk {
internal;
root /code/edusoho/app/data/;
} location ~ ^/(app|app_dev)\.php(/|$) {
fastcgi_pass 127.0.0.1:9000;
fastcgi_split_path_info ^(.+\.php)(/.*)$;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param HTTPS off;
fastcgi_param HTTP_X-Sendfile-Type X-Accel-Redirect;
fastcgi_param HTTP_X-Accel-Mapping /udisk=/code/edusoho/app/data/udisk;
fastcgi_buffer_size 128k;
fastcgi_buffers 8 128k;
} # 配置设置图片格式文件
location ~* \.(jpg|jpeg|gif|png|ico|swf)$ {
# 过期时间为3年
expires 3y;
# 关闭日志记录
access_log off;
# 关闭gzip压缩,减少CPU消耗,因为图片的压缩率不高。
gzip off;
}
# 配置css/js文件
location ~* \.(css|js)$ {
access_log off;
expires 3y;
}
# 禁止用户上传目录下所有.php文件的访问,提高安全性
location ~ ^/files/.*\.(php|php5)$ {
deny all;
} # 以下配置允许运行.php的程序,方便于其他第三方系统的集成。
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_split_path_info ^(.+\.php)(/.*)$;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param HTTPS off;
}
}

6.2.下载软件,并且授权

wget http://download.edusoho.com/edusoho-8.2.17.tar.gz
tar xf edusoho-8.2.17.tar.gz
chown -R www.www edusoho

6.3.调整php的上传大小

[root@web01 ~]# vim /etc/php.ini
post_max_size = 200M
upload_max_filesize = 200M
[root@web01 code]# systemctl restart php-fpm

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

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

由于单台服务器运行LNMP架构会导致网站访问缓慢,当内存被吃满时,很容易导致系统出现OOM故障(实质就是内存不够导致),从而杀掉占用内存最大的程序(有可能就杀掉数据库,导致数据丢失),所以需要将web和数据库进行独立部署。

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

1.缓解web网站的压力

2.增强数据库读写性能

3.提高用户访问的速度

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

7.4.数据库拆分环境规划

主机名称 应用环境 外网地址 内网地址
WEB01 nginx的PHP + 10.0.0.7 172.16.1.7
DB01 MySQL的 172.16.1.51

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

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

1)备份web01上的数据库,123456是数据库密码
[root@web01 ~]# mysqldump -uroot -p'123456' --all-databases --single-transaction > mysql-all.sql
2)将web01上备份的数据库拷贝贝至db01服务器上
[root@web01 ~]# scp mysql-all.sql root@172.16.1.51:/tmp

7.5.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'123456' < /tmp/mysql-all.sql
2)数据库导入完成后,重启数据库,使用新密码进行登录,并检查数据库已被导入成功
[root@db01 ~]# systemctl restart mariadb
[root@db01 ~]# mysql -uroot -p123456.com
mysql> show databases;
3)在新数据库上授权,允许所有网段,通过所有oldboy账户连接并操作该数据库
#授权所有权限 grant all privileges
#授权所有库所有表 *.* (前面的*代表所有库,后面的*代表所有表)
#将授权赋予给哪个用户,这个用户只能通过哪个网段过来(%所有) 'all'@'%'
#授权该用户登录的密码 identified by mysql> grant all on *.* to all@'%' identified by '123456';
Query OK, 0 rows affected (0.00 sec) ###客户端测试远程账号是否能连接数据库:
[root@web01 ~]# mysql -h 172.16.1.51 -uoldboy -p123456
注意:客户端必须安装了mysql客户端才能测试。

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

1)修改Wordpress产品代码连接数据库的配置文件
[root@web01 ~]# vim /code/wordpress/wp-config.php
# 数据库名称
define('DB_NAME', 'wordpress');
# 数据库用户
define('DB_USER', 'oldboy');
# 数据库密码
define('DB_PASSWORD', '123456');
# 数据库地址
define('DB_HOST', '172.16.1.51');
2)修改wecenter产品代码连接数据库的配置文件
[root@web01 zh]# grep -iR 123456"|grep -v cache
system/config/database.php: 'password' => '123456',
[root@web01 zh]# vim /code/zh/system/config/database.php
'host' => '172.16.1.51',
'username' => 'oldboy',
'password' => '123456',
'dbname' => 'zh',
3)最后访问网站,成功打开,至此拆分数据库完成

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

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

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

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

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

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

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

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

8.4.快速扩展一台网络节点环境规划

主机名称 应用环境 外网地址 内网地址
WEB01 nginx的PHP + 10.0.0.7 172.16.1.7
web02 nginx的PHP + 10.0.0.8 172.16.1.8
DB01 MySQL的 172.16.1.51

8.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 ~]# 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 (/etc/php-fpm.conf /etc/php-fpm.d /etc/php.ini)
[root@web02 ~]# rsync -avz --delete root@172.16.1.7:/etc/php* /etc/ (后面与前面保持一直) 5)将web01的产品代码打包传输到web02服务器上,在web1上进行打包操作
[root@web01 ~]# tar zcf 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.拆分静态资源至独立服务器

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

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

9.2.新增一台nfs存储服务器解决了什么问题

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

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

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

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

9.4.快速扩展一台网络节点环境规划

主机名称 应用环境 外网地址 内网地址
WEB01 nginx+PHP 10.0.0.7 172.16.1.7
web02 nginx+PHP 10.0.0.8 172.16.1.8
NFS NFS 172.16.1.31
DB01 MySQL 172.16.1.51

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

9.5.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)创建共享目录,并进行授权
[root@nfs01 ~]# mkdir /data/{blog,zh} -p
[root@nfs01 ~]# chown -R www.www /data/
3)启动nfs服务,并加入开机自启
[root@nfs01 ~]# systemctl restart nfs-server

9.5.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.tuchuang.com/wp-content/uploads/2019/01/121716bnb4pgdj6b6gspjq-1024x576.jpg
3)备份web01服务器上Wordpress的静态资源,因为该服务器上的资源资源最全(意思就是备份一台静态资源最多的服务器)
[root@web01 ~]# cd /code/wordpress/wp-content
[root@web01 wp-content]# scp -rp uploads/* root@172.16.1.31:/data/blog/
4)web01客户端执行挂载操作
[root@web01 wp-content]# mount -t nfs 172.16.1.31:/data/blog /code/wordpress/wp-content/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

9.5.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

10、LNMP架构的更多相关文章

  1. 第20章 使用LNMP架构部署动态网站环境

    章节概述: 本章节将从Linux系统的软件安装方式讲起,带领读者分辨RPM软件包与源码安装的区别.并能够理解它们的优缺点. Nginx是一款相当优秀的用于部署动态网站的服务程序,Nginx具有不错的稳 ...

  2. lnmp架构下php安全配置分享

    目录[-] 1. 使用open_basedir限制虚拟主机跨目录访问 2. 禁用不安全PHP函数 3. 关注软件安全资讯 4. php用户只读 5. 关闭php错误日志 6. php上传分离 7. 关 ...

  3. lnmp架构(第一篇)

    lnmp 架构 第一篇 nginx 源码安装 nginx的安装包:nginx-1.12.0.tar.gz 建议安装前的修改: 在nginx的解压包中修改文件nginx-1.12.0/src/core/ ...

  4. LNMP架构部署

    第1章 部署LNMP架构步骤 1.1 ①部署Linux系统(OK) 基本优化完成(ip地址设置 yum源更新 字符集设置) 安全优化完成(iptables关闭 selinux关闭 /tmp/ 1777 ...

  5. 企业级LNMP架构搭建实例(基于Centos6.x)

    1.1 部署LNMP架构说明 1.1.1 LNMP架构内容 01.部署linux系统 02.部署nginx网站服务 03.部署mysql数据库服务 04.部署php动态解析服务 1.1.2 配置LNM ...

  6. LAMP与LNMP架构的区别及其具体的选择说明

    LAMP==Linux+Apache+Mysql+PHP LNMP==Linux+Nginx+Mysql+PHP 以上两只架构是目前网站的主流架构 LAMP和LNMP最主要的区别在于: 一个使用的是A ...

  7. nginx详解反向代理、负载均衡、LNMP架构上线动态网站(week4_day1_part1)-技术流ken

    nginx介绍 Nginx是俄罗斯人编写的十分轻量级的HTTP服务器,Nginx,它的发音为“engine X”,是一个高性能的HTTP和反向代理服务器,同时也是一个IMAP/POP3/SMTP 代理 ...

  8. 高性能Web服务之lnmp架构应用

    传统上基于进程或线程模型架构的web服务通过每进程或每线程处理并发连接请求,这势必会在网络和I/O操作时产生阻塞,其另一个必然结果则是对内存或CPU的利用率低下.生成一个新的进程/线程需要事先备好其运 ...

  9. lnmp架构实现动态php

    目录 LNMP动态网站php 1.PHP-FastCGI概述 PHP-FPM安装配置 配置PHP与数据库连接 配置PHP新增扩展模块 配置PHP-FPM主要配置 配置PHP-FPM错误日志 1.编译安 ...

随机推荐

  1. 安装 redis manager

    安装文档在redis manager 的官方文档上有,这里做个笔记.官网地址:https://snapcraft.io/redis-desktop-manager 截图1: 可以选择自己的系统,根据里 ...

  2. Cookie实战案例代码

    import java.io.IOException; import java.text.SimpleDateFormat; import java.util.Date; import javax.s ...

  3. vuex 使用

    一.什么是Vuex Vuex是一个专门为Vue.js应用程序开发的状态管理模式, 它采用集中式存储管理所有组件的公共状态, 并以相应的规则保证状态以一种可预测的方式发生变化 二. 为什么要使用Vuex ...

  4. Pythonnumpy提取矩阵的某一行或某一列的实例

    Python numpy 提取矩阵的某一行或某一列的实例 下面小编就为大家分享一篇Python numpy 提取矩阵的某一行或某一列的实例,具有很好的参考价值,希望对大家有所帮助.一起跟随小编过来看看 ...

  5. mac 安装photoshop + 破解

    项目开发中毫无疑问会用到图片,一般情况都是UI将图片切好的,只是,有时候项目中少了一张图片或者是改变图片的尺寸之类的问题,这里我们就不需要每次都找UI要图片了,作为程序员这些基础工具的使用,咱们还是要 ...

  6. apache thrift 入门(一)

    1.简介 Apache Thrift软件框架,是用来开发可扩展的跨语言的软件服务.通过软件堆栈和代码生成引擎相结合的方式来构建服务,使C++, Java, Python, PHP, Ruby, Erl ...

  7. 人性化的Requests模块(响应与编码、header处理、cookie处理、重定向与历史记录、代理设置)

    Requests库是第三方模块,需要额外进行安装.Requests是一个开源库 pip install requests 去GitHub下载回来,进入解压文件,运行setup.py 比urllib2实 ...

  8. Excel随机数相关

    基本函数 RAND() 函数:自动生成一个[0,1)的平均分布随机数(依重新计算而改变) RANDBETWEEN(bottom,top) :返回一个介于指定数字直接的随机数,不会自动改变 INT(nu ...

  9. OpenStack组件——Glance镜像服务

    1.glance介绍 Glance是Openstack项目中负责镜像管理的模块,其功能包括虚拟机镜像的查找.注册和检索等. Glance提供Restful API可以查询虚拟机镜像的metadata及 ...

  10. Leetcode之广度优先搜索(BFS)专题-773. 滑动谜题(Sliding Puzzle)

    Leetcode之广度优先搜索(BFS)专题-773. 滑动谜题(Sliding Puzzle) BFS入门详解:Leetcode之广度优先搜索(BFS)专题-429. N叉树的层序遍历(N-ary ...