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文件,造成显示是我们不需要的页面