主頁 > 軟體設計 > LNMP架構

LNMP架構

2021-08-17 07:21:35 軟體設計

文章目錄

  • 一、LNMP架構基本概念
    • 1.1 什么是LNMP
    • 1.2 LNMP實作程序
    • 1.3 LNMP實作細節
  • 二、LNMP架構環境安裝
    • 2.1 nginx安裝
    • 2.2 php安裝
    • 2.3 MySQL安裝
  • 三、LNMP架構環境配置
    • 3.1 Fastcgi代理語法
    • 3.2 Nginx集成PHP
    • 3.3 PHP集成MySQL
  • 四、LNMP架構在單臺主機上部署開源產品
    • 4.1 部署開源知乎產品Wecenter
    • 4.2 部署開源博客系統wordpress
    • 4.3 部署相親站點OElove
    • 4.4 部署商城網站ShopXO
  • 五、LNMP架構多臺主機部署開源專案
    • 5.1 拆分資料庫至獨立服務器
    • 5.2 資料庫拆分架構演變
    • 5.3 環境準備
    • 5.4 資料庫實作步驟
      • 5.4.1 web服務操作如下
      • 5.4.2 資料庫服務器db01操作如下
    • 5.6停止web01上的資料庫服務,讓它不在提供資料庫服務,啟用新的資料庫
    • 5.7 修改web01上部署的專案代碼,讓其指向新資料庫db01
  • 六、擴展多臺相同的Web服務器組成web集群
    • 6.1 為何要擴展多臺web節點
    • 6.2 擴展多web節點架構演變
    • 6.3 擴展多web節點環境準備
    • 6.4 擴展多臺web節點實作步驟
      • 6.4.1 創建相同用戶身份便于運行行程
      • 6.4.2 安裝nginx
      • 6.4.3 安裝php
      • 6.4.4 nginx與php配置匯入
      • 6.4.5 將web01 上部署的所有代碼打包上傳到web02
      • 6.4.6 在web02上啟動nginx與php并加入開機自啟
      • 6.4.7 修改本地hosts檔案,瀏覽器訪問測驗,
  • 七、拆分靜態資源至獨立服務器
    • 7.1 為何要拆分靜態資源
    • 7.2 拆分靜態資源架構演變
    • 7.3 增加共享存盤nfs環境準備
    • 7.4 共享存盤實作步驟
      • 7.4.1 配置nfs 建議另外配置硬碟
      • 7.4.2 匯入靜態資源至共享存盤
  • 八、展節點帶來的新問題

一、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)]> grant all privileges on *.* to 'web01'@'172.16.1.%' identified by '123456';


# 開啟后重新連接,發現已經能連接了,
[root@web01 tmp]# mysql -h 172.16.1.51 -uweb01 -p123456
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 6
Server version: 5.5.68-MariaDB MariaDB Server
Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> 

mysql 配置權限語法解釋:

1.查看權限
  語法:show grants for 'username'@'hostname'
  例如:查看root用戶的權限
      show grants for 'root'@'localhost'

2.授予權限
   語法:grant 權限型別1,權限型別1.... on  資料庫名.表
        to  'username'@'hostname' [,'username'@'hostname'][with grant option] 
  		所有庫中所有表用  *.* 表示


  例如:新創建test04 用戶 密碼test04
       create user 'test04'@'localhost' identified by '密碼'
       授予所有庫下所有表的查詢  洗掉權限
       grant select ,delete on *.* to 'test04'@'localhost' with grant option
      	
      	授予所有權限
      	grant all privileges on.........
       	開啟所有網段
       	'name'@'%'
       
       查看test04的權限
       show grants for 'test04'@'localhost'

3.識訓權限
   revoke  權限型別1,權限型別2.... on 庫名.表名
   from 'username'@hostname'' [,'username'@hostname'']...

 例如:識訓test04的delete權限
    revoke delete on *.* from 'test04'@'localhost'

5.6停止web01上的資料庫服務,讓它不在提供資料庫服務,啟用新的資料庫

[root@web01 ~]# systemctl stop mariadb
[root@web01 ~]# systemctl disable mariadb
Removed symlink /etc/systemd/system/multi-user.target.wants/mariadb.service.

5.7 修改web01上部署的專案代碼,讓其指向新資料庫db01

注:由于安裝部署開源軟體時候有安裝向導,它會自動創建腳本檔案連接我們的資料庫,實際生產環境中需要我們自己手動寫或者開發寫腳本,由于我們不知道具體是哪個檔案包含資料庫連接資訊,可以用find命令查找
例如

[root@web01 ~]# find /code/wordpress/ -type f | xargs grep "123456"

這樣就可以列出包含密碼的檔案,但是由于123456很多檔案都有,所以建議事先設計資料庫密碼時候要有標識
1.修改 Wordpress 產品代碼連接資料庫的組態檔

[root@web01 ~]# vim /code/wordpress/wp-config.php
define( 'DB_NAME', 'wordpress' );

/** MySQL database username */
define( 'DB_USER', 'web01' );

/** MySQL database password */
define( 'DB_PASSWORD', '123456' );

/** MySQL hostname */
define( 'DB_HOST', '172.16.1.51' );

2.修改 wecenter 產品代碼連接資料庫的組態檔

[root@web01 ~]# vim /code/zh/system/config/database.php 

<?php

$config['charset'] = 'utf8';^M
$config['prefix'] = 'aws_';^M
$config['driver'] = 'MySQLi';^M
$config['master'] = array (
  'charset' => 'utf8',
  'host' => '172.16.1.51',
  'username' => 'web01',
  'password' => '123456',
  'dbname' => 'zh',
);^M
$config['slave'] = false;^M                           

3.修改 OElove 產品代碼連接資料庫的組態檔

[root@web01 ~]# vim /code/love/source/conf/db.inc.php 

define('DB_TYPE', 'mysql');
///資料庫編碼
define('DB_CHARSET', 'utf8');
///資料庫服務器
define('DB_HOST', '172.16.1.51:3306');
///資料庫名
define('DB_DATA', 'love');
///資料庫登錄帳號
define('DB_USER', 'web01');
///資料庫登錄密碼
define('DB_PASS', '123456');
///資料表前綴
define('DB_PREFIX', 'oepre_');
///資料庫持久連接 0=關閉, 1=打開

4.修改OXshop產品配置資訊

[root@web01 ~]# vim /code/shop/config/database.php 
return [
    // 資料庫型別
    'type'            => 'mysql',
    // 服務器地址
    'hostname'        => '172.16.1.51',
    // 資料庫名
    'database'        => 'shop',
    // 用戶名
    'username'        => 'web01',
    // 密碼
    'password'        => '123456',
    // 埠
    'hostport'        => '3306',

5.由于停止了web01服務器上的資料庫服務,網站都不能訪問了,但是經過上述配置后,瀏覽器又能訪問了,

六、擴展多臺相同的Web服務器組成web集群

6.1 為何要擴展多臺web節點

單臺web服務器能抗住的訪問量是有限的,而且單一的添加硬體配置并不能解決埠不夠的問題,配置多臺web服務器能提升更高的訪問速度,
擴展多臺節點解決什么問題
1.單臺web節點如果故障,會導致業務down機;
2.多臺web節點能保證業務的持續穩定,擴展性高;
3.多臺web節點能有效的提升用戶訪問網站的速度;

6.2 擴展多web節點架構演變

在這里插入圖片描述

6.3 擴展多web節點環境準備

主機名稱應用環境外網地址內網地址
web01nginx+php10.0.0.7172.16.1.7
web02nginx+php10.0.0.8172.16.1.8
db01mysql(mariadb)172.16.1.51

6.4 擴展多臺web節點實作步驟

可以根據web01上的配置,快速擴展一臺web02,資料庫統一使用db01,

6.4.1 創建相同用戶身份便于運行行程

[root@web02 ~]# groupadd -g 666 www
[root@web02 ~]# useradd -g 666 -u 666 www

6.4.2 安裝nginx

由于安裝nginx需要手動配置源,可以從web01上拖過來

[root@web02 ~]# rsync -avz root@172.16.1.7:/etc/yum.repos.d/nginx.repo /etc/yum.repos.d/
安裝yum優先級插件
yum install yum-priorities

在想優先檢測的repo檔案中加入
priority=1 
#數字越小,優先級越高


[root@web01 ~]# vim /etc/yum/pluginconf.d/priorities.conf 
確定這個組態檔里的 enabled = 1
yum clean all
yum makecache

就可以優先從我們指定的源里安裝了

[root@web02 ~]# yum install nginx
[root@web02 ~]# systemctl start nginx
[root@web02 ~]# systemctl enable nginx
Created symlink from /etc/systemd/system/multi-user.target.wants/nginx.service to /usr/lib/systemd/system/nginx.service.
[root@web02 ~]# netstat -lntp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 0.0.0.0:111             0.0.0.0:*               LISTEN      539/rpcbind         
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      1847/nginx: master  

nginx 依賴安裝
yum install -y gcc gcc-c++ autoconf pcre pcre-devel make automake httpd-toolsyum install -y gcc gcc-c++ autoconf pcre pcre-devel make automake httpd-tools

6.4.3 安裝php

安裝見上文

把包下載下來放入~目錄解壓
[root@web02 ~]# unzip php.zip
安裝
[root@web02 ~]# yum localinstall php/*.rpm

6.4.4 nginx與php配置匯入

[root@web02 php-fpm.d]# rsync -avz root@172.16.1.7:/etc/nginx /etc
[root@web02 ~]# rsync -avz root@172.16.1.7:/etc/php-fpm.d /etc
[root@web02 conf.d]# rsync -avz root@172.16.1.7:/etc/php.ini /etc

6.4.5 將web01 上部署的所有代碼打包上傳到web02

1.在web01上打包
[root@web01 /]# cd / && tar czf /tmp/code.tar.gz /code/
2.推送
[root@web01 /]# scp -rp /tmp/code.tar.gz root@172.16.1.8:/tmp
3. 在web02上解壓
[root@web02 ~]# tar -xf code.tar.gz -C /

如果要部署商城專案需要再次修改權限

[root@web02 ~]# chown -R www.www /var/lib/php/session/

6.4.6 在web02上啟動nginx與php并加入開機自啟

[root@web02 ~]# systemctl start nginx
[root@web02 ~]# systemctl enable nginx
[root@web02 ~]# systemctl start php-fpm
[root@web02 ~]# systemctl enable php-fpm
[root@web02 ~]# netstat -nlpt
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 0.0.0.0:111             0.0.0.0:*               LISTEN      539/rpcbind         
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      1847/nginx: master  
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      861/sshd            
tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN      1020/master         
tcp        0      0 127.0.0.1:9000          0.0.0.0:*               LISTEN      2092/php-fpm: maste 

6.4.7 修改本地hosts檔案,瀏覽器訪問測驗,

10.0.0.8 zh.bertwu.net
10.0.0.8 blog.bertwu.net
10.0.0.8 love.bertwu.net
10.0.0.8 shop.bertwu.net

七、拆分靜態資源至獨立服務器

7.1 為何要拆分靜態資源

當后端的 web 節點出現多臺時,如果用戶上傳的圖片、視頻附件等內容僅在一臺 web 服務器上,由于負載均衡,下一次訪問會隨機調度到其他節點,那么其他的 web 服務器則無法訪問到該圖片,
如果增加一臺共享存盤能解決什么問題
1.保證了多臺 web 節點靜態資源一致,
2.有效節省多臺 web 節點的存盤空間,
3.統一管理靜態資源,便于后期推送至 CDN 進行靜態資源加速

7.2 拆分靜態資源架構演變

在這里插入圖片描述

7.3 增加共享存盤nfs環境準備

主機名稱應用環境外網地址內網地址
web01nginx+php10.0.0.7172.16.1.7
web02nginx+php10.0.0.8172.16.1.8
db01mysql(mariadb)172.16.1.51
nfsnfs172.16.1.32

7.4 共享存盤實作步驟

7.4.1 配置nfs 建議另外配置硬碟

1.創建www用戶
[root@nfs ~]# groupadd -g 666 www
[root@nfs ~]# useradd -g 666 -u 666 www
[root@nfs ~]# yum install nfs-utils -y
2.修改nfs組態檔修改
[root@nfs ~]# 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)
/data/love 172.16.1.0/24(rw,sync,all_squash,anonuid=666,anongid=666)
/data/shop 172.16.1.0/24(rw,sync,all_squash,anonuid=666,anongid=666)

3.添加一塊新硬碟
[root@nfs ~]# lsblk
NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda      8:0    0   50G  0 disk 
├─sda1   8:1    0  500M  0 part /boot
├─sda2   8:2    0    2G  0 part [SWAP]
└─sda3   8:3    0 47.6G  0 part /
sdb      8:16   0 1000G  0 disk 
sr0     11:0    1  4.4G  0 rom 

4.制作檔案系統
[root@nfs ~]# mkfs.xfs /dev/sdb
[root@nfs data]# mkdir /data

5.掛載
[root@nfs data]# mount -t xfs /dev/sdb /data
[root@nfs data]# echo '/dev/sdb /data xfs defaults 0 0' >>/etc/fstab
[root@nfs data]# df -h
Filesystem      Size  Used Avail Use% Mounted on
devtmpfs        476M     0  476M   0% /dev
tmpfs           487M     0  487M   0% /dev/shm
tmpfs           487M  7.6M  479M   2% /run
tmpfs           487M     0  487M   0% /sys/fs/cgroup
/dev/sda3        48G  1.8G   46G   4% /
/dev/sda1       497M  125M  373M  25% /boot
tmpfs            98M     0   98M   0% /run/user/0
/dev/sdb       1000G   33M 1000G   1% /data

6.創建對應檔案夾并修改權限
[root@nfs data]# mkdir /data/{blog,zh,love,shop}
[root@nfs data]# chown -R www.www /data

[root@nfs data]# ll
total 0
drwxr-xr-x 2 www www 6 Aug 15 22:25 blog
drwxr-xr-x 2 www www 6 Aug 15 22:25 love
drwxr-xr-x 2 www www 6 Aug 15 22:25 shop
drwxr-xr-x 2 www www 6 Aug 15 22:25 zh
7.加入開機自啟
[root@nfs data]# systemctl start nfs-server
[root@nfs data]# systemctl enable nfs-server

7.4.2 匯入靜態資源至共享存盤

1.web01節點安裝nfs,然后使用showmount查看服務端共享的資源;

[root@web01 ~]# yum install nfs-utils -y
[root@web01 ~]# showmount -e 172.16.1.32
Export list for 172.16.1.32:
/data/shop 172.16.1.0/24
/data/love 172.16.1.0/24
/data/zh   172.16.1.0/24
/data/blog 172.16.1.0/24

2.查找Wordpress靜態資源推送過去然后再掛載

在這里插入圖片描述
可以看到靜態資源存盤目錄為http://blog.bertwu.net/wp-content/uploads/2021/08/16290384211-3.png

1.web02上事先有圖片需要先推送一下
[root@web02 wordpress]# rsync -avz /code/wordpress/wp-content/uploads/ root@172.16.1.32:/data/blog

[root@web02 wordpress]# mount -t nfs 172.16.1.32:/data/blog /code/wordpress/wp-content/uploads/
[root@web02 wordpress]# df -h
Filesystem              Size  Used Avail Use% Mounted on
devtmpfs                476M     0  476M   0% /dev
tmpfs                   487M     0  487M   0% /dev/shm
tmpfs                   487M  7.6M  479M   2% /run
tmpfs                   487M     0  487M   0% /sys/fs/cgroup
/dev/sda3                48G  2.5G   46G   6% /
/dev/sda1               497M  125M  373M  25% /boot
tmpfs                    98M     0   98M   0% /run/user/0
172.16.1.32:/data/blog 1000G   40M 1000G   1% /code/wordpress/wp-content/uploads

# 開機自啟掛載
[root@web01 ~]echo '172.16.1.32:/data/blog /code/wordpress/wp-content/uploads nfs defaults 0 0' >> /etc/fstab

2.web01上沒有圖片直接遠程掛載
[root@web01 wp-content]# mount -t nfs 172.16.1.32:/data/blog /code/wordpress/wp-content/uploads/
[root@web01 wp-content]# df -h
Filesystem              Size  Used Avail Use% Mounted on
devtmpfs                476M     0  476M   0% /dev
tmpfs                   487M     0  487M   0% /dev/shm
tmpfs                   487M  7.6M  479M   2% /run
tmpfs                   487M     0  487M   0% /sys/fs/cgroup
/dev/sda3                48G  3.3G   45G   7% /
/dev/sda1               497M  125M  373M  25% /boot
tmpfs                    98M     0   98M   0% /run/user/0
172.16.1.32:/data/blog 1000G   40M 1000G   1% /code/wordpress/wp-content/uploads
# 開機自啟掛載
[root@web01 ~]echo '172.16.1.32:/data/blog /code/wordpress/wp-content/uploads nfs defaults 0 0' >> /etc/fstab

八、展節點帶來的新問題

如果我們添加了一臺C應用服務器,如何能實作快速擴展?
1.準備LNP環境
2.拷貝任意A或B上的組態檔,代碼
3.掛載NFS存盤

現在有多個WEB服務器,該如何進行訪問?
1.DNS輪詢
(1)需要所有的web節點具備公網IP地址
(2)公網獨立IP需要費用,而且不便宜,
(3)所有的web節點有公網IP,不安全,
(4)DNS只有輪詢機制,沒有健康檢查功能,
2.負載均衡
(1)所有的web節點不需要有公網IP,能節省成本、并保證安全
(2)能夠對后端的web節點進行健康檢查機制;
(3)負載均衡有多種調度演算法來滿足企業不同需求;

	rr;wrr;url_hash;ip_hash;一致性hash;

在這里插入圖片描述

轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/294168.html

標籤:其他

上一篇:資料增強(噪聲,模糊,縮放,色域變換,均衡化,色彩抖動)

下一篇:Docker-網路配置<三>

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 面試突擊第一季,第二季,第三季

    第一季必考 https://www.bilibili.com/video/BV1FE411y79Y?from=search&seid=15921726601957489746 第二季分布式 https://www.bilibili.com/video/BV13f4y127ee/?spm_id_fro ......

    uj5u.com 2020-09-10 05:35:24 more
  • 第三單元作業總結

    1.前言 這應該是本學期最后一次寫作業總結了吧。總體來說,對作業的節奏也差不多掌握了,作業做起來的效率也更高了。雖然和之前的作業一樣,作業中都要用到新的知識,但是相比之前,更加懂得了如何利用工具以及資料。雖然之間卡過殼,但總體而言,這幾次作業還算完成的比較好。 2.作業程序總結 相比前兩個單元,此單 ......

    uj5u.com 2020-09-10 05:35:41 more
  • 北航OO(2020)第四單元博客作業暨課程總結博客

    北航OO(2020)第四單元博客作業暨課程總結博客 本單元作業的架構設計 在本單元中,由于UML圖具有比較清晰的樹形結構,因此我對其中需要進行查詢操作的元素進行了包裝,在樹的父節點中存盤所有孩子的參考。考慮到性能問題,我采用了快取機制,一次查詢后盡可能快取已經遍歷過的資訊,以減少遍歷次數。 本單元我 ......

    uj5u.com 2020-09-10 05:35:48 more
  • BUAA_OO_第四單元

    一、UML決議器設計 ? 先看下題目:第四單元實作一個基于JDK 8帶有效性檢查的UML(Unified Modeling Language)類圖,順序圖,狀態圖分析器 MyUmlInteraction,實際上我們要建立一個有向圖模型,UML中的物件(元素)可能與同級元素連接,也可與低級元素相連形成 ......

    uj5u.com 2020-09-10 05:35:54 more
  • 6.1邏輯運算子

    邏輯運算子 1. && 短路與 運算式1 && 運算式2 01.運算式1為true并且運算式2也為true 整體回傳為true 02.運算式1為false,將不會執行運算式2 整體回傳為false 03.只要有一個運算式為false 整體回傳為false 2. || 短路或 運算式1 || 運算式2 ......

    uj5u.com 2020-09-10 05:35:56 more
  • BUAAOO 第四單元 & 課程總結

    1. 第四單元:StarUml檔案決議 本單元采用了圖模型決議UML。 UML檔案可以抽象為圖、子圖、邊的邏輯結構。 在實作中,圖的節點包括類、介面、屬性,子圖包括狀態圖、順序圖等。 采用了三次遍歷UML元素的方法建圖,第一遍遍歷建點,第二、三次遍歷設定屬性、連邊,實作圖物件的初始化。這里借鑒了一些 ......

    uj5u.com 2020-09-10 05:36:06 more
  • 談談我對C# 多型的理解

    面向物件三要素:封裝、繼承、多型。 封裝和繼承,這兩個比較好理解,但要理解多型的話,可就稍微有點難度了。今天,我們就來講講多型的理解。 我們應該經常會看到面試題目:請談談對多型的理解。 其實呢,多型非常簡單,就一句話:呼叫同一種方法產生了不同的結果。 具體實作方式有三種。 一、多載 多載很簡單。 p ......

    uj5u.com 2020-09-10 05:36:09 more
  • Python 資料驅動工具:DDT

    背景 python 的unittest 沒有自帶資料驅動功能。 所以如果使用unittest,同時又想使用資料驅動,那么就可以使用DDT來完成。 DDT是 “Data-Driven Tests”的縮寫。 資料:http://ddt.readthedocs.io/en/latest/ 使用方法 dd. ......

    uj5u.com 2020-09-10 05:36:13 more
  • Python里面的xlrd模塊詳解

    那我就一下面積個問題對xlrd模塊進行學習一下: 1.什么是xlrd模塊? 2.為什么使用xlrd模塊? 3.怎樣使用xlrd模塊? 1.什么是xlrd模塊? ?python操作excel主要用到xlrd和xlwt這兩個庫,即xlrd是讀excel,xlwt是寫excel的庫。 今天就先來說一下xl ......

    uj5u.com 2020-09-10 05:36:28 more
  • 當我們創建HashMap時,底層到底做了什么?

    jdk1.7中的底層實作程序(底層基于陣列+鏈表) 在我們new HashMap()時,底層創建了默認長度為16的一維陣列Entry[ ] table。當我們呼叫map.put(key1,value1)方法向HashMap里添加資料的時候: 首先,呼叫key1所在類的hashCode()計算key1 ......

    uj5u.com 2020-09-10 05:36:38 more
最新发布
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:20:47 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:20:25 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:20:17 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:20:10 more
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:19:44 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:19:07 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:18:57 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:18:49 more
  • 05單件模式

    #經典的單件模式 public class Singleton { private static Singleton uniqueInstance; //一個靜態變數持有Singleton類的唯一實體。 // 其他有用的實體變數寫在這里 //構造器宣告為私有,只有Singleton可以實體化這個類! ......

    uj5u.com 2023-04-19 08:42:51 more
  • 【架構與設計】常見微服務分層架構的區別和落地實踐

    軟體工程的方方面面都遵循一個最基本的道理:沒有銀彈,架構分層模型更是如此,每一種都有各自優缺點,所以請根據不同的業務場景,并遵循簡單、可演進這兩個重要的架構原則選擇合適的架構分層模型即可。 ......

    uj5u.com 2023-04-19 08:42:41 more