背景
php是世界上最好的语言!!(纯开玩笑,不引战....哈哈哈),前面几章节我们说了nginx的安装,nginx的模块介绍,nginx的反向代理和负载均衡,今天我们把前面的内容做个小总结,后面我们将用LNMP架构来回顾前面的知识。
LNMP介绍
1. 什么是LNMP
LNMP 是一套技术的组合,L=Linux、N=Nginx、M=[MySQL/Mariadb]、P=[PHP/Python]
nginx仅支持解析html文件;图片传输;视频传输;不支持 php、python、java等脚本文件,因此php,python都是nginx通过fastcgi,uwcgi协议来转发的,java这是通过tomcat。
php在之前一度都是非常火热的,只是在这几年中慢慢开始沉沦,由于php的架构相对来说比较简单,所以今天的示例我们将用php来做实验。
2. 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部署
1. Nginx安装及配置
1.1 安装Nginx
安装详细步骤:Nginx安装
1.2 配置Nginx
## 创建php访问目录
root@web1:~# mkdir /php
## 启动nginx
root@web1:~# systemctl restart nginx
root@web1:~# systemctl enable nginx
2. PHP安装及配置
2.1 安装PHP
由于是实验环境,为了方便我们直接通过apt命令安装。
## 添加php的镜像源
root@web1:~# sudo apt-add-repository ppa:ondrej/php
## 更新镜像源
root@web1:~# sudo apt update
## 安装php
root@web1:~# sudo apt install -y php8.1
## 启动php
root@web1:~# systemctl start php8.1-fpm
2. 2 修改配置
该版本的php默认不是监听在127.0.0.1:9000的上,而是监听在pid的文件上,为了后续Nginx的配置,我们需要修改监听方式。
1. 修改监听端口
root@web1:~# grep 'listen = 9000' /etc/php/8.1/fpm/pool.d/www.conf
listen = 9000
root@web1:~#
2. 重启php8.1-fpm服务。
3. 查看监听是否正常
root@web1:~# netstat -ntpl |grep 9000
tcp6 0 0 :::9000 :::* LISTEN 34493/php-fpm: mast
root@web1:~#
3. 配置nginx的fastcgi转发
server {
listen 80;
server_name www.php_test.com php_test.com;
access_log /var/log/nginx/php.access.log main;
root /php;
location / {
index index.html index.htm index.php;
}
location ~ .*\.php$ {
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_pass 127.0.0.1:9000;
}
}
4. 创建index.php文件
[root@web01 php]# cat /php/index.php
<?php
phpinfo();
?>
[root@web01 ~]# systemctl restart nginx
5. 访问
6. 总结
当用户请求http://www.php_test.com/index.php时,对于nginx服务器而言,是无法处理.php这样的脚本。
1)当用户发起 HTTP 请求,请求首先被 Nginx 接收;
2) Nginx 通过预先定义好的 location 规则进行匹配;
3) Nginx 将匹配到的动态内容,通过 fastcgi 协议传到给后端的 php 应用服务处理。
7. Mysql安装
同样的,为了方便,通过apt命令安装mariadb
## 安装mariadb
root@web1:~#sudo apt install mariadb-server
## 初始化数据库,设置root密码
root@web1:~#mysql_secure_installation
## 修改mysql监听0.0.0.0,默认为127.0.0.1
root@web3:/etc/mysql/mariadb.conf.d# grep bind-address 50-server.cnf
bind-address = 0.0.0.0
## 创建php连接的数据库用户
MariaDB>create user 'test'@'%' indentified by 'qwer123!!';
# 赋予用户权限
MariaDB >grant all on *.* to 'test'@'%';
8. 测试数据库是否能正常连接
<?php
$servername = '192.168.65.132';
$username = 'test';
$password = 'qwer123!!';
$dbname = 'php_test';
// 创建连接
$conn = mysqli_connect($servername,$username,$password,$dbname);
// 检查连接
if (!$conn) {
die("Connection failed: " . mysqli_connect_error());
}
echo "php连接MySQL数据库成功";
?>
测试成功
root@web1:/php# php8.1 index.php
php连接MySQL数据库成功
root@web1:/php#
注意:
通过apt的命令安装php的时候没有安装php8.1-mysql的模块,所以在连接的时候可能会报错,只需要执行sudo apt install php8.1-mysql即可。
root@web1:/php# php8.1 index.php
PHP Fatal error: Uncaught Error: Call to undefined function mysqlli_connect() in /php/index.php:7
Stack trace:
#0 {main}
thrown in /php/index.php on line 7
单节点部署wordpress
wordpress就是基于LNMP的架构,我么只需要下载wordpress的代码存放在/php的相关目录下即可。
## 下载wordpress代码
root@web1:/php/wordpress# wget https://cn.wordpress.org/latest-zh_CN.tar.gz -O /php
## 解压
root@web1:/php/wordpress# tar -xvf latest-zh_CN.tar.gz
root@web1:/php/wordpress# ll
total 224
drwxr-xr-x 5 www-data www-data 4096 8月 29 12:31 ./
drwxr-xr-x 3 www-data www-data 4096 8月 29 13:57 ../
-rw-r--r-- 1 www-data www-data 405 2月 6 2020 index.php
-rw-r--r-- 1 www-data www-data 19915 1月 1 2022 license.txt
-rw-r--r-- 1 www-data www-data 7401 3月 23 05:11 readme.html
-rw-r--r-- 1 www-data www-data 7165 1月 21 2021 wp-activate.php
drwxr-xr-x 9 www-data www-data 4096 8月 15 17:00 wp-admin/
-rw-r--r-- 1 www-data www-data 351 2月 6 2020 wp-blog-header.php
-rw-r--r-- 1 www-data www-data 2338 11月 10 2021 wp-comments-post.php
-rw-rw-rw- 1 www-data www-data 3283 8月 29 12:31 wp-config.php
-rw-r--r-- 1 www-data www-data 3001 12月 14 2021 wp-config-sample.php
drwxr-xr-x 6 www-data www-data 4096 8月 29 12:36 wp-content/
-rw-r--r-- 1 www-data www-data 3943 4月 28 17:49 wp-cron.php
drwxr-xr-x 26 www-data www-data 12288 8月 15 17:00 wp-includes/
-rw-r--r-- 1 www-data www-data 2494 3月 20 04:31 wp-links-opml.php
-rw-r--r-- 1 www-data www-data 3973 4月 12 09:47 wp-load.php
-rw-r--r-- 1 www-data www-data 48498 4月 29 22:36 wp-login.php
-rw-r--r-- 1 www-data www-data 8577 3月 23 00:25 wp-mail.php
-rw-r--r-- 1 www-data www-data 23706 4月 12 17:26 wp-settings.php
-rw-r--r-- 1 www-data www-data 32051 4月 11 19:42 wp-signup.php
-rw-r--r-- 1 www-data www-data 4748 4月 11 19:42 wp-trackback.php
-rw-r--r-- 1 www-data www-data 3236 6月 9 2020 xmlrpc.php
root@web1:/php/wordpress#
## 按照提示配置连接的数据库
访问
多节点部署wordpress
再搭建一台wordpress服务器,见上述配置(与上述配置一致),由于第一台服务器已经连接了数据库,我们直接复制/php/wordpress下所有配置好的配置文件到第二台服务器的/php/wordpress中即可。
1. 配置Nginx负载均衡节点
upstream webs{
server 192.168.65.130:8081;
server 192.168.65.131:80;
}
server {
listen 80;
server_name php_test.com www.php_test.com;
access_log /var/log/nginx/php.access.log main;
location / {
proxy_pass http://webs;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
客户端访问:
查看两台wordpress服务器的访问日志,如下: