LNMP架构搭建------------------魂惊冉冉江南远,烟草愁如许

LNMP架构

一、LNMP架构介绍

1.1、简介

# LNMP是一套技术的组合
Linux、Nginx、Mysql、PHP
Linux、Nginx、Mysql、Python
Linux系统Nginx+Mysql+PHP这种网站服务器架构。
1.Nginx是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP代理服务器。
2.Mysql是一个开源的关系型数据库管理系统
3.PHP是一种在服务器端执行的嵌入HTML文档的脚本语言

1.2、LNMP架构工作方式

首先Nginx服务是不能处理动态请求的,当用户发起HTTP请求,会被Nginx处理,如果是静态资源请求,Nginx则直接响应返回,如果是动态请求,Nginx则通过fasrcgi协议转交给后端的PHP程序处理。

1.静态请求:请求的内容是静态文件就是静态请求
	1)静态文件:文件上传到服务器,永远不会改变的文件就是静态文件
	2)html就是一个标准的静态文件
ps:一般能走缓存的都是静态文件,没有&符合的连接,只有单独的路径的,
2.动态请求:请求的内容是动态的,就是动态请求
	1)不是真是存在服务器上的内容,是通过数据库或者其他服务器拼凑成的数据

# 总结:
# 当用户发起http请求,请求会被Nginx处理,如果是静态资源请求Nginx则直接返回,如果是动态请求Nginx则通过fastcgi协议转交给后端的PHP程序处理。

php有两个配置文件

#php有两个配置文件php-fpm.conf和php.ini
conf相当于nginx的核心模块和事件驱动模块。对php本身的属性的限制。相关联的配置文件在www.conf中

ini相当于nginx的http模块。开始服务时,对工作中的限制

1.3、Nginx与Fast-CGI详细工作流程

1.用户通过http协议发起请求,请求会先抵达LNMP架构中的Nginx
2.Nginx会根据用户的请求进行判断,这个判断是由哪个locatinon完成的
3.判断用户请求的是静态页面,Nginx直接进行处理
4.判断用户请求的是动态页面,Nginx会将该请求交给fastcgi协议
5.fastcgi会将请求交给php-fpm管理进程,php-fpm管理进程接收到后会调用具体的工作进程warrap
6.warrap进程会调用php程序进行解析,如果只是解析代码php直接返回
7.如果又查询数据库操作,则有php连接数据库(用户 密码 IP)发起查询的操作
8.最终数据由'mysql->warrap->php-fpm->fastcgi->nginx->http->user'
发起请求的路径为:'user->http->nginx->fastcgi->php-fpm->warrap->mysql'

1.4、fastcgi_params参数详解

fastcgi_param SCRIPT_FILENAME $document_root/fastcgi_script_name;
#脚本文件请求的路径

fastcgi_param QUERY+STRING $QUERY_STRING; 
#请求的参数;如app=123;

fastcgi_param  REQUEST_METHOD  $request_method;
#请求的动作(GET,POST)

fastcgi_param CONTENT_TYPE $content_type; # 请求头中的Content-Type字段


fastcgi_param CONTENT_LENGTH $content_length; 
# 请求投中的Content-length字段


fastcgi_param SCRIPT_NAME $fastcgi_script_name;
# 脚本名称

fastcgi_param REQUEST_URI $request_uri;
# 请求的地址不带参数

fastcgi_param DOCUMENT_URI $document_uri;
# 与$uri相同

fastcgi_param DOCUMENT_ROOT $document_root;
# 网站的根目录,在server配置中root指令中指定的值

fastcgi_param SERVER_PROTOCOL $server_protocol;
# 请求使用的协议,通常是HTTP/1.0或HTTP/1.1

fastcgi_param GATEWAY_INTERFACE CGI/1.1;
# CGI版本

fastcgi_param SERVER_SOFTWARE nginx/$nginx_server_version;
# nginx版本号,可修改、隐藏

fastcgi_param REMOTE_ADDR $remote_addr;
# 客户端IP

fastcgi_param REMOTE_PORT $remote_port;
# 客户端端口

fastcgi_param SERVER_ADDR $server_addr;
# 服务器ip地址

fastcgi_param SERVER_PORT $server_port;
# 服务器端口

fastcgi_param SERVER_NAME $server_name;
# 服务器名,域名在server配置中指定的server_name

fastcgi_param PATH_INFO $path_info;
# 可自定义变量

# PHP only, required if PHP was built with --enable-force-cgi-redirect
# fastcgi_param  REDIRECT_STATUS    200;

静态数据请求图解

动态数据请求图解

二、部署LNMP架构流程

2.1、安装Nginx

1.使用官方源安装Nginx
# 详见 Nginx 安装方式
2.更改nginx用户
#  sed -i '/^user/c user www;' /etc/nginx/nginx.conf
3.Nginx加入开机自启
#  systemctl enable nginx

2.2、安装PHP

# 可能会存在没有安装包的提示,重新执行该步骤,多执行几次会解决!!!

1.首先确认有无旧版PHP,有则删除卸载
# yum remove php-mysql-5.4 php php-fpm php-common

2.下载7.2版本的PHP
	1)# rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm

	2)# rpm -Uvh https://mirror.webtatic.com/yum/el7/webtatic-release.rpm

3.安装PHP
# yum -y install php72w php72w-cli php72w-common php72w-devel php72w-embedded php72w-gd php72w-mcrypt php72w-mbstring php72w-pdo php72w-xml php72w-fpm php72w-mysqlnd php72w-opcache php72w-pecl-memcached php72w-pecl-redis php72w-pecl-mongodb

4.验证安装是否成功和版本号
#  php -v

5.配置php-fpm用户与nginx的运行用户保持一致
#  sed -i '/^user/c user www' /etc/php-fpm.d/www.conf
#  sed -i '/^group/c group www' /etc/php-fpm.d/www.conf
# uoload_max_filesize=200M
# post_max_size=200M

6.启动php-fpm和加入开机自启
#  systemctl start php-fpm
#  systemctl enable php-fpm

2.3、关联nginx与PHP语法

2.3.1、语法

# fastcgi_pass
Syntax:fastcgi_pass address
Context:location,if in location

设置fastcgi服务器的地址,该地址可以指定为域名、ip地址以及端口
# fastcgi_param
Syntax:fastcgi_param parameter value [if_not_empty];

通过fasrcgi_param设置变量,并将设置的变量传递到后端fastcgi服务器
# fastcgi_index name;
Syntax:fastcgi_index name;
Context:http,server,location

设置fasrcgi默认的首页文件,需要结合fasrcgi_param一起设置

2.3.2、配置

server {
	listen 80;
	server_name www.nginx8.com;
	# client_max_body_size 200M;
	location / {
	root /mnt/kaoshi;
	index index.html index.php;
	}
	location ~* \.php$ {
	fastcgi_pass 127.0.0.1:9000;
	#IP地址为php的地址和端口
	#如果要建立远程连接php,需要更改www.conf中的listen监听的地址,内网和外网都可以。还可以设置允许哪些IP被监听'listen_allow_clinet'
	fastcgi_param SCRIPT_FILENAME /mnt/kaoshi/$fastcgi_script_name;
	include fastcgi_params;
	}
}

#fastcgi_pass  
指定php地址和端口

#fastcgi_param SCRIPT_FILENAME /code/kaoshi/$fastcgi_script_name; 
定义地址变量,固定格式,在中间加上你的文件目录地址
# $document_root 
文件路径变量,代表的是root 后的跟的路径,可以将root /mnt/wordpress 设定在server层,不要单独放在locaotion层,方便以后各个locaotion调用

# include $fastcgi_params;
调用系统设置的变量,提供给上边的变量使用,也可以将此文件中的变量拿出来放在location里面

# 增加 client_max_body_size 200M;可以设置nginx最大上传文件大小。一定在location外面设置。

2.3.3、搭建交作业页面

# 思路:
1.上传交作业系统所需代码文件
2.创建目录,该目录迭代授权www统一用户,文件放在该目录下
3.配置该网页server模块,增加nginx上传文件大小限制命令#(clinet_max_body_size 200M;)
4.php.ini配置文件对文件大小限制进行修改:post_max_size;upload_max_filesize;
5.修改php-fpm/www.conf文件的user和group为www统一用户和nginx.conf的统一用户
6.重启nginx和php-fpm后打开网页上传

# 代码在2.3.2的配置中

2.4、搭建mariadb

2.4.1、安装及启动

# 在mysql主机上安装启动
1.安装
#   yum install -y mariadb-server
2.启动
#	systemctl start mariadb
3.添加自启
#	systemctl enable mariadb
4.验证启动
#	ps -ef | grep mariadb

2.4.2、连接mariadb及设置密码

1.连接mariadb
#	mysql
2.查看数据库
#	show databases;
3.设置密码
#	mysqladmin -uroot passwoed '123'
4.使用密码连接数据库
#    mysql -uroot -p123
5.远程连接数据库
mysql -uroot -p -h 172.16.1.51

2.4.3、修改数据库远程连接权限

#	在mysql命令行中执行:
# MariaDB [(none)]> 
GRANT ALL PRIVILEGES ON wordpress.* TO 'root'@'172.16.1.%' IDENTIFIED BY '123456' WITH GRANT OPTION;
# MariaDB [(none)]> 
FLUSH PRIVILEGES;

#  第一行指令内的密码'123456'需要根据自己设定的密码进行修改

grant		#数据库授权命令
all			#所有命令
on			#在...上面
wordpress	 #worepress下面所有的表,库
to			#给...
wp@'172.16.1.%' #数据库用户
indentified	 #设置密码
by			#密码是...
'123'		#密码内容
;			#命令结束字符

2.4.4、测试PHP和mariadb关联

1.在web主机上编写代码放入wordpress目录下
2.输入网址测试
www.nginx8.com/test.php

数据库测试连接代码

<?php
    $servername = "172.16.1.51";
    $username = "root";
    $password = "123";

    // 创建连接
    $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>

2.4.5、数据库建库和用户授权

# 授权用户
grant all on wordpress.* to wp@'172.16.1.51' identified by '123';
# 查看用户
select user,host from mysql.user;

2.5、搭建wordpress博客

2.5.1、wordpress介绍

WordPress是使用PHP语言开发的博客平台,用户可以在支持PHP和MySQL数据库的服务器上架设属于自己的网站。也可以把 WordPress当作一个内容管理系统(CMS)来使用。

2.5.2、下载、解压、授权

1.下载
# wordpress官网:https://cn.wordpress.org/download/
# 下载链接:https://cn.wordpress.org/latest-zh_CN.tar.gz
wget https://cn.wordpress.org/latest-zh_CN.tar.gz
2.解压
#   tar -xf latest-zh_CN.tar.gz
3.授权
chown -R www.www wordpress
4.编写脚本放在/etc/nginx/conf.d/wordpress.conf
server {
	listen 80;
	server_name www.papacnb.com;
	fastcgi_param SCRIPT_FILENAME /mnt/wordpress/
	location / {
	root /mnt/wordpress;
	index index.html index.php;
  }
	location ~* \.php$ {	
	fastcgi_pass 127.0.0.1:9000;
	fastcgi_patam SCRIPT_FILENA /mnt/wordpress$fastcgi_script_name;
	include fastrcgi_params;	
  }
}
5.重启nginx
systemctl restart nginx
6.创建数据库
create database wencenter;
6.测试网站
7.填写网站基本信息进入主页
ps:主机名和密码使用默认配置mysql时用的,不能有差别

三、拆分数据库

介绍

3.1、为什么要拆分

1.由于单台服务器与逆行LNMP架构会导致网站访问缓慢,当内存被沾满时,很容易导致系统出现 out of memory从而kill掉Mysql数据库,所以要将web和数据库进行独立部署。
2.数据量变大时,一台数据库不能满足业务量需求,也容易出现单点故障,所以需要多个节点。

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

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

3.3、环境准备

主机 IP 部署的服务
web01 172.16.1.7 nginx+php
db01 172.16.1.51 mariadb

3.4、数据库拆分步骤

1.下载安装
#  yum install -y mariadb
2.开启mariadb
#  systemctl start mariadb
3.开机自启
#  systemctl enable mariadb
4.设置密码(在mariadb外设置)
#  mysqladmin -uroot password
5.授权用户远程连接
# grant all on wordpress.* to wp@'172.16.1.%' indentified by '123';
6.测试连接
#  mysql -uwp -p -h 172.16.1.51
7.导出旧数据
#  mysqldump -uroot -p -B wordpress > /tmp/wp.sql
8.将数据导入新数据库
  1)[root@db01 ~]#  mysql -uroot -p < /tmp/wp.sql
  #库外导入
  2)MariaDB [wordpress]> source /tmp/wp.sql;
  #库内读取
  3)MariaDB [wordpress]> source /tmp/wp.sql;
   #任意门方式
9.查看数据
# show databases;    查看数据库
# use wordpress;	查看单个数据库表
# show tables;		查看表内数据
10.修改项目中数据库的地址
vim /mnt/wordpress/wp-config.php
11.测试

四、扩展web服务器

4.1、环境准备

主机 IP 部署服务
web01 172.16.1.7 nginx+php
web02 172.16.1.8 nginx+php
web03 172.16.1.9 nginx+php
db01 172.16.1.5 mariadb

4.2、下载安装nginx+php

1.下载安装nginx和php
2.创建统一用户

4.3、推送配置文件和站点代码包

1.推送web01上nginx和php-fpm的配置文件到web02
# scp -rp /etc/nginx/conf.d root@172.16.1.8:/etc/nginx/conf.d/
# scp -rp /etc/php-fpm.d root@172.16.1.8:/etc/php-fpm.d/
2.推送站点代码包到web02上
# scp -rp /mnt/wordpress/ root@172.16.1.8://mnt/wordpress/
3.站点目录授权
chown -R www.www /mnt/wordpress
4.修改本地hosts访问测试

五、搭建文件共享

5.1、环境准备

主机 IP 部署服务
web01 172.16.1.7 nginx+php
web02 172.16.1.8 nginx+php
web03 172.16.1.9 nginx+php
nfs 172.16.1.31 nfs+rpcbind

5.2、搭建NFS服务器

1.安装nfs-server+rpcbind
# yum install -y nfs-server rpcbind
2.创建挂载目录
# mkdir /data/wordpress
3.配置NFS
# vim /etc/export
/data/wordpress 172.16.1.0/24(rw,sync,all_squash,anonuid=666,anongid=666)
4.创建统一用户
groupadd www -g 666
useradd www -u 666 -g 666 -M -s /sbin/nologin/
5.授权目录
# chown -R www.www /data/wordpress
6.启动nfs-server和rpcbind和添加自启
# systemctl start nfs-server rpcbind
# systemctl enable nfs-sercer rocbind

5.3、配置客户端

1.查看挂载点
# showmount -e 172.16.1.31
2.将文件同步到nfs服务端挂载目录中
#  rsync -avz /mnt/wordpress 172.16.1.31:/data/wordpress/
3.挂载
mount -t nfs 172.16.1.31:/data/wordpress

六、Nginx反向代理

6.1、基本概述

什么是代理?

代理是在现实生活中经常遇到,代理理财,代理租房,代理收货等等

如果没有代理

在没有代理模式下,客户端和Nginx服务端,都是客户端直接请求服务端,服务端直接响应客户端。

企业场景

在互联网请求里面,客户端往往无法直接向服务端发起请求,需要用到代理服务,来实现客户端和服务端通信

正向代理和反向代理

1.正向代理
客户端<-->代理-->服务端(内部上网)
2.反向代理
客户端-->代理<-->服务端(公司集群架构中)
# 区别
1.形式上服务的 对象 不一样
2.正向代理的对象是客户端,为客户端服务
3.反向代理的 对象 是服务端,为服务端服务

Nginx代理服务支持的协议

反向代理使用的协议

模块总结

反向代理模式 Nginx配置模块
http、websocket、https ngx_http_proxy_module
fastcgi ngx_http_fastcgi_module
uwsgi ngx_http_uesgi_module
grpc ngx_http_va_module

6.2、环境准备

主机 IP 部署服务
web01 172.16.1.7 nginx+php
web02 172.16.1.2 nginx+php
web03 172.16.1.9 nginx+php
lb01 172.16.1.5 nginx

6.3、负载均衡服务器部署lb01

1.安装nginx
# yum -y install nginx
2.配置nginx
# 修改nginx统一用户
3.创建统一用户
groupadd www -g 666
useradd www -u 666 -g 666 -M -s /sbin/nologin
4.配置IP连接池文件
# web01-03服务都已经搭好了一个网站可以正常访问的前提下

# cat /etc/nginx/conf.d/daili.conf
upstream web {
	server 172.16.1.7;
	server 172.16.1.8;
	server 172.16.1.9;
}
server {
	listen 80;
	server_name www.papacnb.com;
	location  {
	proxy_pass http://web;
	}
}
5.配置本地hosts文件访问
172.16.1.5 www.papacnb.com


ps: 1.需要将windows本地hosts文件所有的地址解析关掉,只留下nginx反向代理的解析
2.所有/etc/nginx/conf.d/目录下的conf结尾的文件需要移走,因为反向解析的是IP地址,web端所有的访问都是以域名的方式进行的,会匹配不到IP地址,自动选择排序第一的conf文件,造成显示是我们不需要的页面
上一篇:由于更换域名或者IP变更导致WordPressg无法进入后台的问题解决办法


下一篇:WordPress安装配置