一、LNMP應用平臺概述 1.概述:LNMP代表的就是:Linux系統下Nginx+MySQL+PHP這種網站伺服器架構。Nginx是一個高性能的HTTP和反向代理伺服器,也是一個IMAP/POP3/SMTP代理伺服器。Mysql是一個小型關係型資料庫管理系統。PHP是一種在伺服器端執行的嵌入HTM ...
一、LNMP應用平臺概述
1.概述:LNMP代表的就是:Linux系統下Nginx+MySQL+PHP這種網站伺服器架構。Nginx是一個高性能的HTTP和反向代理伺服器,也是一個IMAP/POP3/SMTP代理伺服器。Mysql是一個小型關係型資料庫管理系統。PHP是一種在伺服器端執行的嵌入HTML文檔的腳本語言。這四種軟體均為免費開源軟體,組合到一起,成為一個免費、高效、擴展性強的網站服務系統。
2.優勢:穩定、高效、功能豐富、維護簡易;
二、內部實現原理
1.處理http請求流程:
第一步:瀏覽器發送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的形式傳送給瀏覽器。瀏覽器再進行解析與渲染然後進行呈現。
2.Nginx + FastCGI實現:
Nginx不支持對外部程式的直接調用或者解析,所有的外部程式(包括PHP)必須通過Fast-CGI介面來調用;
wrapper:為了調用CGI程式,還需要一個Fast-CGI的wrapper(wrapper可以理解為用於啟動另一個程式的程式),這個wrapper綁定在某個固定socket上,如埠或者文件socket。當Nginx將CGI請求發送給這個socket的時候,通過Fast-CGI介面,wrapper接收到請求,然後Fork(派生)出一個新的線程,這個線程調用解釋器或者外部程式處理腳本並讀取返回數據;接著,wrapper再將返回的數據通過Fast-CGI介面,沿著固定的socket傳遞給Nginx;最後,Nginx將返回的數據(html頁面或者圖片)發送給客戶端。這就是Nginx+Fast-CGI的整個運作過程。
3.lamp與lnmp的區別:
Lamp:Apache一般是把PHP當做自己的一個模塊來啟動;
Lnmp:Ngnix則是把http請求變數轉發給PHP進程,即PHP獨立進程,與Nginx相獨立;
三、案例:搭建LNMP並測試項目
案例環境:
系統類型 |
IP地址 |
主機名 |
所需軟體 |
Centos 6.5 |
192.168.100.150 |
www.linuxfan.cn |
nginx-1.6.2.tar.gz、 cmake-2.8.6.tar.gz、 mysql-5.5.22.tar.gz、 libmcrypt-2.5.8.tar.gz、 mhash-0.9.9.9.tar.gz、 mcrypt-2.6.8.tar.gz、 php-5.3.28.tar.gz、 SKYUC.v3.4.2.SOURCE.zip |
案例步驟:
- 安裝並配置Nginx服務;
- 安裝mysql資料庫服務;
- 配置初始化mysql及其優化;
- 安裝php服務程式;
- 優化調整php服務;
- 配置nginx服務使用php的FPM模塊來調用php環境來處理php的頁面請求:
- 配置Nginx支持php解析,編寫服務控制腳本:
- 編輯測試頁面;
- 客戶端訪問測試;
- 發佈php項目:電影系統;
- 客戶端訪問測試;
安裝並配置Nginx服務
[root@www ~]# yum -y install pcre-devel zlib-devel popt-devel openssl-devel openssl [root@www ~]# useradd -M -s /sbin/nologin nginx [root@www ~]# tar zxvf nginx-1.6.2.tar.gz -C /usr/src/ [root@www ~]# cd /usr/src/nginx-1.6.2/ [root@www nginx-1.6.2]# ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-file-aio --with-http_stub_status_module --with-http_gzip_static_module --with-http_flv_module --with-http_ssl_module --with-pcre && make && make install [root@www nginx-1.6.2]# cd [root@www ~]# ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/ [root@www ~]# nginx [root@www ~]# netstat -utlpn |grep 80 tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 5618/nginx
安裝mysql資料庫服務
[root@www ~]# rpm -e mysql mysql-server --nodeps [root@www ~]# yum -y install ncurses ncurses-devel [root@www ~]# tar zxvf cmake-2.8.6.tar.gz -C /usr/src/ [root@www ~]# cd /usr/src/cmake-2.8.6/ [root@www ~]# ./configure [root@www ~]# make &&make install [root@www ~]# cd [root@www ~]# tar zxvf mysql-5.5.22.tar.gz -C /usr/src/ [root@www ~]# cd /usr/src/mysql-5.5.22/ [root@www mysql-5.5.22]# cmake -DCMAKE_INSTALL_PREFIX=/usr/local/mysql -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci -DWITH_EXTRA_CHARSETS=all -DSYSCONFDIR=/etc/ [root@www mysql-5.5.22]# make &&make install
配置初始化mysql及其優化
[root@www mysql-5.5.22]# groupadd mysql [root@www mysql-5.5.22]# useradd -M -s /sbin/nologin -g mysql mysql [root@www mysql-5.5.22]# chown mysql:mysql /usr/local/mysql/ -R [root@www mysql-5.5.22]# cp support-files/my-medium.cnf /etc/my.cnf cp:是否覆蓋"/etc/my.cnf"? y [root@www mysql-5.5.22]# cp support-files/mysql.server /etc/init.d/mysqld [root@www mysql-5.5.22]# chmod +x /etc/init.d/mysqld [root@www mysql-5.5.22]# chkconfig --add mysqld [root@www mysql-5.5.22]# echo "PATH=$PATH:/usr/local/mysql/bin" >>/etc/profile [root@www mysql-5.5.22]# source /etc/profile [root@www mysql-5.5.22]# cd /usr/local/mysql/scripts/ [root@www scripts]# ./mysql_install_db --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data --user=mysql OK Filling help tables... OK [root@www scripts]# cd [root@www ~]# /etc/init.d/mysqld start Starting MySQL... [確定] [root@www ~]# mysqladmin -uroot password 123123 [root@www ~]# mysql -uroot -p123123 mysql> quit;
安裝php服務程式
[root@www ~]# rpm -e php --nodeps [root@www ~]# tar zxvf /root/libmcrypt-2.5.8.tar.gz -C /usr/src/ [root@www ~]# cd /usr/src/libmcrypt-2.5.8/ [root@www ~]# ./configure &&make &&make install [root@www ~]# ln -s /usr/local/lib/libmcrypt.* /usr/lib64/ [root@www ~]# tar zxvf /root/mhash-0.9.9.9.tar.gz -C /usr/src/ [root@www ~]# cd /usr/src/mhash-0.9.9.9/ [root@www ~]# ./configure &&make &&make install [root@www ~]# ln -s /usr/local/lib/libmhash* /usr/lib64/ [root@www ~]# tar zxvf /root/mcrypt-2.6.8.tar.gz -C /usr/src/ [root@www ~]# cd /usr/src/mcrypt-2.6.8/ [root@www ~]# ./configure &&make &&make install [root@www ~]# yum -y install libxml2-devel gd zlib-devel libpng-devel libjpeg-devel [root@www ~]# tar zxvf php-5.3.28.tar.gz -C /usr/src/ [root@www ~]# cd /usr/src/php-5.3.28/ [root@www php-5.3.28]# ./configure --prefix=/usr/local/php5 --with-gd --with-zlib --with-mysql=/usr/local/mysql --with-config-file-path=/usr/local/php5 --enable-mbstring --enable-fpm --with-jpeg-dir=/usr/lib 註解: --prefix=/usr/local/php5 ##指定安裝位置 --with-gd ##載入gd擴展庫工具 --with-zlib ##載入壓縮工具 --with-mysql=/usr/local/mysql ##載入mysql資料庫的安裝位置 --with-config-file-path=/usr/local/php5 ##載入php的配置文件存放位置 --enable-mbstring ##載入多字元的支持 --enable-fpm ##載入fpm管理程式 --with-jpeg-dir=/usr/lib ##載入識別圖片格式 [root@www php-5. 3.28]# make &&make install [root@www php-5. 3.28]# ls /usr/local/php5/ bin etc include lib php sbin var
優化調整php服務
[root@www php-5. 3.28]# cp php.ini-development /usr/local/php5/php.ini [root@www php-5. 3.28]# cd [root@www ~]# ln -s /usr/local/php5/bin/* /usr/local/bin/ [root@www ~]# ln -s /usr/local/php5/sbin/* /usr/local/sbin/ [root@www ~]# tar zxvf ZendGuardLoader-php-5.3-linux-glibc23-x86_64.tar.gz ##安裝ZendGuardLoader模塊 [root@www ~]# cp ZendGuardLoader-php-5.3-linux-glibc23-x86_64/php-5.3.x/ZendGuardLoader.so /usr/local/php5/ [root@www ~]# vi /usr/local/php5/php.ini ##在最後位置添加以下內容: [Zend Guard] zend_extension=/usr/local/php5/ZendGuardLoader.so zend_loader.enable=1 zend_loader.disable_licensing=0 zend_loader.obfuscation_level_support=3 註釋: zend_extension=/usr/local/php5/ZendGuardLoader.so ##載入模塊位置 zend_loader.enable=1 ##開啟該模塊 zend_loader.disable_licensing=0 ##禁用許可證檢查(提高性能) zend_loader.obfuscation_level_support=3 ##讓 Zend Guard Loader 支持混淆級別
配置nginx服務使用php的FPM模塊來調用php環境來處理php的頁面請求
[root@www ~]# cd /usr/local/php5/etc/ [root@www etc]# cp php-fpm.conf.default php-fpm.conf [root@www etc]# vi php-fpm.conf ##新建管理cgi介面的fpm模塊的配置文件 [global] pid = run/php-fpm.pid [www] listen = 127.0.0.1:9000 user = nginx group = nginx pm = dynamic pm.max_children = 50 pm.start_servers = 20 pm.min_spare_servers = 5 pm.max_spare_servers = 35 :wq 解釋: [global] ##全局配置區域 pid = run/php-fpm.pid ##指定程式運行時的pid文件 [www] ##www網站區域 listen = 127.0.0.1:9000 ##fpm管理程式監聽的地址和埠 user = nginx ##運行的用戶和組 group = nginx pm = dynamic ##指定fpm進程池的模式,動態模式 pm.max_children = 50 ##靜態方式下開啟的進程 pm.start_servers = 20 ##動態方式下啟動時開始的進程數 pm.min_spare_servers = 5 ##動態最小進程數 pm.max_spare_servers = 35 ##動態最大進程數 [root@www ~]# /usr/local/sbin/php-fpm ##啟動php-fpm [root@www ~]# netstat -utpln |grep php tcp 0 0 127.0.0.1:9000 0.0.0.0:* LISTEN 5587/php-fpm
配置Nginx支持php解析,編寫服務控制腳本
[root@www ~]# vi /etc/init.d/lnmp #!/bin/bash # chkconfig: 35 95 30 # description: This script is for LNMP Management! NGF=/usr/local/nginx/sbin/nginx NGP=/usr/local/nginx/logs/nginx.pid FPMF=/usr/local/php5/sbin/php-fpm FPMP=/usr/local/php5/var/run/php-fpm.pid case $1 in start) $NGF &&echo "nginx is starting! " $FPMF && echo "php-fpm is starting! " ;; stop) kill -QUIT $(cat $NGP) &&echo "nginx is stoped! " kill -QUIT $(cat $FPMP) &&echo "php-fpm is stoped! " ;; restart) $0 stop $0 start ;; reload) kill -HUP $(cat $NGP) kill -HUP $(cat $FPMP) ;; status) netstat -utpln |grep nginx &>/dev/null if [ $? -eq 0 ] then echo "nginx is running! " else echo "nginx is not running! " fi netstat -upltn |grep php-fpm &>/dev/null if [ $? -eq 0 ] then echo "php-fpm is runing! " else echo "php-fpm is not running! " fi ;; *) echo "Usage $0 {start|stop|status|restart}" exit 1 ;; esac [root@www ~]# chmod +x /etc/init.d/lnmp [root@www ~]# chkconfig --add lnmp [root@www ~]# /etc/init.d/lnmp status nginx is running! php-fpm is runing! [root@www conf]# vi /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 www.linuxfan.cn; charset utf-8; location / { root /var/www/linuxfan/; index index.html index.htm index.php; } location ~\.php { ##訪問.php頁面的配置段 root /var/www/linuxfan/; ##php網頁文檔根目錄,html代表安裝nginx的目錄下的html目錄 fastcgi_pass 127.0.0.1:9000; ##php-fpm的監聽地址和埠號 fastcgi_index index.php; ##指定php首頁文件 include fastcgi.conf; ##包括fastcgi.conf樣本配置 } error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } } } [root@www conf]# /etc/init.d/lnmp restart
編輯測試頁面
[root@www ~]# mkdir -p /var/www/linuxfan [root@www ~]# vi /var/www/linuxfan/index.html www.linuxfan.cn [root@www ~]# vi /var/www/linuxfan/testa.php <?php phpinfo(); ?> [root@www ~]# vi /var/www/linuxfan/testm.php <?php $link=mysql_connect('localhost','root','123123'); if($link) echo "mysql ok!"; mysql_close(); ?>
客戶端訪問測試:
http://www.linuxfan.cn
http://www.linuxfan.cn/testa.php
http://www.linuxfan.cn/testa.php
發佈php項目:電影系統
[root@www ~]# yum -y install unzip [root@www ~]# unzip SKYUC.v3.4.2.SOURCE.zip [root@www ~]# cd SKYUC.v3.4.2.SOURCE/ [root@www ~]# cp -rf wwwroot /var/www/linuxfan/skyuc [root@www ~]# cd /var/www/linuxfan/skyuc [root@www ~]# chown -R nginx:nginx admincp/ data/ templates/ upload/ [root@www ~]#mysql -uroot -p123123 > create database skyucdb; > grant all on skyucdb.* to 'runskyuc'@'localhost' identified by '123123'; > quit;
客戶端訪問測試:
http://www.linuxfan.cn/skyuc/install/index.php ##安裝該系統
http://www.linuxfan.cn/skyuc ##普通用戶訪問該系統
http://www.linuxfan.cn/skyuc/admincp ##後臺管理界面,用戶密碼為安裝時指定