1. 程式人生 > 實用技巧 >LNMP架構的演變

LNMP架構的演變

LNMP 演變

工作原理

  • linux + nginx + mariadb + php
  • 工作原理:
首先,瀏覽器傳送http
request請求到伺服器(Nginx),伺服器響應並處理web請求,
將一些靜態資源(CSS,圖片,視訊等)儲存伺服器上,
然後將php指令碼通過介面傳輸協議(閘道器協議)PHP-FCGI(fast-cgi)傳輸給PHP-FPM(程序管理程式),
PHP-FPM不做處理,
然後PHP-FPM呼叫PHP解析器程序,PHP解析器解析php指令碼資訊。
PHP解析器程序可以啟動多個,進行併發執行。
然後將解析後的指令碼返回到PHP-FPM,PHP-FPM再通過fast-cgi的形式將指令碼資訊傳送給Nginx.
伺服器再通過Http
response的形式傳送給瀏覽器。瀏覽器再進行解析與渲染然後進行呈現。

安裝

1.安裝 環境

安裝nginx

[root@web01 ~]# yum install nginx -y

安裝php

[root@web01 ~]# yum install php71w php71w-cli php71w-common php71w-devel php71w-embedded php71w-gd php71w-mbstring php71w-pdo php71w-xml php71w-fpm php71w-mysqlnd php71w-opcache php71w-mcrypt php71w-pecl-memcached php71w-pecl-mongodb php71w-pecl-redis php71w-pecl-zip php71w-bcmath

安裝mariadb

[root@web01 ~]# yum install mariadb-server mariadb  -y

2.Nginx與PHP整合的原理。

[root@web01 ~]# cat /etc/nginx/conf.d/php.oldxu.com.conf 
server {
	listen 80;
	server_name php.oldxu.com;
	root /code;

	location / {
		index index.php info.php;
	}

	location ~ \.php$ {
		#將php請求交給本地9000埠處理,9000是php-fpm的預設埠
		fastcgi_pass 127.0.0.1:9000;

		#告訴php-fpm解析本地的哪個路徑下的哪個檔案
		fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

		#包含一些其他的相關資訊的變數
		include fastcgi_params;
	}
}

2.重啟服務 nginx php-fpm 臨時的 永久的
3.準備檔案
4.hosts劫持
5.域名訪問

PHP與MySQL整合的原理。

1.啟動mariadb
[root@web01 ~]# systemctl start mariadb
[root@web01 ~]# systemctl enable mariadb

	2.配置mariadb密碼
	[root@web01 ~]# mysqladmin password 'oldxu.com'
	[root@web01 ~]# mysql -uroot -poldxu.com 
	MariaDB [(none)]> quit

	3.準備一個php連線mysql的指令碼檔案
	[root@web01 ~]# cat /code/tt.php 
	<?php
    $servername = "localhost";
    $username = "root";
    $password = "oldxu.com";

    // 建立連線
    $conn = mysqli_connect($servername, $username, $password);

    // 檢測連線
    if (!$conn) {
        die("Connection failed: " . mysqli_connect_error());
    }
    echo "php連線MySQL資料庫成功";
	?>
	
	
	4.執行php命令測試是否能正常連線mysql
		[root@web01 ~]# php /code/tt.php 
		php連線MySQL資料庫成功

	5.通過瀏覽器訪問測試 整個 lnmp
		http://php.oldxu.com/tt.php

1. 資料庫的拆分

準備一臺172.16.1.51資料庫, 安裝mariadb-server
[root@db01 ~]# yum install mariadb-server -y
[root@db01 ~]# systemctl start mariadb
[root@db01 ~]# systemctl enable mariadb.service
[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 0.0.0.0:3306 0.0.0.0:* LISTEN 8296/mysqld

2.備份172.16.1.7 資料庫 -->推送至 172.16.1.51
[root@web01 ~]# mysqldump -uroot -p'oldxu.com' --all-databases > mysql-all.sql

3.172.16.1.51 恢復資料庫, 建立遠端連線的使用者
1.推送
[root@web01 ~]# scp mysql-all.sql [email protected]:~

2.登入51伺服器恢復資料
[root@db01 ~]# mysql -uroot < mysql-all.sql
[root@db01 ~]# mysql 
MariaDB [(none)]> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| test               |
| wordpress          |
| zh                 |
+--------------------+
6 rows in set (0.00 sec)

3.重啟一下資料庫
[root@db01 ~]# systemctl restart mariadb
[root@db01 ~]# mysql -uroot -poldxu.com			#重啟後密碼會變更


4.建立遠端連線使用者
MariaDB [(none)]> grant all privileges on *.* to 'all'@'%' identified by 'oldxu.com';


5.遠端連線測試   登入172.16.1.7
[root@web01 ~]# mysql -h172.16.1.51 -uall -poldxu.com
Welcome to the MariaDB monitor.  Commands end with ; or \g.

MariaDB [(none)]> 

4.應用割接 wordpress--->連線本地資料庫 修改為 連線 遠端資料庫

1.停止本地資料庫
	[root@web01 ~]# systemctl stop mariadb
	[root@web01 ~]# systemctl disable mariadb
	
2.修改wordpress連線資料庫的資訊
[root@web01 wordpress]# vim /code/wordpress/wp-config.php
/** WordPress資料庫的名稱 */
define( 'DB_NAME', 'wordpress' );

/** MySQL資料庫使用者名稱 */
define( 'DB_USER', 'all' );

/** MySQL資料庫密碼 */
define( 'DB_PASSWORD', 'oldxu.com' );

/** MySQL主機 */
define( 'DB_HOST', '172.16.1.51' );


3.修改wecenter連線資料庫的資訊
[root@web01 ~]# find ./ -type f | xargs grep -Ri "oldxu.com"
[root@web01 ~]# cat  /code/zh/system/config/database.php 
<?php

$config['charset'] = 'utf8mb4';
$config['prefix'] = 'aws_';
$config['driver'] = 'MySQLi';
$config['master'] = array (
  'charset' => 'utf8mb4',
  'host' => '172.16.1.51',
  'username' => 'all',
  'password' => 'oldxu.com',
  'dbname' => 'zh',
);
$config['slave'] = false;

2.擴充套件應用節點 ( 多個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

1.對web02進行初始化操作
	[root@web02 ~]# groupadd -g666 www
	[root@web02 ~]# useradd -u666 -g666 www
	[root@web02 ~]# scp  172.16.1.7:/etc/yum.repos.d/* /etc/yum.repos.d/
	
2.在要擴充套件的節點上安裝對應的環境:   nginx+php
	[root@web02 ~]# yum install nginx -y
	
	[root@web02 ~]# rpm -e $(rpm -qa |grep php)
	[root@web02 ~]# yum install php71w php71w-cli php71w-common php71w-devel php71w-embedded php71w-gd php71w-mbstring php71w-pdo php71w-xml php71w-fpm php71w-mysqlnd php71w-opcache php71w-mcrypt php71w-pecl-memcached php71w-pecl-mongodb php71w-pecl-redis php71w-pecl-zip php71w-bcmath -y

3.將web01上的Nginx  php-fpm  php.ini配置   以及  程式碼   拷貝至web02

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

	3.程式碼目錄 /code
		[root@web02 ~]# rsync -avz --delete 172.16.1.7:/code /
		[root@web02 ~]# ll /code/
		drwxr-xr-x  5 www www     4096 12月  6 12:41 wordpress
		drwxr-xr-x 15 www www     4096 12月  6 11:44 zh

4.重新載入 nginx  php-fpm 服務

	1.檢查nginx與php的語法是否存在錯誤
		[root@web02 ~]# nginx -t
		[root@web02 ~]# php-fpm  -t
		
	2.重新載入nginx php-fpm程式
		[root@web02 ~]# systemctl restart nginx php-fpm
		
	3.將nginx php-fpm  加入開機自啟動
		[root@web02 ~]# systemctl enable nginx php-fpm

5.進行測試  tail -f 

多個應用節點會帶來新的問題:
	1.靜態資源不一致?
	2.多個節點無法同時工作?
		0.手動DNS切換
		1.DNS輪詢   (所有的web節點都需要有公網IP)
			不安全
			成本高
			沒有監控檢查
		2.nginx代理->負載均衡

3.準備一個NFS共享目錄?

#初始化環境
[root@nfs01 ~]# groupadd -g666 www
[root@nfs01 ~]# useradd -u666 -g666 www

#安裝-配置-啟動-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) 

[root@nfs01 ~]# rm -rf /data
[root@nfs01 ~]# mkdir /data/blog /data/zh -p

#重啟nfs服務
[root@nfs01 ~]# systemctl restart nfs

2.找到web儲存靜態資源的位置?

#查詢圖片儲存的路徑-->瀏覽器 -->F12 --> Select -->選擇圖片
http://blog.oldxu.com/wp-content/uploads/2019/12/ks.jpeg
/code/wordpress/wp-content/uploads/2019/12/ks.jpeg

3.將所有節點的圖片,都選拷貝至 nfs儲存中?

#在有圖片的web節點上
[root@web02 ~]# scp -rp /code/wordpress/wp-content/uploads/* 172.16.1.31:/data/blog/

#回到nfs儲存上 重新授權
[root@nfs01 ~]# chown -R www.www /data/blog/

4.所有的web節點執行掛載的操作?

--------------------------------------------------------
# wordpress
[root@web02 ~]# mount -t nfs 172.16.1.31:/data/blog /code/wordpress/wp-content/uploads/

#切換到web01 測試後  在進行掛載測試
[root@web01 ~]# mount -t nfs 172.16.1.31:/data/blog /code/wordpress/wp-content/uploads/