LNMP架构搭建

Posted 徐中祥

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LNMP架构搭建相关的知识,希望对你有一定的参考价值。

LNMP架构

一、LNMP架构介绍

1、简介

LNMP是一套技术的组合,L=Linux、N=nginx、M~=mysql、P~=php
不仅仅只有这些服务,还有很多
redis\\elasticsearch\\kibana\\logstash\\zabbix\\git\\jenkins\\kafka\\hbase\\hadoop\\spark\\flink

2、LNMP架构工作方式

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

	1.静态请求:请求的内容是静态文件就是静态请求
		# 静态文件:文件上传到服务器,永远不会改变的文件就是静态文件
		# html就是一个标准的静态文件
	2.动态请求:请求的内容是动态的就是动态请求
		# 不是真实存在服务器上的内容,是通过数据库或者其他服务拼凑成的数据

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

在这里插入图片描述

3、LNMP架构访问流程

1.浏览器输入域名,浏览器会拿着域名去DNS服务器解析
2.DNS服务器会将域名解析成IP
3.浏览器会去与IP对应服务器建立TCP\\IP连接
4.连接建立完成,会向服务器发起请求,请求nginx
5.nginx会判断请求是动态的还是静态的
	#静态请求
	location \\.jpg$ {
        root /code;
	}
	#动态请求
	location \\.php$ {
        fastcgi_pass 127.0.0.1:9000;
        ... ...
	}
6.如果是静态请求,nginx去code目录获取,直接返回
7.如果是动态请求,nginx会通过fastcgi协议连接PHP服务的php-fpm管理进程

在这里插入图片描述

8.php-fpm管理进程会下发工作给 wrapper工作进程
9.wrapper工作进程判断是不是简单的php内容
10.如果只是php内容则使用php解析器解析后直接返回
11.如果还需要读取数据库,wrapper工作进程会去数据库读取数据,再返回数据
12.数据流转过程:
	         # 请求:浏览器 > 负载均衡 > nginx > php-fpm > wrapper > mysql
	         # 响应:mysql > wrapper > php-fpm > nginx > 负载均衡 > 浏览器

二、LNMP架构搭建wordpress

  • 环境准备

主机IP服务
web0110.0.0.7,172.16.1.7Nginx+php
db0110.0.0.51,172.16.1.51MySQL

1、安装Nginx

# 配置官方源
[root@web01 ~]# vim /etc/yum.repos.d/nginx.repo
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true

# 安装nginx
[root@web01 ~]# yum install -y nginx

# 配置nginx
[root@web01 ~]# vim /etc/nginx/nginx.conf 
user  www;

# 创建用户
[root@web01 ~]# groupadd www -g 666 && useradd www -u 666 -g 666 -s /sbin/nologin -M
[root@web01 ~]# id www
uid=666(www) gid=666(www)=666(www)

# 启动nginx
[root@web01 ~]# systemctl start nginx && systemctl enable nginx

# 验证启动
[root@web01 ~]# ps -ef | grep nginx
root       9953      1  0 11:17 ?        00:00:00 nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf
www        9954   9953  0 11:17 ?        00:00:00 nginx: worker process

2、安装PHP

# 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
[root@web01 ~]# vim /etc/php-fpm.d/www.conf 
user = www
group = www

# 启动服务
[root@web01 ~]# systemctl start php-fpm && systemctl enable php-fpm

# 验证启动
[root@web01 ~]# ps -ef | grep php-fpm

3、db01安装MySQL

# 清理历史环境
rpm -qa | grep mariadb
yum remove mariadb-libs -y

# 创建mysql用户
useradd mysql -s /sbin/nologin -M

# 创建相关目录
mkdir -p /service/ /data/3306

# 安装依赖
yum install -y ncurses-devel libaio-devel gcc gcc-c++ glibc cmake autoconf

# 上传二进制包并解压
[root@db01 ~]# cd /service
[root@db02 service]# rz
[root@db02 service]# ll
-rw-r--r-- 1 root root 724672294 2月  23 20:37 mysql-5.7.28-linux-glibc2.12-x86_64.tar.gz
[root@db01 service]# tar xf mysql-5.7.28-linux-glibc2.12-x86_64.tar.gz 
[root@db01 service]# ll
drwxr-xr-x 9 root root 129 2月  23 20:45 mysql-5.7.28-linux-glibc2.12-x86_64

# 做软连接
[root@db01 ~]# ln -s mysql-5.7.28-linux-glibc2.12-x86_64/ mysql

# 授权
[root@db01 ~]# cd /service/mysql && chown -R mysql. *

# 设置环境变量
vim /etc/profile.d/mysql.sh 
export PATH=/service/mysql/bin:$PATH

# 生效配置
source /etc/profile

# 初始化数据库
mysqld --initialize-insecure --user=mysql --basedir=/service/mysql --datadir=/data/3306/data

再次运行初始化命令报错
原因: -datadir=/data/3306 存放数据的目录以有数据
解决: rm -rf /data/3306*
再次运行即可。

# 授权
chown -R mysql.mysql /data

# 扩展
 5.7 初始化方式
(1)mysqld --initialize
这个命令初始化后,会有12位临时密码,但是必须在使用mysql之前重置这个密码。
(2)mysqld --initialize-insecure

 5.6版本初始化方式
/service/mysql/scripts/mysql_install_db --user=mysql --basedir=/service/mysql --datadir=/data/3306

# mysql配置文件设置
cat > /etc/my.cnf <<EOF
[mysqld]
user=mysql
basedir=/service/mysql
datadir=/data/3306/data
log-error=/data/3306/data/mysql.err
log-bin=/data/3306/data/mysql-bin
server_id=6
port=3306
socket=/data/3306/mysql.sock
gtid-mode=on
enforce-gtid-consistency=true
log-slave-updates=1
[mysql]
socket=/data/3306/mysql.sock
prompt=db01 [\\\\d]>
EOF

# 启动mysql
cd /service/mysql/support-files/
cp mysql.server /etc/init.d/mysqld
chkconfig --add mysqld
systemctl start mysqld && systemctl enable mysqld

# 设置MySQL密码
[root@db01 support-files]# mysqladmin -uroot -S /data/3306/mysql.sock password '3306'

4、搭建wordpress (web01)

# 创建代码发布目录
[root@web01 ~]# mkdir /code && cd /code

# 上传代码
[root@web01 code]# rz
[root@web01 code]# ll
-rw-r--r-- 1 root root 11098483 11月 30 12:19 wordpress-5.0.3-zh_CN.tar.gz

# 解压代码
[root@web01 code]# tar xf wordpress-5.0.3-zh_CN.tar.gz 

# 授权
[root@web01 code]# chown -R www.www wordpress
  • 配置nginx关联php(web01)

关联语法:

#fastcgi_pass,nginx连接php的代理协议
Syntax:	fastcgi_pass address;         # fastcgi_pass协议 + address代理地址
Default:	—
Context:	location, if in location

#指定请求的文件
Syntax:	fastcgi_param parameter value [if_not_empty];
Default:	—
Context:	http, server, location

#指定默认的php页面
Syntax:	fastcgi_index name;
Default:	—
Context:	http, server, location

配置Nginx

[root@web01 ~]# vim /etc/nginx/conf.d/linux.wp.com.conf 
server {
    listen 80;
    server_name linux.wp.com;

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

    location ~* \\.php$ {
        fastcgi_pass 127.0.0.1:9000;
        fastcgi_param SCRIPT_FILENAME /code/wordpress/$fastcgi_script_name;
        include fastcgi_params;
    }
}

重启Nginx配置本地hosts文件访问

[root@web01 ~]# systemctl reload nginx

10.0.0.7 www.wp.com

http://www.wp.com/wp-admin/setup-config.php
在这里插入图片描述

  • 创建数据库授权(db01)

[root@db01 ~]# mysql -uroot -p3306

db01 [(none)]>create database wordpress charset utf8mb4;

db01 [(none)]>grant all on wordpress.* to wp@'172.16.1.%' identified by '123';

db01 [(none)]>select user,host from mysql.user;
  • 根据页面提示连接数库(web01)

[root@web01 ~]# cd /code/wordpress && cp wp-config-sample.php wp-config.php

[root@web01 wordpress]# vim wp-config.php 

// ** MySQL 设置 - 具体信息来自您正在使用的主机 ** //
/** WordPress数据库的名称 */
define('DB_NAME', 'wordpress');

/** MySQL数据库用户名 */
define('DB_USER', 'wp');

/** MySQL数据库密码 */
define('DB_PASSWORD', '123');

/** MySQL主机 */
define('DB_HOST', '172.16.1.51');

/** 创建数据表时默认的文字编码 */
define('DB_CHARSET', 'utf8mb4');
  • 测试PHP和MySQL关联(web01)

# 编写php测试连接数据库的代码
[root@web01 wordpress]# vim /code/wordpress/test.php
<?php
    $servername = "10.0.0.51";
    $username = "wp";
    $password = "123";

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

    // 检测连接
    if (!$conn) {
        die("Connection failed: " . mysqli_connect_error());
    }
    echo "php连接MySQ成功...";
?>

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

访问测试

http://www.wp.com/test.php
  • 登录网站

在这里插入图片描述在这里插入图片描述
搭建成功

三、扩展web集群

  • 环境准备

主机IP部署服务
web0110.0.0.7,172.16.1.7nginx+php
web0210.0.0.8,172.16.1.8nginx+php
db01172.16.1.51MySQL
  • web02搭建nginx

# 配置官方源
[root@web01 ~]# scp /etc/yum.repos.d/nginx.repo 172.16.1.8:/etc/yum.repos.d/

# 安装nginx
[root@web02 ~]# yum install -y nginx

# 创建用户
[root@web02 ~]# groupadd www -g 666 && useradd www -u 666 -g 666
  • web02安装php

[root@web02 ~]# 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 remove php-mysql-5.4 php php-fpm php-common


# 配置第三方源
[root@web01 ~]# scp /etc/yum.repos.d/php.repo 172.16.1.8:/etc/yum.repos.d/


[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
  • 同步web01的配置文件到web02

#同步nginx配置文件
[root@web01 ~]# scp /etc/nginx/nginx.conf 172.16.1.8:/etc/nginx/ 
[root@web01 ~]# scp /etc/nginx/conf.d/linux.wp.com.conf 172.16.1.8:/etc/nginx/conf.d/

#同步php的配置
[root@web01 ~]# scp /etc/php-fpm.d/www.conf 172.16.1.8:/etc/php-fpm.d/ 
[root@web01 ~]# scp /etc/php.ini 172.16.1.8:/etc/
  • 推送web01站点目录到web02

[root@web01 ~]#  scp -r /code 172.16.1.8:/
  • 启动nginx和php服务

[root@web03 ~]# systemctl start nginx && systemctl enable nginx && systemctl start php-fpm && systemctl enable php-fpm
  • 授权站点目录

[root@web02 ~]# chown -R www.www /code/
  • 修改本地hosts访问测试

#10.0.0.7 linux.wp.com
10.0.0.8 linux.wp.com

四、搭建文件共享

  • 环境准备

主机IP部署服务
web0110.0.0.7nginx+php
web0210.0.0.8nginx+php
db01172.16.1.51MySQL
nfs172.16.1.31nfs

1、搭建NFS服务器

# 安装nfs
[root@nfs ~]# yum install -y nfs-utils

# 创建挂载目录
[root@nfs ~]# mkdir /wp_data

# 配置NFS
[root@nfs ~]# vim /etc/exports
/wp_data 172.16.1.0/24(rw,sync,all_squash,anonuid=666,anongid=666)

# 创建用户
[root@nfs ~]# groupadd www -g 666 && useradd www -u 666 -g 666

# 授权
[root@nfs ~]# chown -R www.www /wp_data

# 启动NFS并检查
[root@nfs ~]# systemctl start nfs && cat /var/lib/nfs/etab
/wp_data 172.16.1.0/24(rw,sync,wdelay,hide,nocrossmnt,secure,root_squash,all_squash,no_subtree_check,secure_locks,acl,no_pnfs,anonuid=666,anongid=666,sec=sys,rw,secure,root_squash,all_squash)

2、配置客户端

# 安装nfs和rpcbind--》并启动rpcbind
[root@nfs ~]# yum install -y nfs-utils rpcbind && systemctl start rpcbind

# 查看挂载点
[root@nfs ~]# showmount -e 172.16.1.31
Export list for 172.16.1.31:
/wp_data 172.16.1.0/24

# 确定挂载目录
[root@web01 ~]# ll /code/wordpress/wp-content/uploads/

# 先推送挂载目录下的文件
web01
[root@web01 ~]# rsync -avz /code/wordpress/wp-content/uploads/ 172.16.1.31:/wp_data
web02
[root@web02 ~]# rsync -avz /code/wordpress/wp-content/uploads/ 172.16.1.31:/wp_data

# 验证文件
[root@nfs ~]# ll /wp_data/2021/04/
-rw-r--rw- 1 www www  77351 4月  16 21:29 2_test-1024x576.jpg
-rw-r--rw- 1 www www   6326 4月  16 21:29 2_test-150x150.jpg
-rw-r--rw- 1 www www 160062 4月  16 21:29 2_test-1568x882.jpg
-rw-r--rw- 1 www www  11248 4月  16 21:29 2_test-300x169.jpg
-rw-r--rw- 1 www www  48495 4月  16 21:29 2_test-768x432.jpg
-rw-r--rw- 1 www www 289186 4月  16 21:29 2_test.jpg
-rw-r--r-- 1 www www   5798 4月  16 21:24 xu-150x150.jpg
-rw-r--r-- 1 www www  12426 4月  16 21:24 xu-300x269.jpg
-rw-r--r-- 1 www www  19334 4月  16 21:24 xu.jpg

# 挂载
web01 挂载
[root@web01 ~]# mount -t nfs 172.16.1.31:/wp_data /code/wordpress/wp-content/uploads
[root@web01 ~]# df -TH
文件系统                类型      容量  已用  可用 已用% 挂载点
172.16.1.31:/wp_data    nfs4       15G  2.3G   13G   16% /code/wordpress/wp-content/uploads

web02 挂载
[root@web02 ~]# mount -t nfs 172.16.1.31:/wp_data /code/wordpress/wp-content/uploads
[root@web02 ~]# df -TH
文件系统                类型      容量  已用  可用 已用% 挂载点
172.16.1.31:/wp_data    nfs4       15G  2.3G   13G   16% /code/wordpress/wp-content/uploads

以上是关于LNMP架构搭建的主要内容,如果未能解决你的问题,请参考以下文章

LNMP架构的搭建

LNMP架构搭建与优化

lnmp 架构搭建

LNMP架构搭建

puppet 搭建lnmp架构

在LNMP架构中搭建zabbix监控服务!!!