1.LNMP
是指一組通常一起使用來運(yùn)行動(dòng)態(tài)網(wǎng)站或者服務(wù)器的自由軟件名稱首字母縮寫。L指Linux,N指Nginx,M一般指MySQL,也可以指MariaDB,P一般指PHP,也可以指Perl或Python。
2.LNMP架構(gòu)是如何工作的
首先 Nginx 服務(wù)是不能處理動(dòng)態(tài)請(qǐng)求,那么當(dāng)用戶發(fā)起動(dòng)態(tài)請(qǐng)求時(shí), Nginx 又是如何進(jìn)行處理的。
當(dāng)用戶發(fā)起 http 請(qǐng)求,請(qǐng)求會(huì)被 Nginx 處理,如果是靜態(tài)資源請(qǐng)求 Nginx 則直接返回,如果是動(dòng)態(tài)請(qǐng)求 Nginx 則通過 fastcgi 協(xié)議轉(zhuǎn)交給后端的 PHP 程序處理,具體如下圖所示
3.Nginx與Fast-CGI工作流程

LNMP安裝部署
2.0 創(chuàng)建www統(tǒng)一用戶
[root@web01 ~]# groupadd www -g 666
[root@web01 ~]# useradd www -s /sbin/nologin -M -u 666 -g 666
[root@web01 ~]# id www
uid=666(www) gid=666(www) 組=666(www)
2.1 使用官方倉庫安裝nginx
[root@web01 ~]# cat /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
[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
[root@web01 ~]# yum install nginx -y
2.2 啟動(dòng)Nginx并加入開機(jī)自啟動(dòng)
[root@web01 ~]# systemctl start nginx
[root@web01 ~]# systemctl enable nginx
2.3 使用第三方拓展源安裝php7.1
[root@web01 ~]# yum remove php-mysql-5.4 php php-fpm php-common
[root@web01 ~]# rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
[root@web01 ~]# rpm -Uvh https://mirror.webtatic.com/yum/el7/webtatic-release.rpm
[root@web01 ~]# 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.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
2.5 啟動(dòng)php-fpm并加入開機(jī)自啟動(dòng)
[root@web01 ~]# systemctl start php-fpm
[root@web01 ~]# systemctl enable php-fpm
2.6 安裝Mariadb數(shù)據(jù)庫
[root@web01 ~]# yum install mariadb-server mariadb -y
2.7 啟動(dòng)Mariadb數(shù)據(jù)庫并加入開機(jī)自啟動(dòng)
[root@web01 ~]# systemctl start mariadb
[root@web01 ~]# systemctl enable mariadb
2.8 配置Mariadb賬號(hào)密碼
[root@web01 ~]# mysqladmin password 'oldboy123'
[root@web01 ~]# mysql -uroot -poldboy123
2.9 mysql基礎(chǔ)命令
#查看當(dāng)前mysql有哪些用戶
MariaDB [(none)]> select user,host from mysql.user;
+------+-----------+
| user | host |
+------+-----------+
| root | 127.0.0.1 |
| root | ::1 |
| | localhost |
| root | localhost |
| | web01 |
| root | web01 |
+------+-----------+
登錄mysql
[root@web01 ~]# mysql -uroot -poldboy123
使用指定IP登錄
[root@web01 ~]# mysql -uroot -poldboy123 -h127.0.0.1
查詢當(dāng)前數(shù)據(jù)庫有哪些用戶
select user,host from mysql.user;
查詢 mysql庫里的user表里的 user和host字段的內(nèi)容
查看當(dāng)前有哪些數(shù)據(jù)庫
MariaDB [(none)]> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| test |
+--------------------+
查看庫里面有哪些表
MariaDB [(none)]> show tables from mysql;
+---------------------------+
| Tables_in_mysql |
+---------------------------+
| columns_priv |
| db |
| event |
| func |
| general_log |
| help_category |
| help_keyword |
| help_relation |
| help_topic |
| host |
| ndb_binlog_index |
| plugin |
| proc |
| procs_priv |
| proxies_priv |
| servers |
| slow_log |
| tables_priv |
| time_zone |
| time_zone_leap_second |
| time_zone_name |
| time_zone_transition |
| time_zone_transition_type |
| user |
+---------------------------+
24 rows in set (0.00 sec)
查看表里有哪些字段
MariaDB [mysql]> desc user;
+------------------------+-----------------------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+------------------------+-----------------------------------+------+-----+---------+-------+
| Host | char(60) | NO | PRI | | |
| User | char(16) | NO | PRI | | |
| Password | char(41) | NO | | | |
| Select_priv | enum('N','Y') | NO | | N | |
| Insert_priv | enum('N','Y') | NO | | N | |
| Update_priv | enum('N','Y') | NO | | N | |
| Delete_priv | enum('N','Y') | NO | | N | |
| Create_priv | enum('N','Y') | NO | | N | |
| Drop_priv | enum('N','Y') | NO | | N | |
| Reload_priv | enum('N','Y') | NO | | N | |
| Shutdown_priv | enum('N','Y') | NO | | N | |
| Process_priv | enum('N','Y') | NO | | N | |
| File_priv | enum('N','Y') | NO | | N | |
| Grant_priv | enum('N','Y') | NO | | N | |
| References_priv | enum('N','Y') | NO | | N | |
| Index_priv | enum('N','Y') | NO | | N | |
| Alter_priv | enum('N','Y') | NO | | N | |
| Show_db_priv | enum('N','Y') | NO | | N | |
| Super_priv | enum('N','Y') | NO | | N | |
| Create_tmp_table_priv | enum('N','Y') | NO | | N | |
| Lock_tables_priv | enum('N','Y') | NO | | N | |
| Execute_priv | enum('N','Y') | NO | | N | |
| Repl_slave_priv | enum('N','Y') | NO | | N | |
| Repl_client_priv | enum('N','Y') | NO | | N | |
| Create_view_priv | enum('N','Y') | NO | | N | |
| Show_view_priv | enum('N','Y') | NO | | N | |
| Create_routine_priv | enum('N','Y') | NO | | N | |
| Alter_routine_priv | enum('N','Y') | NO | | N | |
| Create_user_priv | enum('N','Y') | NO | | N | |
| Event_priv | enum('N','Y') | NO | | N | |
| Trigger_priv | enum('N','Y') | NO | | N | |
| Create_tablespace_priv | enum('N','Y') | NO | | N | |
| ssl_type | enum('','ANY','X509','SPECIFIED') | NO | | | |
| ssl_cipher | blob | NO | | NULL | |
| x509_issuer | blob | NO | | NULL | |
| x509_subject | blob | NO | | NULL | |
| max_questions | int(11) unsigned | NO | | 0 | |
| max_updates | int(11) unsigned | NO | | 0 | |
| max_connections | int(11) unsigned | NO | | 0 | |
| max_user_connections | int(11) | NO | | 0 | |
| plugin | char(64) | NO | | | |
| authentication_string | text | NO | | NULL | |
+------------------------+-----------------------------------+------+-----+---------+-------+
42 rows in set (0.00 sec)
退出
exit
第三章 LNMP環(huán)境配置
3.1 Fastcgi語法
設(shè)置 fastcgi 服務(wù)器的地址,該地址可以指定為域名或 IP 地址,以及端口
Syntax: fastcgi_pass address;
Default: —
Context: location, if in location
#語法示例
fastcgi_pass localhost:9000;
fastcgi_pass unix:/tmp/fastcgi.socket;
設(shè)置 fastcgi 默認(rèn)的首頁文件,需要結(jié)合 fastcgi_param 一起設(shè)置
Syntax: fastcgi_index name;
Default: —
Context: http, server, location
通過 fastcgi_param 設(shè)置變量,并將設(shè)置的變量傳遞到后端的 fastcgi 服務(wù)器
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;
3.2 最終Nginx連接FastCGI服務(wù)器配置如下
[root@web01 ~]# cat /etc/nginx/conf.d/php.conf
server {
server_name www.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;
}
}
3.3 在/code目錄下創(chuàng)建info.php文件并訪問測(cè)試
[root@web01 ~]# mkdir /code
[root@web01 ~]# chown -R www:www /code/
[root@web01 ~]# cat /code/info.php
<?php
phpinfo();
?>
3.4 檢查nginx語法并重啟
[root@web01 ~]# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
[root@web01 ~]# systemctl restart nginx
3.5 綁定hosts然后在瀏覽器訪問
http://www.oldboy.com/info.php

3.6 測(cè)試php和數(shù)據(jù)庫訪問是否正常
[root@web01 ~]# cat /code/mysql.php
<?php
$servername = "localhost";
$username = "root";
$password = "oldboy123";
// 創(chuàng)建連接
$conn = mysqli_connect($servername, $username, $password);
// // 檢測(cè)連接
if (!$conn) {
die("Connection failed: " . mysqli_connect_error());
}
echo "php 連接 MySQL 數(shù)據(jù)庫成功";
?>
3.6 通過瀏覽器訪問數(shù)據(jù)庫頁面

第四章 部署博客Wordpress
4.1 配置Nginx虛擬主機(jī)站點(diǎn)
[root@web01 ~]# cat /etc/nginx/conf.d/wordpress.conf
server {
listen 80;
server_name blog.oldboy.com;
root /code/wordpress;
index index.php index.html;
location ~ \.php$ {
root /code/wordpress;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
4.2 重啟nginx
[root@web01 ~]# systemctl restart nginx
4.3 下載解壓wordpress到代碼目錄
[root@web01 ~]# mkdir /code
[root@web01 ~]# cd /code/
[root@web01 /code]# wget https://cn.wordpress.org/wordpress-4.9.4-zh_CN.tar.gz
[root@web01 /code]# tar xf wordpress-4.9.4-zh_CN.tar.gz
[root@web01 /code]# chown -R www:www /code/wordpress
4.4 創(chuàng)建wordpress數(shù)據(jù)庫
[root@web01 /code]# mysql -uroot -poldboy123
> create database wordpress;
> exit
4.5 瀏覽器訪問wordpress并部署







第五章 部署問答網(wǎng)站W(wǎng)ecenter
5.1 配置Nginx虛擬站點(diǎn)
[root@web01 ~]# cat /etc/nginx/conf.d/wecenter.conf
server {
listen 80;
server_name zh.oldboy.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;
}
}
5.2 下載解壓wecenter并授權(quán)
[root@web01 ~]# mkdir /code/zh -p
[root@web01 ~]# cd /opt/
[root@web01 /opt]# rz
[root@web01 /opt]# ls
WeCenter_3-3-2.zip
[root@web01 /opt]# unzip WeCenter_3-3-2.zip -d /code/zh/
[root@web01 /opt]# chown -R www:www /code/
5.3 創(chuàng)建wecenter數(shù)據(jù)庫
[root@web01 ~]# mysql -uroot -poldboy123
> create database zh;
> exit;
5.4 瀏覽器訪問




5.5 清除首頁安裝文件
[root@web01 ~]# rm -rf /code/zh/install
第六章 拆分?jǐn)?shù)據(jù)庫
6.1 為什么要進(jìn)行數(shù)據(jù)庫的拆分
由于單臺(tái)服務(wù)器運(yùn)行 LNMP 架構(gòu)會(huì)導(dǎo)致網(wǎng)站訪問緩慢,當(dāng)內(nèi)存被吃滿時(shí),很容易導(dǎo)致系統(tǒng)出現(xiàn) oom,從而 kill 掉MySQL 數(shù)據(jù)庫,所以需要將 web 和數(shù)據(jù)庫進(jìn)行獨(dú)立部署
6.2 數(shù)據(jù)庫拆分后解決了什么問題
1.緩解 web 網(wǎng)站的壓力
2.增強(qiáng)數(shù)據(jù)庫讀寫性能
3.提高用戶訪問的速度
6.3 數(shù)據(jù)庫拆分架構(gòu)演變過程

6.4 數(shù)據(jù)庫拆分環(huán)境搭建
web01 172.16.1.7 nginx+php
db01 172.16.1.51 mysql
6.5 數(shù)據(jù)庫拆分詳細(xì)步驟
6.5.1 web01上備份數(shù)據(jù)庫并拷貝到db01上
備份 web01 上的數(shù)據(jù)庫,oldboy123 是數(shù)據(jù)庫密碼
[root@web01 ~]# mysqldump -uroot -p'oldboy123' -A --single-transaction > mysql-all.sql
將 web01 上備份的數(shù)據(jù)庫拷貝至 db01 服務(wù)器上
[root@web01 ~]# scp mysql-all.sql 10.0.1.51:/tmp
6.5.2 db01恢復(fù)數(shù)據(jù)庫
將 web01 服務(wù)器上推送的數(shù)據(jù)庫備份文件恢復(fù)至 db01 服務(wù)器新數(shù)據(jù)庫中
[root@db01 ~]# yum install mariadb mariadb-server -y
[root@db01 ~]# systemctl start mariadb
[root@db01 ~]# systemctl enable mariadb
[root@db01 ~]# mysqladmin password 'oldboy123'
[root@db01 ~]# mysql -uroot -p'oldboy123' < /tmp/mysql-all.sql
[root@db01 ~]# mysql -uroot -p'oldboy123' -e "show databases;"
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| test |
| wordpress |
| zh |
+--------------------+
6.6.3 db01數(shù)據(jù)庫進(jìn)行授權(quán)
在新數(shù)據(jù)庫上授權(quán), 允許所有網(wǎng)段, 通過 all 賬戶連接并操作該數(shù)據(jù)庫
授權(quán)所有權(quán)限 grant all privileges
授權(quán)所有庫所有表 .
將授權(quán)賦予給哪個(gè)用戶,這個(gè)用戶只能通過哪個(gè)網(wǎng)段過來(%所有) 'all'@'%'
授權(quán)該用戶登錄的密碼 identified by
[root@db01 ~]# mysql -uroot -p'oldboy123'
> grant all privileges on *.* to 'all'@'%' identified by 'oldboy123';
> flush privileges;
>exit;
測(cè)試使用IP地址能不能登陸
[root@db01 ~]# mysql -uall -p'oldboy123' -h 10.0.1.51
> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| test |
| wordpress |
| zh |
+--------------------+
6.6.4 web01修改代碼連接到新數(shù)據(jù)庫
修改wordpress
[root@web01 ~]# vim /code/wordpress/wp-config.php
/** MySQL數(shù)據(jù)庫用戶名 */
define('DB_USER', 'all');
/** MySQL數(shù)據(jù)庫密碼 */
define('DB_PASSWORD', 'oldboy123');
/** MySQL主機(jī) */
define('DB_HOST', '172.16.1.51');
修改wecenter
[root@web01 ~]# vim /code/zh/system/config/database.php
'host' => '172.16.1.51',
'username' => 'all',
'password' => 'oldboy123',
'dbname' => 'zh',
停止web01上的數(shù)據(jù)庫
[root@web01 ~]# systemctl stop mariadb.service
6.6.5 測(cè)試訪問
此時(shí)如果打開網(wǎng)頁沒有問題則表明數(shù)據(jù)庫拆分完成


第七章 拓展WEB服務(wù)器
7.1 為什么要拓展多臺(tái)web節(jié)點(diǎn)
單臺(tái) web 服務(wù)器能抗住的訪問量是有限的,配置多臺(tái) web 服務(wù)器能提升更高的訪問速度
7.2 拓展多臺(tái)web解決了什么問題
1.單臺(tái) web 節(jié)點(diǎn)如果故障,會(huì)導(dǎo)致業(yè)務(wù) down 機(jī)
2.多臺(tái) web 節(jié)點(diǎn)能保證業(yè)務(wù)的持續(xù)穩(wěn)定,擴(kuò)展性高
3.多臺(tái) web 節(jié)點(diǎn)能有效的提升用戶訪問網(wǎng)站的速度
7.3 多臺(tái)web服務(wù)器架構(gòu)組成

7.4 多臺(tái)web服務(wù)器思路
1.可以使用ansible批量部署多臺(tái)web服務(wù)器
2.配置內(nèi)網(wǎng)私有yum倉庫
3 按照web01的步驟安裝好nginx和php,然后遠(yuǎn)程拷貝代碼到新機(jī)器
7.5 正常配置步驟
7.5.1 創(chuàng)建用戶名密碼
[root@web02 ~]# groupadd www -g 666
[root@web02 ~]# useradd www -s /sbin/nologin -M -u 666 -g 666
7.5.2 安裝NP
可以直接從web01上拷貝yum源到本機(jī)yum目錄
[root@web02 ~]# scp -rp root@172.16.1.7:/etc/yum.repos.d/* /etc/yum.repos.d/
[root@web02 ~]# scp -rp root@172.16.1.7:/etc/pki/rpm-gpg/* /etc/pki/rpm-gpg/
[root@web02 ~]# yum install nginx -y
[root@web02 ~]# 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
7.5.3 拷貝web01的nginx配置文件到web02
[root@web02 ~]# scp -rp root@172.16.1.7:/etc/nginx /etc/
7.5.4 拷貝web01的php配置文件到web02
[root@web02 ~]# scp -rp root@172.16.1.7:/etc/php-fpm.d /etc/
7.5.5 拷貝代碼目錄到web02
[root@web01 ~]# tar czf code.tar.gz /code
[root@web01 ~]# scp code.tar.gz root@172.16.1.8:/tm
7.5.6 web02上將代碼解壓到相應(yīng)目錄
[root@web02 ~]# tar zxf /tmp/code.tar.gz -C /
7.5.7 web02上啟動(dòng)nginx和php-fpm并加入開機(jī)自啟動(dòng)
[root@web02 ~]# systemctl start nginx php-fpm
[root@web02 ~]# systemctl enable nginx php-fpm
7.5.8 web訪問測(cè)試
修改hosts為web02的地址,然后瀏覽器訪問測(cè)試
第八章 將靜態(tài)資源掛載到共享存儲(chǔ)
8.1 為什么要拆分靜態(tài)資源到獨(dú)立服務(wù)器
當(dāng)后端的 web 節(jié)點(diǎn)出現(xiàn)多臺(tái)時(shí),會(huì)導(dǎo)致用戶上傳的圖片、視頻附件等內(nèi)容僅上傳至一臺(tái) web 服務(wù)器,那么其他的web 服務(wù)器則無法訪問到該圖片
8.2 新增一臺(tái)nfs存儲(chǔ)解決了什么問題
1.保證了多臺(tái) web 節(jié)點(diǎn)靜態(tài)資源一致。
2.有效節(jié)省多臺(tái) web 節(jié)點(diǎn)的存儲(chǔ)空間。
3.統(tǒng)一管理靜態(tài)資源,便于后期推送至 CDN 進(jìn)行靜態(tài)資源加速
8.3 多臺(tái)web節(jié)點(diǎn)架構(gòu)組成

8.4 多臺(tái)web節(jié)點(diǎn)環(huán)境規(guī)劃
web01 nginx+php
web02 nginx+php
db01 mysql
nfs nfs
8.5 共享存儲(chǔ)配置
8.5.1 安裝配置NFS
[root@nfs01 ~]# yum install nfs-utils -y
[root@nfs01 ~]# 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)
8.5.2 創(chuàng)建共享目錄并進(jìn)行授權(quán)
[root@nfs01 ~]# mkdir /data/{blog,zh} -p
[root@nfs01 ~]# chown -R www.www /data
8.5.3 啟動(dòng)nfs服務(wù)并加入開機(jī)自啟
[root@nfs01 ~]# systemctl restart nfs-server
8.6 web01端操作步驟如下
8.6.1 web01節(jié)點(diǎn)掛在nfs
[root@web01 ~]# yum install nfs-utils -y
[root@web01 ~]# 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
8.6.2 查找Wordpress 靜態(tài)資源存放的位置
在wordpress的文章里添加一張圖片,然后查看圖片URL資源

這里地址為:
http://blog.oldboy.com/wp-content/uploads/2019/07/DNS圖.png
8.6.3 備份web01服務(wù)器上Wordpress 的靜態(tài)資源
[root@web01 ~]# cd /code/wordpress/wp-content
[root@web01 /code/wordpress/wp-content]# cp -a uploads/ uploads_bak/
8.6.4 web01客戶端執(zhí)行掛載操作
[root@web01 /code/wordpress/wp-content]# mount -t nfs 172.16.1.31:/data/blog /code/wordpress/wp-content/uploads/
[root@web01 /code/wordpress/wp-content]# cp -rp uploads_bak/* uploads/
8.6.5 將掛載信息加入開機(jī)自啟
[root@web01 ~]# tail -1 /etc/fstab
172.16.1.31:/data/blog /code/wordpress/wp-content/uploads nfs defaults 0 0
8.7 web02端操作
web02端操作和web01端一樣
[root@web02 ~]# cd /code/wordpress/wp-content
[root@web02 /code/wordpress/wp-content]# cp -a uploads/ uploads_bak/
[root@web02 /code/wordpress/wp-content]# mount -t nfs 172.16.1.31:/data/blog /code/wordpress/wp-content/uploads/
[root@web02 /code/wordpress/wp-content]# cp -rp uploads_bak/* uploads/
[root@web02 ~]# tail -1 /etc/fstab
172.16.1.31:/data/blog /code/wordpress/wp-content/uploads nfs defaults 0 0