LNMP 是一套技術的組合,L = Linux,N = Nginx,M~ = MySQL,P~ = PHPphp
首先Nginx服務是不能處理動態請求,那麼當用戶發起動態請求時,Nginx又是如何進行處理的。 當用戶發起http請求,請求會被Nginx處理,若是是靜態資源請求Nginx則直接返回,若是是動態請求的Nginx則經過FastCGI的協議轉交給後端的PHP程序處理,具體以下圖所示
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->用戶
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
在將Nginx與PHP集成過程當中,須要先了解Fastcgi代理配置語法數據庫
Syntax: fastcgi_pass address; Default: — Context: location, if in location #語法示例 fastcgi_pass localhost:9000; fastcgi_pass unix:/tmp/fastcgi.socket;
Syntax: fastcgi_index name; Default: — Context: http, server, location
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;
[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; } }
[root@nginx ~]# cat /code/info.php <?php phpinfo(); ?>
[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數據庫成功"; ?>
#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; } }
[root@nginx ~]# systemctl restart nginx
[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/
[root@nginx ~]# mysql -uroot -p123456 mysql> create database wordpress; mysql> exit
[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
[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/
[root@http-server ~]# mysql -uroot -pBgx123.com #登錄數據庫 MariaDB [(none)]> create database zh; #建立zh數據庫 MariaDB [(none)]> exit
[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; } }
wget http://download.edusoho.com/edusoho-8.2.17.tar.gz tar xf edusoho-8.2.17.tar.gz chown -R www.www edusoho
[root@web01 ~]# vim /etc/php.ini post_max_size = 200M upload_max_filesize = 200M [root@web01 code]# systemctl restart php-fpm
因爲單臺服務器運行LNMP架構會致使網站訪問緩慢,當內存被吃滿時,很容易致使系統出現OOM故障(實質就是內存不夠致使),從而殺掉佔用內存最大的程序(有可能就殺掉數據庫,致使數據丟失),因此須要將web和數據庫進行獨立部署。
1.緩解web網站的壓力
2.加強數據庫讀寫性能
3.提升用戶訪問的速度
主機名稱 | 應用環境 | 外網地址 | 內網地址 |
---|---|---|---|
WEB01 | nginx的PHP + | 10.0.0.7 | 172.16.1.7 |
DB01 | MySQL的 | 172.16.1.51 |
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
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客戶端才能測試。
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)最後訪問網站,成功打開,至此拆分數據庫完成
單臺web服務器能抗住的訪問量是有限的,配置多臺網服務器能提高更高的訪問速度。
1.單臺web節點若是故障,會致使業務down機
2.多臺web節點能保證業務的持續穩定,擴展性高
3.多臺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 |
經過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
當後端的web節點出現多臺時,會致使用戶上傳的圖片,視頻附件等內容僅上傳至一臺網絡服務器,那麼其餘的網絡服務器則沒法訪問到該圖片。
1.保證了多臺web節點靜態資源一致
2.有效節省多臺web節點的存儲空間
3.統一管理靜態資源,便於後期推送至CDN進行靜態資源加速
主機名稱 | 應用環境 | 外網地址 | 內網地址 |
---|---|---|---|
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 |
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
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
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