LNMP架构

Posted 我学习我快乐Linux

tags:

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

文章目录

一、LNMP架构基本概念

1.1 什么是LNMP

  • LNMP 是一套技术的组合,L=Linux、N=nginx、M=[mysql8.0|Mariadb5.5]、P=[php|Python]
  • nginx仅支持解析html文件;图片传输;视频传输;不支持 php、python、java等脚本文件

1.2 LNMP实现过程

当用户请求http://www.bertwu.com/index.php时,对于nginx服务器而言,是无法处理.php这样的脚本,那么nginx如何配置,才支持这样的动态请求呢?
第一步:当用户发起 HTTP 请求,请求首先被 Nginx 接收;
第二步:Nginx 通过预先定义好的 location 规则进行匹配;
第三步:Nginx 将匹配到的动态内容,通过 fastcgi 协议传到给后端的 php 应用服务处理

1.3 LNMP实现细节

1.用户首先通过 http 协议发起请求,请求会先抵达Nginx;
2.Nginx 根据用户的请求进行 Location 规则匹配;
3.Location 如果匹配到请求是静态,则由 Nginx 读取本地直接返回;
4.Location如果匹配到请求是动态,则由Nginx将请求转发给fastcgi协议;
5.fastgi收到后会将请求交给php-fpm管理进程;
6.php-fpm管理进程接收到后会调用具体的worker工作进程, worker进程会调用php解析器解析代码,php解析后直接返回
7.如果有查询数据库操作,则由php连接数据库(用户 密码 IP)发起查询的操作
8.用户->http->nginx->fastcgi->php-fpm->php->tcp->mysql
9.最终数据由mysql->tcp->php->php-fpm->fastcgi->nginx->http->user

二、LNMP架构环境安装

2.1 nginx安装

1.使用官方仓库安装Nginx
详见:nginx安装
2.配置 Nginx 进程运行用户

[root@web01 nginx]# groupadd -g 666 www
[root@web01 nginx]# useradd -u 666 -g 666 www
[root@web01 nginx]sed -i '/^user/c user www;' /etc/nginx/nginx.conf

3.启动nginx,并加入开机自启

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

2.2 php安装

方式1. 手动新增 repo 文件,但是速度很慢,建议本地安装

# 手动配置yum源
[root@oldxu ~]# 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

2.卸载系统中存在的低版本php

[root@web01 ~]# yum remove php-mysql-5.4 php php-fpm php-common

3.安装高版本的 php

[root@oldxu ~]# 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

方式2. 下载包到本地,上传服务器解压到~目录,执行命令(推荐这种方式)
php下载:
链接:https://pan.baidu.com/s/1xFqGMSywuY7Pe4CHVETc_Q
提取码:nlgp
安装:

[root@web01 ~]# yum localinstall ~/php/*.rpm

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

[root@web01 ~]# sed -i '/^user/c user = www' /etc/php-fpm.d/www.conf 
[root@web01 ~]# sed -i '/^group/c group = www' /etc/php-fpm.d/www.conf

5.启动php-fpm 并将其加入开机自启

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

2.3 MySQL安装

1.安装 Mariadb 数据库

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

2.启动 Mariadb 数据库, 并加入开机自动

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

3.查看是否启动成功

[root@web01 nginx]# netstat -lntp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 127.0.0.1:9000          0.0.0.0:*               LISTEN      12022/php-fpm: mast 
tcp        0      0 0.0.0.0:3306            0.0.0.0:*               LISTEN      12388/mysqld        
tcp        0      0 0.0.0.0:111             0.0.0.0:*               LISTEN      538/rpcbind         
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      1353/nginx: master  
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      875/sshd            
tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN      1018/master         
tcp6       0      0 :::111                  :::*                    LISTEN      538/rpcbind         
tcp6       0      0 :::22                   :::*                    LISTEN      875/sshd            
tcp6       0      0 ::1:25                  :::*                    LISTEN      1018/master         
[root@web01 nginx]# 

可以看到mysql在3306端口,php监听在127.0.0.1:9000上是为了减少本机随机端口的损耗。

三、LNMP架构环境配置

在配置 Nginx 与 PHP 集成之前, 我们需要先了解 Nginx 的 Fastcgi 代理配置语法

3.1 Fastcgi代理语法

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

Syntax: fastcgi_pass address;
Default: —
Context: location, if in location

#语法示例
fastcgi_pass localhost:9000;

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 $document_root$fastcgi_script_name;

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

3.2 Nginx集成PHP

1.创建php.conf文件

[root@web01 ~]# cat /etc/nginx/conf.d/php.conf 
server {
	listen 80;
	server_name php.bertwu.com;
	root /code/php;
	location / {
		index index.php index.html;
	}

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

2.创建/code目录修改属组属主为www用户

[root@web01 ~]# chown -R www.www /code

3.创建/code/php/index.php文件

[root@web01 php]# cat /code/php/index.php 
<?php
	phpinfo();
?>
[roo

[root@web01 ~]# systemctl reload nginx

4.修改win hosts文件,然后浏览器访问 http://php.bertwu.com/

3.3 PHP集成MySQL

1.安装mysql见上文mariadb
2. 为默认用户root设置密码

[root@web01 ~]# mysqladmin password '123456'

3.登录

[root@web01 ~]# mysql -u root -p 123456
MariaDB [(none)]> show databases; # 查看系统默认的库
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| test               |
+--------------------+
4 rows in set (0.00 sec)

MariaDB [(none)]> use test; # 选择库
Database changed
MariaDB [test]> show tables; # 查看test库中的表

Empty set (0.00 sec)

MariaDB [test]> 

4.编写php脚本测试连接mysql数据库,如果能成功,说明php与mysql的集成环境搭建成功。

[root@web01 ~]# cat /code/php/mysqli.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数据库成功";
?>

5.使用 php 命令直接解析文件


[root@web01 ~]# php /code/php/mysqli.php 
php连接MySQL数据库成功

6.也可以通过浏览器访问 /mysqli.php 文件,获取解析结果

四、LNMP架构在单台主机上部署开源产品

4.1 部署开源知乎产品Wecenter

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

[root@web01 conf.d]# cat zh.conf 
server {
	listen 80;
	server_name zh.bertwu.net;
	root /code/zh;
	
	location / {		
		index index.php index.html;
	}
	
	location ~ .*\\.php$ {
		fastcgi_pass 127.0.0.1:9000;
		fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
		include fastcgi_params;
	}
}

2.检查语法,重新启动nginx

[root@web01 conf.d]# nginx -t
[root@web01 conf.d]# systemctl restart nginx

3.下载Wecenter
4. 解压到/code/zh目录,并且修改权限

[root@web01 ~]# chown -R www.www /code/zh

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

[root@oldxu ~]# mysql -uroot -p123456
mysql> create database zh;
mysql> exit

6.配置hosts文件,浏览器访问zh.bertwu.net


4.2 部署开源博客系统wordpress

1.获取wordpress产品,解压并部署 wordress
wordpress官网
或者用wget下载

[root@web01 ~]# wget https://cn.wordpress.org/latest-zh_CN.tar.gz

2.解压到 /code/目录下,解压后本身就带wordpress文件夹,所以不需要手动创建

[root@web01 ~]# tar -xf latest-zh_CN.tar.gz -C /code

3.授权目前目录的权限与进程运行身份保持一致,php,nginx服务都应该用相同的(www用户)身份运行,避免权限过低

[root@web01 ~]# chown -R www.www /code/wordpress/

4.nginx站点配置

[root@web01 conf.d]# cat wordpress.conf 
server {
	listen 80;
	server_name blog.bertwu.net;
	client_max_body_size 100m;
	root /code/wordpress;
	charset utf-8;
	location / {
		index index.php index.html;
	}
	location ~ .*\\.php$ {
		fastcgi_pass 127.0.0.1:9000;
		fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
		include /etc/nginx/fastcgi_params;
	}
}

5.检测语法,并重启 nginx 服务

[root@web01 conf.d]# nginx -t
[root@web01 conf.d]# systemctl restart nginx

6.配置MySQL
由于wordpress产品需要依赖数据库, 所以需要手动建立数据库

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

7.配置hosts文件,浏览器访问blog.bertwu.net

4.3 部署相亲站点OElove

1.下载软件包OElove官网
也可以命令行下载

[root@web01 ~]# wget http://dl.oephp.com/oelove/source/OElove_Free_v8.1.R210428.zip

2.解压到/code/love目录(解压后自己带了个目录upload,建议先解压到/tmp中,然后再手动移动到/code/love中),并修改权限

[root@web01 tmp]# chown -R www.www /code/love

3.配置nginx站点

[root@web01 conf.d]# cat love.conf 
server {
	listen 80;
	server_name love.bertwu.net;
	root /code/love;
	charset utf-8;
	location / {
		index index.php index.html;
	}
	location ~ .*\\.php$ {
		fastcgi_pass 127.0.0.1:9000;
		fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
		include /etc/nginx/fastcgi_params;
	}
}

4.检测语法,并重启 nginx 服务

[root@web01 conf.d]# nginx -t
[root@web01 conf.d]# systemctl restart nginx

5.配置mysql,创建love数据库

[root@oldxu ~]# mysql -uroot -p123456
mysql> create database love;
mysql> exit

6.配置hosts文件,浏览器访问love.bertwu.net
根据安装向导页面展示的实验数据地址下载实验数据,解压到/code/love目录中,以便于显示网站上的图片。

[root@web01 tmp]# wget http://dl.oephp.com/data/free_data.zip
[root@web01 tmp]# unzip free_data.zip -d /code/love

8.访问

4.4 部署商城网站ShopXO

1.下载ShopXO官网
也可以命令下载

[root@web01 202108]# wget https://gitee.com/zongzhige/shopxo/repository/archive/v2.1.0.zip

2.解压到/code/shop目录,并修改权限

[root@web01 tmp]# chown -R www.www /code/shop

3.配置nginx站点

[root@web01 conf.d]# cat shop.conf 
server {
	listen 80;
	server_name shop.bertwu.net;
	charset utf-8;
	root /code/shop;
	location / {
		index index.php index.html;
	}
	location ~ .*\\.php$ {
		fastcgi_pass 127.0.0.1:9000;
		fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
		include /etc/nginx/fastcgi_params;
	}
}

4.检测语法,并重启 nginx 服务

[root@web01 conf.d]# nginx -t
[root@web01 conf.d]# systemctl restart nginx

5.配置mysql,创建shop数据库

[root@oldxu ~]# mysql -uroot -p123456
mysql> create database shop;
mysql> exit

6.修改hosts文件,访问站点shop.bertwu.net

7.报错解决方案
/code/shop/runtime/log/当天日期的 .log 文件中查看错误信息

[ 2021-08-15T14:38:44+08:00 ] 10.0.0.1 GET shop.bertwu.net/admin.php
[ error ] [2]session_start(): open(/var/lib/php/session/sess_0a394ba31263333b5af7cc3459be7dd9, O_RDWR) failed: Permission denied (13)

发现没有权限,于是可以修改权限

[root@web01 202108]# pwd
/code/shop/runtime/log/202108
[root@web01 202108]# ll -d /var/lib/php/session/
drwxrwx--- 2 root apache 6 Sep 12  2019 /var/lib/php/session/
[root@web01 202108]# chown -R www.www /var/lib/php/session/

8.再次访问,成功。

五、LNMP架构多台主机部署开源项目

5.1 拆分数据库至独立服务器

为何要拆分数据库

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

拆分数据库能解决什么问题

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

5.2 数据库拆分架构演变

5.3 环境准备

主机名应用环境外网内网
web01nginx+php10.0.0.7172.16.1.7
db01mysql(mariadb)172.16.1.51

5.4 数据库实现步骤

5.4.1 web服务操作如下

1.备份 web01 上的数据库

[root@web01 ~]# mysqldump -uroot -p123456 --all-databases > /tmp/data.sql

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

[root@web01 ~]# rsync  -avz  /tmp/data.sql root@172.16.1.51:/root
或者
[root@web01 ~]# scp  /tmp/data.sql root@172.16.1.51:/root

5.4.2 数据库服务器db01操作如下

1.安装mariadb数据库,并加入开机自启

[root@db01 ~]## yum install mariadb mariadb-server
[root@db01 ~]# systemctl start mariadb
[root@db01 ~]# systemctl enable mariadb
[root@db01 ~]# netstat -lntp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN      995/master          
tcp        0      0 0.0.0.0:3306            0.0.0.0:*               LISTEN      1542/mysqld         
tcp        0      0 0.0.0.0:111             0.0.0.0:*               LISTEN      567/rpcbind  

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

[root@db01 ~]# mysql -uroot < /root/data.sql 

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

[root@db01 ~]# systemctl restart mariadb
[root@db01 ~]# mysql -uroot -p123456
MariaDB [(none)]> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| love               |
| mysql              |
| performance_schema |
| shop               |
| test               |
| wordpress          |
| zh                 |
+--------------------+
8 rows in set (0.00 sec)

MariaDB [(none)]> 

3.在新数据库上授权,允许172.16.1.%网段,通过 web01 账户密码123456连接并操作该数据库
因为mysql默认不支持远程连接,需要创建一个新用户并开启远程连接的权限。

# 默认没开启远程连接权限,所以在web01上是无法连接的
[root@web01 tmp]# mysql -h 172.16.1.51 -uroot -p123456
ERROR 1130 (HY000): Host '172.16.1.7' is not allowed to connect to this MariaDB server


# 在db01上开启远程连接权限(当然也可以先创建用户,后授予权限)
MariaDB [(none)以上是关于LNMP架构的主要内容,如果未能解决你的问题,请参考以下文章

用lnmp架构部署wordpress网站详细步骤

用lnmp架构部署wordpress网站详细步骤

LNMP架构搭建Discuz论坛(实战!)

LNMP架构的搭建Discuz论坛的搭建

电商平台 lnmp 架构之 nginx+tomcat

电商平台 lnmp 架构之 nginx+tomcat