1.架构概述
1.1 什么是LNMP
LNMP是一套技术的组合,L=Linux、N=Nginx、M~=MySQL、P~=PHP
1.2 工作原理
首先Nginx服务是不能处理动态请求,那么当用户发起动态请求时, Nginx又是如何进行处理的。
当用户发起http请求,请求会被Nginx处理,如果是静态资源请求Nginx则直接返回,如果是动态请求Nginx则通过fastcgi协议转交给后端的PHP程序处理,具体如下图所示
1.3 工作流程
- 用户通过http协议发起请求,请求会先抵达LNMP架构中的Nginx
- Nginx会根据用户的请求进行Location规则匹配
- Location如果匹配到请求是静态,则由Nginx读取本地直接返回
- Location如果匹配到请求是动态,则由Nginx将请求转发给fastcgi协议
- fastcgi收到后会将请求交给php-fpm管理进程,php-fpm管理进程接收到后会调用具体的工作进程warrap
- warrap进程会调用php程序进行解析,如果只是解析代码,php直接返回
- 如果有查询数据库操作,则由php连接数据库(用户 密码 IP)发起查询的操作
- 最终数据由mysql->php->php-fpm->fastcgi->nginx->http->user
2、环境部署
2.1 安装nginx
``` vim /etc/yum.repos.d/nginx.repo
[nginx-stable] name=nginx stable repo baseurl=http://nginx.org/packages/centos/$releasever/$basearch/ gpgcheck=1 enabled=1 gpgkey=https://nginx.org/keys/nginx_signing.key module_hotfixes=true
[nginx-mainline] name=nginx mainline repo baseurl=http://nginx.org/packages/mainline/centos/$releasever/$basearch/ gpgcheck=1 enabled=0 gpgkey=https://nginx.org/keys/nginx_signing.key module_hotfixes=true
```bash
# 默认情况下,使用稳定的nginx包存储库。如果你想使用nginx主线包,运行以下命令:
sudo yum-config-manager --enable nginx-mainline
2.2 nginx用户
groupadd -g666 www
useradd -u666 -g666 www
sed -i '/^user/c user www;' /etc/nginx/nginx.conf
2.3 安装启动
yum install nginx -y
systemctl enable nginx
systemctl start nginx
# 验证
# 查询版本
nginx -v
# 查询版本以及编译参数
nginx -V
2.4 安装php7.1
#不要安装如下rpm会导致失败
# rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
# rpm -Uvh https://mirror.webtatic.com/yum/el7/webtatic-release.rpm
yum remove php-mysql-5.4 php php-fpm php-common
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
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.5 php用户
配置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
2.6 启动php-fpm
systemctl start php-fpm
systemctl enable php-fpm
2.7 安装Mariadb
yum install mariadb-server mariadb -y
# 启动
systemctl start mariadb && systemctl enable mariadb
# 配置登陆密码
mysqladmin password '123456'
mysql -uroot -p123456
3、环境配置
在将Nginx与PHP集成过程中, 需要先了解 Fastcgi代理配置语法
3.1 fastcgi配置
设置fastcgi服务器的地址,该地址可以指定为域名或IP地址,以及端口
Syntax: fastcgi_pass address; Default: — Context: location, if in location #语法示例 fastcgi_pass localhost:9000; fastcgi_pass unix:/tmp/fastcgi.socket;
设置fastcgi默认的首页文件,需要结合fastcgi_param一起设置
Syntax: fastcgi_index name; Default: — Context: http, server, location
通过fastcgi_param设置变量,并将设置的变量传递到后端的fastcgi服务器
Syntax: fastcgi_param parameter value [if_not_empty]; Default: — Context: http, server, location #语法示例 fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME /code$fastcgi_script_name;
通过图形方式展示fastcgi_index与fastcgi_param作用
最终Nginx连接Fastcgi服务器配置如下
cat /etc/nginx/conf.d/php.conf server { server_name php.oldboy.com; listen 80; root /code; index index.php index.html; location ~ \.php$ { root /code; fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } }
在/code目录下创建info.php文件,测试能否通过浏览器访问,访问成功如下图
cat /code/info.php <?php phpinfo(); ?>
在/code目录下创建mysqli.php文件,填入对应的数据库IP、用户名、密码
cat /code/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数据库成功"; ?>
最后通过浏览器访问/mysqli.php文件,如成功访问如下图
3.2 Wordpress
配置Nginx虚拟主机站点,域名为blog.bgx.com
#1.nginx具体配置信息 [root@nginx ~]# cat /etc/nginx/conf.d/wordpress.conf server { listen 80; server_name blog.bgx.com; root /code/wordpress; index index.php index.html; location ~ \.php$ { fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } }
重启nginx服务
systemctl restart nginx
获取wordpress产品,解压并部署wordress
mkdir /code cd /code wget https://cn.wordpress.org/wordpress-4.9.4-zh_CN.tar.gz tar xf wordpress-4.9.4-zh_CN.tar.gz chown -R www.www /code/wordpress/
由于wordpress产品需要依赖数据库, 所以需要手动建立数据库
mysql -uroot -p123456 mysql> create database wordpress; mysql> exit
通过浏览器访问wordpress, 并部署该产品
3.3 知乎产品Wecenter
配置Nginx虚拟主机站点,域名为zh.bgx.com
cat /etc/nginx/conf.d/zh.conf server { listen 80; server_name zh.bgx.com; root /code/zh; index index.php index.html; location ~ \.php$ { root /code/zh; fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } } #重启nginx服务 systemctl restart nginx
下载Wecenter产品,部署Wecenter并授权
wget http://ahdx.down.chinaz.com/201605/WeCenter_v3.2.1.zip unzip WeCenter_v3.1.9.zip mv UPLOAD/ /code/zh chown -R www.www /code/zh/
由于wecenter产品需要依赖数据库, 所以需要手动建立数据库
mysql -uroot -p123456 #登陆数据库 MariaDB [(none)]> create database zh; #创建zh数据库 MariaDB [(none)]> exit
通过浏览器访问网站
4、分布式配置
4.1 独立数据库
- 为什么要进行数据库的拆分
由于单台服务器运行LNMP架构会导致网站访问缓慢,当内存被吃满时,很容易导致系统出现oom,从而kill掉MySQL数据库,所以需要将web和数据库进行独立部署。
- 数据库拆分后解决了什么问题
- 缓解web网站的压力
- 增强数据库读写性能
- 提高用户访问的速度
- 数据库拆分架构演变过程,如下图所示
- 数据库拆分环境规划 | 主机名称 | 应用环境 | 外网地址 | 内网地址 | | —- | —- | —- | —- | | web01 | nginx+php | 10.0.0.7 | 172.16.1.7 | | db01 | mysql | | 172.16.1.51 |
4.2 拆分步骤
1.web01网站服务器操作如下
1) 备份web01上的数据库,123456是数据库密码
mysqldump -uroot -p'123456' --all-databases --single-transaction > mysql-all.sql
2) 将web01上备份的数据库拷贝至db01服务器上
scp mysql-all.sql root@172.16.1.51:/tmp
2.db01数据库服务器操作如下
1) 将web01服务器上推送的数据库备份文件恢复至db01服务器新数据库中
yum install mariadb mariadb-server -y
systemctl start mariadb && systemctl enable mariadb
mysql -uroot -p'123456' < /tmp/mysql-all.sql
2) 数据库导入完成后,重启数据库,使用新密码进行登录,并检查数据库已被导入成功
systemctl restart mariadb
mysql -uroot -p123456
mysql> show databases;
3) 在新数据库上授权, 允许所有网段, 通过all账户连接并操作该数据库
#授权所有权限 grant all privileges
#授权所有库所有表 *.*
#将授权赋予给哪个用户,这个用户只能通过哪个网段过来(%所有) 'all'@'%'
#授权该用户登录的密码 identified by
mysql> grant all on *.* to all@'%' identified by '123456';
Query OK, 0 rows affected (0.00 sec)
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)
3.web01修改代码连接新数据库环境
1) 修改Wordpress产品代码连接数据库的配置文件
vim /code/wordpress/wp-config.php
# 数据库名称
define('DB_NAME', 'wordpress');
# 数据库用户
define('DB_USER', 'all');
# 数据库密码
define('DB_PASSWORD', '123456');
# 数据库地址
define('DB_HOST', '172.16.1.51');
2) 修改wecenter产品代码连接数据库的配置文件
[root@web01 zh]# grep -iR "123456"|grep -v cache
system/config/database.php: 'password' => '123456',
[root@web01 zh]# vim /code/zh/system/config/database.php
'host' => '172.16.1.51',
'username' => 'all',
'password' => '123456',
'dbname' => 'zh',
4.3 扩展Web
- 为什么要扩展多台web节点
单台web服务器能抗住的访问量是有限的,配置多台web服务器能提升更高的访问速度。
- 扩展多台web解决了什么问题
- 单台web节点如果故障,会导致业务down机
- 多台web节点能保证业务的持续稳定,扩展性高
- 多台web节点能有效的提升用户访问网站的速度
- 多台web节点技术架构组成,如下图所示
快速扩展一台web节点环境规划 | 主机名称 | 应用环境 | 外网地址 | 内网地址 | | —- | —- | —- | —- | | web01 | nginx+php | 10.0.0.7 | 172.16.1.7 | | web02 | nginx+php | 10.0.0.8 | 172.16.1.8 | | db01 | mysql | | 172.16.1.51 |
快速扩展一台web节点详细步骤
通过web01现有环境快速的扩展一台web02的服务器,数据库统一使用db01
1) 创建www用户
groupadd -g666 www
useradd -u666 -g666 www
2) 安装LNP
scp -rp root@172.16.1.7:/etc/yum.repos.d/* /etc/yum.repos.d/
scp -rp root@172.16.1.7:/etc/pki/rpm-gpg/* /etc/pki/rpm-gpg/
yum install nginx -y
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
3) 将web01的nginx配置文件导入到web02
scp -rp root@172.16.1.7:/etc/nginx /etc/
4) 将web01的php配置文件导入到web02
scp -rp root@172.16.1.7:/etc/php-fpm.d /etc/
5) 将web01的产品代码打包传输到web02服务器上,在web1上线进行打包操作
tar czf code.tar.gz /code
scp code.tar.gz root@172.16.1.8:/tmp
#在web02服务器上进行解压
tar xf /tmp/code.tar.gz -C /
6) 最后启动nginx与php-fpm,并加入开机自启
systemctl start nginx php-fpm
systemctl enable nginx php-fpm
4.4 静态资源
- 为什么拆分静态资源至独立存储服务器
当后端的web节点出现多台时,会导致用户上传的图片、视频附件等内容仅上传至一台web服务器,那么其他的web服务器则无法访问到该图片。
- 新增一台nfs存储解决了什么问题
- 保证了多台web节点静态资源一致
- 有效节省多台web节点的存储空间
- 统一管理静态资源,便于后期推送至CDN进行静态资源加速
- 多台web节点技术架构组成,如下图所示
快速扩展一台web节点环境规划 | 主机名称 | 应用环境 | 外网地址 | 内网地址 | | —- | —- | —- | —- | | web01 | nginx+php | 10.0.0.7 | 172.16.1.7 | | web02 | nginx+php | 10.0.0.8 | 172.16.1.8 | | nfs | nfs | | 172.16.1.31 | | db01 | mysql | | 172.16.1.51 |
快速扩展一台web节点详细步骤
1.nfs服务端,操作步骤如下
1) 安装并配置nfs
yum install nfs-utils -y
cat /etc/exports
/data/blog 172.16.1.0/24(rw,sync,all_squash,anonuid=666,anongid=666)
/data/zh 172.16.1.0/24(rw,sync,all_squash,anonuid=666,anongid=666)
2) 创建共享目录,并进行授权
mkdir /data/{blog,zh} -p
chown -R www.www /data/
3) 启动nfs服务,并加入开机自启
systemctl restart nfs-server
2.web01端操作步骤如下
1) web01节点安装nfs,然后使用showmount查看服务端共享的资源
yum install nfs-utils -y
showmount -e 172.16.1.31
Export list for 172.16.1.31:
/data/zh 172.16.1.0/24
/data/blog 172.16.1.0/24
2) 如何查找Wordpress静态资源存放的位置
浏览器->右键->检查->Network->选择左上角的Select按钮->点击对应的图片,然后能获取到对应的url地址,如下
# http://blog.oldboy.com/wp-content/uploads/2018/11/timg.gif
3) 备份web01服务器上Wordpress的静态资源,因为该服务器上的资源最全
cd /code/wordpress/wp-content
cp uploads/ uploads_bak/
4) web01客户端执行挂载操作
mount -t nfs 172.16.1.31:/data/blog /code/wordpress/wp-content/uploads/
#恢复对应的数据
cp -rp uploads_bak/* uploads/
5) 将挂载信息加入开机自启
tail -1 /etc/fstab
172.16.1.31:/data/blog /code/wordpress/wp-content/uploads nfs defaults 0 0
mount -a
3.web02端,操作步骤如下
1) web02客户端直接挂载nfs即可
mount -t nfs 172.16.1.31:/data/blog /code/wordpress/wp-content/uploads/
2) 将挂载信息加入开机自启
tail -1 /etc/fstab
172.16.1.31:/data/blog /code/wordpress/wp-content/uploads nfs defaults 0 0
mount -a