1.概述:LNMP代表的就是:Linux系统下Nginx+MySQL+PHP这种网站服务器架构。Nginx是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP代理服务器。Mysql是一个小型关系型数据库管理系统。PHP是一种在服务器端执行的嵌入HTML文档的脚本语言。这四种软件均为免费开源软件,组合到一起,成为一个免费、高效、扩展性强的网站服务系统。
2.优势:稳定、高效、功能丰富、维护简易;
第一步:浏览器发送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的形式传送给浏览器。浏览器再进行解析与渲染然后进行呈现。
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的整个运作过程。
Lamp:Apache一般是把PHP当做自己的一个模块来启动;
Lnmp:Ngnix则是把http请求变量转发给PHP进程,即PHP独立进程,与Nginx相独立;
案例环境:
系统类型 |
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 |
案例步骤:
[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
[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
[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;
[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
[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 支持混淆级别
[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
[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
[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 ##后台管理界面,用户密码为安装时指定