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和数据库进行独立部署。
拆分数据库能解决什么问题
- 缓解web网站的压力;
- 增强数据库读写性能;
- 提高用户访问的速度;
5.2 数据库拆分架构演变
5.3 环境准备
主机名 | 应用环境 | 外网 | 内网 |
---|---|---|---|
web01 | nginx+php | 10.0.0.7 | 172.16.1.7 |
db01 | mysql(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架构的主要内容,如果未能解决你的问题,请参考以下文章