十、LNMP架構

1LNMP架構概述

1.1.什麼是LNMP 

LNMP 是一套技術的組合,L = Linux,N = Nginx,M~ = MySQL,P~ = PHPphp

1.2.LNMP架構是如何工做的

首先Nginx服務是不能處理動態請求,那麼當用戶發起動態請求時,Nginx又是如何進行處理的。
當用戶發起http請求,請求會被Nginx處理,若是是靜態資源請求Nginx則直接返回,若是是動態請求的Nginx則經過FastCGI的協議轉交給後端的PHP程序處理,具體以下圖所示

1.3.Nginx與快速CGI詳細工做流程以下圖所示

1.用戶經過http協議發起請求,請求會先抵達LNMP架構中的Nginx 
2.Nginx會根據用戶的請求進行位置規則匹配
3.Location若是匹配到請求是靜態,則由Nginx讀取本地直接返回
4.位置若是匹配到請求是動態,則由Nginx將請求轉發給fastcgi協議
5.fastgi收到後將請求交給php-fpm管理進程,php-fpm管理進程接收到後會調用warrap工做進程 
6 .warrap進程會調用php程序進行解析,若是隻是解析代碼,php直接返回
7.若是有查詢數據庫操做,則由php鏈接數據庫(用戶密碼IP)發起查詢的操做
8.最終數據由mysql-> php- > PHP-fpm-> fastcgi-> nginx-> HTTP->用戶

2LNMP架構環境部署

1)使用官方倉庫安裝Nginxcss

[root@nginx ~]# cat /etc/yum.repos.d/nginx.repo 
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/7/$basearch/
gpgcheck=0
enabled=1

#安裝Nginx
[root@nginx ~]# yum install nginx -y

2)啓動Nginx,並將Nginx加入開機自啓html

[root@nginx ~]# systemctl start nginx
[root@nginx ~]# systemctl enable nginx

3)使用第三方擴展源安裝php7.1mysql

[root@nginx ~]# yum remove php-mysql-5.4 php php-fpm php-common
[root@nginx ~]# cat /etc/yum.repos.d/php.repo
[php]
name = php Repository
baseurl = http://us-east.repo.webtatic.com/yum/el7/x86_64/
gpgcheck = 0

[root@nginx ~]# 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)配置php-fpm用戶與Nginx的運行用戶保持一致nginx

[root@nginx ~]# sed -i '/^user/c user = www' /etc/php-fpm.d/www.conf 
[root@nginx ~]# sed -i '/^group/c group = www' /etc/php-fpm.d/www.conf

4)啓動php-fpm,並將其加入開機自啓web

[root@nginx ~]# systemctl start php-fpm
[root@nginx ~]# systemctl enable php-fpm

5)安裝Mariadb數據庫redis

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

6)啓動Mariadb數據庫,並加入開機自動sql

[root@nginx ~]# systemctl start mariadb
[root@nginx ~]# systemctl enable mariadb

7)給Mariadb配置登錄密碼,而且是新密碼進行登陸數據庫mongodb

[root@nginx ~]# mysqladmin password 'Bgx123.com'
[root@nginx ~]# mysql -uroot -pBgx123.com

3LNMP架構環境配置

在將Nginx與PHP集成過程當中,須要先了解Fastcgi代理配置語法數據庫

3.1.設置的fastcgi服務器的地址,該地址能夠指定爲域名或IP地址,以及端口

Syntax: fastcgi_pass address;
Default: —
Context: location, if in location

#語法示例
fastcgi_pass localhost:9000;
fastcgi_pass unix:/tmp/fastcgi.socket;

3.2.設置的fastcgi默認的首頁文件,須要結合fastcgi_param一塊兒設置

Syntax: fastcgi_index name;
Default: —
Context: http, server, location

3.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 /code$fastcgi_script_name;

3.4.經過圖形方式展現fastcgi_index與fastcgi_param做用

3.5.最終Nginx的鏈接FASTCGI服務器配置以下(nginx和php集成)

[root@nginx ~]# 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;
        }
}

3.6.在/代碼目錄下建立info.php的文件,測試可否經過瀏覽器訪問,訪問成功以下圖

[root@nginx ~]# cat /code/info.php
<?php
        phpinfo();
?>

3.7在/ code目錄下建立mysql.php文件,填入對應的數據庫IP,用戶名,密碼(php鏈接mysql)

[root@nginx ~]# cat /code/mysql.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數據庫成功";
       ?>

3.8最後經過瀏覽器訪問/mysqli.php文件,如成功訪問以下圖

4部署博客產品的WordPress

4.1配置Nginx虛擬主機站點,域名爲blog.bgx.com

#nginx具體配置信息
[root@nginx ~]# cat /etc/nginx/conf.d/wordpress.conf
server {
    listen 80;
    server_name blog.tuchuang.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;
    }
}

4.2重啓nginx服務

[root@nginx ~]# systemctl restart nginx

4.3獲取wordpress產品,解壓並部署wordress

[root@nginx ~]# mkdir /code
[root@nginx ~]# cd /code![](https://img2018.cnblogs.com/blog/1488697/201905/1488697-20190528231702326-1090090313.png)

[root@nginx code]# wget https://cn.wordpress.org/wordpress-4.9.4-zh_CN.tar.gz
[root@nginx ~]# tar xf wordpress-4.9.4-zh_CN.tar.gz
[root@nginx ~]# chown -R www.www /code/wordpress/

4.4因爲wordpress產品須要依賴數據庫,因此須要手動創建數據庫

[root@nginx ~]# mysql -uroot -p123456
mysql> create database wordpress;
mysql> exit

4.5經過瀏覽器訪問wordpress,並部署該產品(須要作域名解析)







5部署知乎產品Wecenter

5.1.配置Nginx的虛擬主機站點,域名爲zh.tuchuang.com

[root@http-server ~]# cat /etc/nginx/conf.d/zh.conf
server {
    listen 80;
    server_name zh.tuchuang.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服務
[root@http-server ~]# systemctl restart nginx

5.2.下載Wecenter產品,部署Wecenter並受權

[root@web02 ~]# wget http://ahdx.down.chinaz.com/201605/WeCenter_v3.2.1.zip
[root@web02 ~]# unzip WeCenter_v3.1.9.zip 
[root@web02 ~]# mv WeCenter_3-2-1/ zh
[root@web02 ~]# chown -R www.www /code/zh/

5.3.因爲wecenter產品須要依賴數據庫,因此須要手動創建數據庫

[root@http-server ~]# mysql -uroot -pBgx123.com  #登錄數據庫
MariaDB [(none)]> create database zh;   #建立zh數據庫
MariaDB [(none)]> exit

5.4.經過瀏覽器訪問網站




6.佈置在線教育產品edusoho

6.1.配置nginx

[root@web01 code]# cat /etc/nginx/conf.d/edu.oldboy.com.conf 
server {
    listen 80;
    server_name edu.oldboy.com;
    root /code/edusoho/web;
    client_max_body_size 200m;

    location / {
        index app.php;
        try_files $uri @rewriteapp;
    }
    location @rewriteapp {
        rewrite ^(.*)$ /app.php/$1 last;
    }

    location ~ ^/udisk {
        internal;
        root /code/edusoho/app/data/;
    }

    location ~ ^/(app|app_dev)\.php(/|$) {
        fastcgi_pass   127.0.0.1:9000;
        fastcgi_split_path_info ^(.+\.php)(/.*)$;
        include fastcgi_params;
        fastcgi_param  SCRIPT_FILENAME    $document_root$fastcgi_script_name;
        fastcgi_param  HTTPS              off;
        fastcgi_param HTTP_X-Sendfile-Type X-Accel-Redirect;
        fastcgi_param HTTP_X-Accel-Mapping /udisk=/code/edusoho/app/data/udisk;
        fastcgi_buffer_size 128k;
        fastcgi_buffers 8 128k;
    }

    # 配置設置圖片格式文件
    location ~* \.(jpg|jpeg|gif|png|ico|swf)$ {
        # 過時時間爲3年
        expires 3y;
        # 關閉日誌記錄
        access_log off;
        # 關閉gzip壓縮,減小CPU消耗,由於圖片的壓縮率不高。
        gzip off;
    }
    # 配置css/js文件
    location ~* \.(css|js)$ {
        access_log off;
        expires 3y;
    }
    # 禁止用戶上傳目錄下全部.php文件的訪問,提升安全性
    location ~ ^/files/.*\.(php|php5)$ {
        deny all;
    }

    # 如下配置容許運行.php的程序,方便於其餘第三方系統的集成。
    location ~ \.php$ {
        fastcgi_pass   127.0.0.1:9000;
        fastcgi_split_path_info ^(.+\.php)(/.*)$;
        include fastcgi_params;
        fastcgi_param  SCRIPT_FILENAME    $document_root$fastcgi_script_name;
        fastcgi_param  HTTPS              off;
    }
}

6.2.下載軟件,而且受權

wget http://download.edusoho.com/edusoho-8.2.17.tar.gz
tar xf edusoho-8.2.17.tar.gz
chown -R www.www edusoho

6.3.調整php的上傳大小

[root@web01 ~]# vim /etc/php.ini
post_max_size = 200M
upload_max_filesize = 200M
[root@web01 code]# systemctl restart php-fpm

7.拆分數據庫至至獨立服務器

7.1.爲何要進行數據庫的拆分

因爲單臺服務器運行LNMP架構會致使網站訪問緩慢,當內存被吃滿時,很容易致使系統出現OOM故障(實質就是內存不夠致使),從而殺掉佔用內存最大的程序(有可能就殺掉數據庫,致使數據丟失),因此須要將web和數據庫進行獨立部署。

7.2.數據庫拆分後解決了什麼問題

1.緩解web網站的壓力
2.加強數據庫讀寫性能
3.提升用戶訪問的速度

7.3.數據庫拆分架構演變過程,以下圖所示

7.4.數據庫拆分環境規劃

主機名稱 應用環境 外網地址 內網地址
WEB01 nginx的PHP + 10.0.0.7 172.16.1.7
DB01 MySQL的 172.16.1.51

7.5.數據庫拆分架構詳細步驟

7.5.1.web01網站服務器操做以下

1)備份web01上的數據庫,123456是數據庫密碼
[root@web01 ~]# mysqldump -uroot -p'123456' --all-databases --single-transaction > mysql-all.sql
2)將web01上備份的數據庫拷貝貝至db01服務器上
[root@web01 ~]# scp mysql-all.sql  root@172.16.1.51:/tmp

7.5.2.db01數據庫服務器操做以下

1)將web01服務器上推送的數據庫備份文件恢復至db01服務器新數據庫中
[root@db01 ~]# yum install mariadb mariadb-server -y
[root@db01 ~]# systemctl start mariadb
[root@db01 ~]# systemctl enable mariadb
[root@db01 ~]# mysql -uroot -p'123456' < /tmp/mysql-all.sql 
2)數據庫導入完成後,重啓數據庫,使用新密碼進行登陸,並檢查數據庫已被導入成功
[root@db01 ~]# systemctl restart mariadb
[root@db01 ~]# mysql -uroot -p123456.com
mysql> show databases;
3)在新數據庫上受權,容許全部網段,經過全部oldboy帳戶鏈接並操做該數據庫
#受權全部權限   grant all privileges
#受權全部庫全部表 *.* (前面的*表明全部庫,後面的*表明全部表)
#將受權賦予給哪一個用戶,這個用戶只能經過哪一個網段過來(%全部) 'all'@'%'
#受權該用戶登陸的密碼 identified by
        
mysql> grant all on  *.* to all@'%' identified by '123456';
Query OK, 0 rows affected (0.00 sec)

###客戶端測試遠程帳號是否能鏈接數據庫:
[root@web01 ~]# mysql -h 172.16.1.51 -uoldboy -p123456
注意:客戶端必須安裝了mysql客戶端才能測試。

7.5.3.web01修改代碼鏈接新數據庫環境

1)修改Wordpress產品代碼鏈接數據庫的配置文件
[root@web01 ~]# vim /code/wordpress/wp-config.php
# 數據庫名稱
define('DB_NAME', 'wordpress');
# 數據庫用戶
define('DB_USER', 'oldboy');
# 數據庫密碼
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' => 'oldboy',
'password' => '123456',
'dbname' => 'zh',
3)最後訪問網站,成功打開,至此拆分數據庫完成

8.擴展多臺相同的web服務器

8.1.爲何要擴展多臺web節點

單臺web服務器能抗住的訪問量是有限的,配置多臺網服務器能提高更高的訪問速度。

8.2.擴展多臺web解決了什麼問題

1.單臺web節點若是故障,會致使業務down機
2.多臺web節點能保證業務的持續穩定,擴展性高
3.多臺web節點能有效的提高用戶訪問網站的速度

8.3.多臺web節點技術架構組成,以下圖所示

8.4.快速擴展一臺網絡節點環境規劃

主機名稱 應用環境 外網地址 內網地址
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

8.5.快速擴展一臺web節點詳細步驟

經過WEB01現有環境快速的擴展一臺web02的服務器,數據庫統一使用DB01

1)建立www用戶
[root@web02 ~]# groupadd -g666 www
[root@web02 ~]# useradd -u666 -g666 www
2)安裝LNP
[root@web02 ~]# scp -rp root@172.16.1.7:/etc/yum.repos.d/* /etc/yum.repos.d/

[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
3)將web01的nginx配置文件導入到web02
[root@web02 ~]# scp -rp root@172.16.1.7:/etc/nginx /etc/
4)將web01的php配置文件導入到web02 (/etc/php-fpm.conf /etc/php-fpm.d /etc/php.ini)
[root@web02 ~]# rsync -avz --delete root@172.16.1.7:/etc/php* /etc/  (後面與前面保持一直)

5)將web01的產品代碼打包傳輸到web02服務器上,在web1上進行打包操做
[root@web01 ~]# tar zcf code.tar.gz /code
[root@web01 ~]# scp code.tar.gz root@172.16.1.8:/tmp

#在web02服務器上進行解壓
[root@web02 ~]# tar xf /tmp/code.tar.gz -C /
6)最後啓動nginx與php-fpm,並加入開機自啓
[root@web03 ~]# systemctl start nginx php-fpm 
[root@web03 ~]# systemctl enable nginx php-fpm

9.拆分靜態資源至獨立服務器

9.1.拆分爲何靜態資源至獨立存儲服務器

當後端的web節點出現多臺時,會致使用戶上傳的圖片,視頻附件等內容僅上傳至一臺網絡服務器,那麼其餘的網絡服務器則沒法訪問到該圖片。

9.2.新增一臺nfs存儲服務器解決了什麼問題

1.保證了多臺web節點靜態資源一致
2.有效節省多臺web節點的存儲空間
3.統一管理靜態資源,便於後期推送至CDN進行靜態資源加速

9.3.多臺web節點技術架構組成,以下圖所示

9.4.快速擴展一臺網絡節點環境規劃

主機名稱 應用環境 外網地址 內網地址
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

9.5.快速擴展一臺web節點詳細步驟

9.5.1.nfs服務端,操做步驟以下

1)安裝並配置nfs
[root@nfs ~]# yum install nfs-utils -y
[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)
2)建立共享目錄,並進行受權
[root@nfs01 ~]# mkdir /data/{blog,zh} -p
[root@nfs01 ~]# chown -R www.www /data/
3)啓動nfs服務,並加入開機自啓
[root@nfs01 ~]# systemctl restart nfs-server

9.5.2.web01端操做步驟以下

1)web01節點安裝nfs,而後使用showmount查看服務端共享的資源
[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
2)如何查找Wordpress靜態資源存放的位置
瀏覽器->右鍵->檢查->Network->選擇左上角的Select按鈕->點擊對應的圖片,而後能獲取到對應的url地址,以下
# http://blog.tuchuang.com/wp-content/uploads/2019/01/121716bnb4pgdj6b6gspjq-1024x576.jpg
3)備份web01服務器上Wordpress的靜態資源,由於該服務器上的資源資源最全(意思就是備份一臺靜態資源最多的服務器)
[root@web01 ~]# cd /code/wordpress/wp-content
[root@web01 wp-content]# scp -rp uploads/* root@172.16.1.31:/data/blog/
4)web01客戶端執行掛載操做
[root@web01 wp-content]# mount -t nfs 172.16.1.31:/data/blog /code/wordpress/wp-content/uploads/
5)將掛載信息加入開機自啓
[root@web01 wp-content]# tail -1 /etc/fstab 
172.16.1.31:/data/blog  /code/wordpress/wp-content/uploads nfs defaults 0 0
[root@web01 wp-content]# mount -a

9.5.3.web02端,操做步驟以下

1)web02客戶端直接掛載nfs便可
[root@web02 ~]# mount -t nfs 172.16.1.31:/data/blog /code/wordpress/wp-content/uploads/
2)將掛載信息加入開機自啓
[root@web02 ~]# tail -1 /etc/fstab 
172.16.1.31:/data/blog  /code/wordpress/wp-content/uploads nfs defaults 0 0
[root@web02 ~]# mount -a
相關文章
相關標籤/搜索