LNMP環境應用
企業LNMP環境應用
L=linux 丨 N=nginx 丨 A=apache 丨 P=php 丨 T=tomcat
Nginx和Apache都是Web應用伺服器
相對來說,Nginx處理靜態資料快,Apache處理動態快
Nginx對系統資源佔用小,Apache資源佔用高
Nginx用得是epoll模型(非同步非阻塞IO),Apache用的是select模型(同步阻塞IO)
LNMP介紹
大約在2010年以前,網際網路公司最常用的經典Web服務環境組合就是LAMP(即Linux,Apache,MySQL,PHP),近幾年隨著Nginx Web服務的逐漸流行,
又出現了新的Web服務環境組合--LNMP或LEMP,其中LNMP為Linux,Nginx,MySQL,PHP等首字母的縮寫,而LEMP中的E則表示Nginx,
它取自Nginx名字的發音(engine x)。現在,LNMP已經逐漸成為國內大中型網際網路公司網站的主流組合環境,因此,我們必須熟練掌握LNMP環境的搭建,優化及維護方法。
LNMP組合工作流程
在深入學習LNMP組合之前,有必要先來了解以下LNMP環境組合的基本原理,也就是它們之間到底是怎樣互相排程的?
在LNMP組合工作時,首先是使用者通過瀏覽器輸入域名請求Nginx Web服務,如果請求是靜態資源,則由Nginx解析返回給使用者;如果是動態請求(.php結尾),
那麼Nginx就會把它通過FastCGI介面(生產常用方法)傳送給PHP引擎服務(FastCGI程序php-fpm)進行解析,如果這個動態請求要讀取資料庫資料,
那麼PHP就會繼續向後請求MySQL資料庫,以讀取需要的資料,並最終通過Nginx服務把獲取的資料返回給使用者,
這就是LNMP環境的基本請求順序流程。這個請求流程是企業使用LNMP環境的常用流程。
使用者的請求一定是遵循HTTP協議的因此是通過瀏覽器過來的
(1)Nginx=http格式資料包,9http資料包特點格式很鬆散,因此解析的速度慢,但是資料包比fastcgi格式資料包小
(2)介面規則=快速介面,fastcgi資料包,這種規則的資料包,格式非常嚴謹,因此PHP解析的速度非常快,但是越嚴謹的資料包越大,所以fastcgi資料包大小要絕對大於http資料包
(3)軟體的設計架構分為C/S和B/S,作為客戶端Client的fastcgi和作為Server端的PHP-fpm,因為經常用,fastcgi_pass和Nginx合併,而PHP-fpm和PHP功能合併了
(4)nginx和apache其實一樣,如果沒有PHP支援,那麼都處理不了所謂的靜態請求,它們自身其實都只能處理靜態,只能apache轉發動態資料包的速度快,但是隻是單個包速度快,apache併發低
(5)程式碼是絕對不往儲存裡放的,程式碼是不需要做備份的,保證安全的是圖片和視訊。
(6)PHP需要訪問網頁,需不需要掛儲存,要看它什麼功能,如果是讀網頁不需要掛儲存。
http資料包特點:格式鬆散,因此解析速度慢,但是資料包比fastsgi格式資料包小
fastsgi資料包:格式嚴謹,因此解析速度快,但是嚴謹的資料包大,所以fastsgi格式資料包大於http資料包
LNMP的部署方式分為兩種
全都部署在一臺上 LNMP
全都不在一臺上 N+P+M
只分離MySQL NP+M
FastCGI介紹
什麼是CGI
CGI的全稱為“通用閘道器介面”(Common Gateway Interface),為HTTP伺服器與其他機器上的程式服務通訊交流的一種工具,CGI程式須執行在網路伺服器上。
傳統CGI介面方式的主要缺點是效能較差,因為每次HTTP伺服器遇到動態程式時都需要重新啟動解析器來執行解析,之後結果才會被返回給HTTP伺服器。這在處理高併發訪問時幾乎是不可用的,因此就誕生了FastCGI。另外,傳統的CGI介面方式安全性也很差,故而現在已經很少被使用了。
什麼是FastCGI
FastCGI是一個可伸縮的,高速地在HTTP伺服器和動態指令碼語言間通訊的介面(在Linux下,FastCGI介面即為socket,這個socket可以是檔案socket,也可以是IP socket),主要優點是把動態語言和HTTP伺服器分離出來。多數流行的HTTP伺服器都支援FastCGI,包括Apache,Nginx和Lighttpd等。
同時,FastCGI也被許多指令碼語言所支援,例如當前比較流程的指令碼語言PHP。FastCGI介面採用的是C/S架構,它可以將HTTP伺服器和指令碼解析伺服器分開,同時還能在指令碼解析伺服器上啟動一個或多個指令碼來解析守護程序。當HTTP伺服器遇到動態程式時,可以將其直接交付給FastCGI程序來執行,然後將得到的結果返回給瀏覽器。這種方式可以讓HTTP伺服器專一地處理靜態請求,或者將動態指令碼伺服器的結果返回給客戶端,這在很大程度上提高了整個應用系統的效能。
FastCGI的重要特點如下:
HTTP伺服器和動態指令碼語言間通訊的介面或工具。
可把動態語言解析和HTTP伺服器分離開。
Nginx,Apache,Lighttpd,以及多數動態語言都支援FastCGI。
FastCGI介面方式採用C/S結構,分為客戶端(HTTP伺服器)和伺服器端(動態語言解析伺服器)
PHP動態語言伺服器端可以啟動多個FastCGI的守護程序(例如php-fpm(fcgi process mangement))
HTTP伺服器通過(例如Nginx fastcgi_pass)FastCGI客戶端和動態語言FastCGI伺服器端通訊(例如php-fpm)
Nginx FastCGI的執行原理
Nginx不支援對外部動態程式的直接呼叫或者解析,所有的外部程式(包括PHP)必須通過FastCGI介面來呼叫。FastCGI介面在Linux下是socket,為了呼叫CGI程式,還需要一個FastCGI的wrapper(可以理解為用於啟動另一個程式的程式),這個wrappper繫結在某個固定的socket上,如埠或檔案socket。當Nginx將CGI請求傳送給這個socket的時候,通過FastCGI介面,wrapper接收到請求,然後派生出一個新的執行緒,這個執行緒呼叫直譯器或外部程式處理指令碼來讀取返回的資料;接著,wrapper再將返回的資料通過FastCGI介面,沿著固定的socket傳遞給Nginx;最後,Nginx將返回的資料傳送給客戶端,這就是Nginx+FastCGI的整個運作過程。
LNMP搭建流程
首先搭建Nginx服務
用本地yum倉庫安裝依賴包
yum install -y pcre-devel openssl-devel gcc gcc-c++ make automake
下載軟體原始碼包
wget -q http://nginx.org/download/nginx-1.10.2.tar.gz
沒有wget命令需要手動安裝
yum -y install wget
建立程式使用者
useradd -s /sbin/nologin -M www
解壓縮和預配置,編譯和安裝
tar xf nginx-1.10.2.tar.gz -C /usr/src/
cd /usr/src/nginx-1.10.2
./configure --user=www --group=www --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module
make && make install
做Nginx軟連結
ln -s /usr/local/nginx/sbin/* /usr/local/sbin
修飾一下Nginx配置檔案
cd /usr/local/nginx/conf
egrep -v "#|^$" nginx.conf.default > nginx.conf
特別提示
因為安裝PHP需要MySQL的安裝環境,所以需要先安裝MySQL,不然PHP編譯會報錯
如何沒有安裝MySQL需要把--with-mysql=/usr/local/mysql改成--with-mysql=mysqlnd
MySQL二進位制搭建方法
建立程式使用者
useradd -s /sbin/nologin -M mysql
獲取MySQL二進位制軟體包
連結:https://pan.baidu.com/s/1dzCH1GsOiMR3i_omOZliHA
提取碼:u6h8
二進位制方式安裝MySQL
tar xf mysql-5.5.32-linux2.6-x86_64.tar.gz -C /usr/local
cd /usr/local
ln -s mysql-5.5.32-linux2.6-x86_64 mysql
初始化MySQL配置檔案my.cnf
cd /usr/local/mysql
/bin/cp support-files/my-small.cnf /etc/my.cnf
工作中如果主機名,在你本地沒有對映,有可能會有錯誤出現
echo "192.168.200.129 LNMP" >> /etc/hosts
初始化MySQL資料庫檔案
chown -R mysql.mysql /usr/local/mysql
光碟源安裝依賴包,否則編譯會報錯
yum -y install libaio
/usr/local/mysql/scripts/mysql_install_db --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data --user=mysql
設定MySQL啟動指令碼
cp support-files/mysql.server /etc/init.d/mysqld
chmod +x /etc/init.d/mysqld
/etc/init.d/mysqld start
ss -antup | grep 3306
chkconfig --add mysqld
chkconfig mysqld on
chkconfig --list mysqld
製作軟連線,讓linux有mysql命令
ln -s /usr/local/mysql/bin/* /usr/local/bin
which mysql
建立MySQL密碼
mysqladmin -uroot password '123321'
PHP服務搭建
安裝PHP所需的lib庫
yum -y install zlib-devel libxml2-devel libjpeg-devel libjpeg-turbo-devel libiconv-devel
yum -y install freetype-devel libpng-devel gd libcurl-devel libxslt-devel
安裝yum無法安裝的libiconv庫
wget http://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.14.tar.gz
tar xf libiconv-1.14.tar.gz -C /usr/src/
cd /usr/src/libiconv-1.14/
./configure --prefix=/usr/local/libiconv && make && make install
安裝libmcrypt庫
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-6.repo
yum -y install libmcrypt-devel
安裝mhash加密擴充套件庫
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-6.repo
yum -y install mhash
安裝mcrvpt加密擴充套件庫
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-6.repo
yum -y install mcrypt
獲取PHP軟體包
解壓配置PHP
tar xf php-5.3.28.tar.gz -C /usr/src/
cd /usr/src/php-5.3.28/
./configure --prefix=/usr/local/php5.3.28 --with-mysql=/usr/local/mysql --with-iconv-dir=/usr/local/libiconv --with-freetype-dir --with-jpeg-dir --with-png-dir --with-zlib --with-libxml-dir=/usr --enable-xml --disable-rpath --enable-safe-mode --enable-bcmath --enable-shmop --enable-sysvsem --enable-inline-optimization --with-curl --with-curlwrappers --enable-mbregex --enable-fpm --enable-mbstring --with-mcrypt --with-gd --enable-gd-native-ttf --with-openssl --with-mhash --enable-pcntl --enable-sockets --with-xmlrpc --enable-zip --enable-soap --enable-short-tags --enable-zend-multibyte --enable-static --with-xsl --with-fpm-user=www --with-fpm-group=www --enable-ftp
最後的正確輸出提示為:Thank you for using PHP.
編譯詳解
--prefix=/usr/local/php5.2.28
表示指定PHP的安裝路徑為/usr/local/php5.3.28
--with-mysql=/usr/local/mysql
表示需要指定MySQL的安裝路徑,安裝PHP需要的MySQL相關內容。當然,如果沒有MySQL軟體包,也可以不單獨安裝,這樣的情況可使用--with-mysql=mysqlnd替代--with-mysql=/usr/local/mysql,因為PHP軟體裡已經自帶了連線MySQL的客戶端工具。
--with-fpm-user=www
nginx表示指定PHP-FPM程序管理的使用者為www,此處最好和Nginx服務使用者統一
--with-fpm-group=www
表示指定PHP-FPM程序管理的組為www,此處最好與Nginx服務使用者組統一。
--enable-fpm
表示啟用PHP-FPM方式服務,即以FastCGIF方式執行PHP服務。
編譯PHP
ln -s /usr/local/mysql/lib/libmysqlclient.so.18 /usr/lib64
touch ext/phar/phar.phar
make
make最後的正確提示
Build complete.
Don't forget to run 'make test'.
安裝PHP生成檔案到系統
make install
設定軟連結
ln -s /usr/local/php5.3.28/ /usr/local/php
PHP配置預設模版檔案
生產環境:php.ini-development 開發環境:php.ini-production
開發環境更多的是開啟日誌,除錯資訊,而生產環境都是關閉狀態
cd /usr/src/php-5.3.28
cp php.ini-production /usr/local/php/lib/php.ini
cd /usr/local/php/etc/
cp php-fpm.conf.default php-fpm.conf
關於php-fpm.conf,暫時可用預設的配置,先把服務搭好,以後再進行優化。
分離式部署特別提示
vim php-fpm.conf
listen = 127.0.0.1:9000 --->如要分離式部署,需要把本地IP改成遠端IP
啟動PHP服務
/usr/local/php/sbin/php-fpm
ss -antup | grep 9000
修改Nginx配置檔案
cd /usr/local/nginx
vim conf/nginx.conf
worker_processes 1;
error_log logs/error.log;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server {
listen 80;
server_name blog.yunjisuan.com;
location / {
root html/blog; 網頁目錄
index index.html index.htm;
}
location ~ .*\.(php|php5)?$ { 動態網頁
root html/blog;
fastcgi_pass 127.0.0.1:9000; 推到127.0.0.1:9000
fastcgi_index index.php; 動態網頁首頁
include fastcgi.conf; 引進fastcgi.conf模板
}
}
}
檢查並啟動Nginx
/usr/local/nginx/sbin/nginx -t
檢查Nginx配置檔案的語法/usr/local/nginx/sbin/nginx
ss -antup | grep 80
此步在生產環境很關鍵,如不提前檢查語法,重啟後發現語法錯誤會導致Nginx無法提供服務,,給使用者訪問體驗帶來不好的影響。
建立網頁目錄
cd html
mkdir blog
針對靜態網頁測試
echo "`
hostname -I`
blog.yunjisuan.com" > blog/index.html
新增虛假機對映並測試靜態
vim /etc/hosts
192.168.200.70 LNMP blog.yunjisuan.com
curl blog.yunjisuan.com
針對動態網頁測試
echo "<?php phpinfo(); ?>" > blog/test_info.php 或者vim寫入
新增windows對映並測試動態
C:\Windows\System32\drivers\etc --->windows對映檔案位置
192.168.200.70 blog.yunjisuan.com
在瀏覽器輸入blog.yunjisuan.com/test_info.php
針對MySQL測試
cd blog
vim test_mysql.php
<?php
$link_id=mysql_connect('localhost','root','123321'); 連線mysql的資訊交給一個變數,本地,賬號,密碼
if($link_id){ 如果能連線上
echo "mysql successful by zz !\n"; 如果能連線上輸出
}else{
echo mysql_error(); 如果連線不上顯示錯誤頁面
}
?>
用PHP命令測試
如果沒有PHP命令就是沒做軟連結
ln -s /usr/local/php/bin/* /usr/local/bin
php test_mysql.php
用PHP命令啟用這個指令碼
windows網頁測試
blog.yunjisuan.com/test_mysql.php
開源部落格程式WordPress介紹
WordPress 是一套利用PHP語言和MySQL資料庫開發的開源免費的blog(部落格,網站)程式,使用者可以在支援PHP環境和MySQL資料庫的伺服器上建立blog站點。它的功能非常強大,擁有眾多外掛,易於擴充功能。其安裝和使用也都非常方便。目前WordPress已經成為搭建blog平臺的主流,很多釋出平臺都是根據WordPress二次開發的,如果你也想像他們一樣擁有自己的blog,可購買網上的域名及空間,然後搭建LNMP環境,部署WordPress程式後就可以輕鬆成就自己的夢想了。
WordPress是單使用者個人部落格與多使用者部落格是有區別的。
部署一個blog程式服務
MySQL環境配置準備
mysql -uroot -p123321 --->登陸MySQL資料庫
create database wordpress; --->建立一個名字為wordpress的資料庫存放blog資料
grant all on wordpress.* to [email protected]'localhost' identified by '123321';
建立一個專用的WordPress blog管理使用者
localhost只允許本機通過wordpress使用者訪問資料庫flush privileges; --->重新整理許可權,使得建立使用者生效
exit
Nginx及PHP環境配置準備
在Nginx配置檔案裡補充一個動態首頁檔案
vim /usr/local/nginx/conf/nginx.conf
需要在index後補一個首頁檔案index.php
修改完配置檔案平滑重啟服務
/usr/local/nginx/sbin/nginx -t
/usr/local/nginx/sbin/nginx -s reload
獲取WordPress部落格程式
www.wordpress.org下載部落格程式
連結:https://pan.baidu.com/s/1hGyd1xFuL0oPBsFeROuUYQ
提取碼:tmgk
解壓並放置到blog域名到對應虛擬主機的站點目錄下
tar xf wordpress-4.9.8.tar.gz
cd /usr/local/nginx/html/blog
rm -rf *
mv ~/wordpress/* .
授權使用者訪問
chown -R www.www /usr/local/nginx/html/blog
開始安裝blog部落格程式
瀏覽器輸入blog.yunjisuan.com,進入介面安裝,選擇中文
資料庫名 --->前面建立的資料庫 使用者 --->專用的使用者名稱 密碼 --->資料庫密碼 資料庫主機 --->允許訪問的資料庫主機,這裡是LNMP一體的環境所以localhost最安全 表字首 --->為了安全改一下,防止黑客猜你的表名
站點標題 --->部落格主頁的名字
使用者名稱 --->登陸部落格的使用者
密碼 --->登陸部落格的密碼
您的電子郵件 --->有問題傳送的郵箱
對搜尋引擎的可見性 --->測試環境需要取消,有的時候會打不開,會導致瀏覽速度很慢
安裝完WrodPress後直接登陸即可,進入的是後臺頁面
網頁輸入域名測試
實現WordPress部落格程式URL靜態化
實現此功能時,首先要在Settings-固定連結-自定義結構-新增程式碼-儲存更改
/archives/%post_id%.html
然後修改Nginx配置檔案
vim /usr/local/nginx/conf/nginx.conf
worker_processes 1;
error_log logs/error.log;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server {
listen 80;
server_name blog.yunjisuan.com;
location / {
root html/blog;
index index.php index.html index.htm;
if (-f $request_filename/index.html){
rewrite (.*) $1/index.html break;
}
if (-f $request_filename/index.php){
rewrite (.*) $1/index.php;
}
if (!-f $request_filename){
rewrite (.*) /index.php;
}
location ~ .*\.(php|php5)?$ {
root html/blog;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
include fastcgi.conf;
}
}
}
}
檢查語法並重新載入Nginx服務
/usr/local/nginx/sbin/nginx -t
/usr/local/nginx/sbin/nginx -s reload
通過瀏覽器訪問測試,是否靜態化
blog.yunjisuan.com
使用者瀏覽器端的圖片解析規則
上傳圖片需要做2個操作,圖片放到儲存裡,放在儲存的位置需要寫到資料庫裡
測試階段
主配置檔案
vim /usr/local/nginx/conf/nginx.conf
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server {
listen 80;
server_name xxx.yunjisuan.com;
location / {
root html/xxx;
index index.html index.htm;
}
}
檢查語法並重新載入Nginx服務
/usr/local/nginx/sbin/nginx -t
/usr/local/nginx/sbin/nginx -s reload
生成目錄和匯入圖片
cd /usr/local/nginx/html
mkdir xxx
chown -R www.www xxx/
vim xxx/index.html
在把需要用的圖片,匯入虛擬機器裡
- welcom
<img src="http://192.168.200.132/666.jpg" />
加入本地對映 vim /etc/hosts
windows對映就不演示了,自己新增一下就好
網站測試
清空nginx日誌檔案
cd /usr/local/nginx/logs
>access.log
瀏覽器中開啟 xxx.yunjisuan.com,然後看access.log日誌檔案
分析Nginx日誌檔案
瀏覽器單獨發起請求在去拿圖片,圖片都是後拿的