LNMP环境应用实践
一、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需要访问网页,需不需要挂存储,要看它什么功能,如果是读网页不需要挂存储。
比如:LNMP和LAMP
L=Linux N=nginx A=pache
P=php T=tomcatNginx和Apache都是web应用服务器
Nginx处理静态数据快,Apache处理动态快
Nginx对系统资源占用小,Apache资源占用高
Nginx用的是epoll模型,Apache用的select模型
三、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)
软件的设计架构分为C/S和B/S
作为客户端Client和fastcgi_pass和作为Server端的PHP-fpm(9000端口)
因为经常使用,所以fastcgi_pass和Nginx合并
而PHP-fpm和PHP功能合并了用户的请求一定是遵循HTTP协议的,因为是通过浏览器过来的。
Nginx和Apache其实一样,如果没有PHP支持,那么都处理不了动态请求。
他们自身其实都只能处理静态。只是Apache转发动态数据包的速度快,
但只是单个数据包快,Apache并发低。
五、LNMP搭建
安装mysql二进制
直接解压即可:解压到/usr/local/
创建用户:
useradd -s /sbin/nologin -M mysql
进入/usr/local/mysql-5.5.32-linux/
做个软连接方便使用==>
ln -s mysql-5.5.32-linux /usr/local/mysql
复制配置文件:
/bin/cp support-files/my-small.cnf /etc/my.cnf
做初始化:
映射==>
echo "192.168.200.131 LNMP" > /etc/hosts
创建mysql数据文件目录==>
mkdir -p /usr/local/mysql/data
授权mysql用户管理mysql的安装目录==>
chown -R mysql.mysql /usr/local/mysql
安装初始化mysql依赖包==>
yum -y install libaio
初始化mysql数据库文件==>
/usr/local/mysql/scripts/mysql_install_db --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data --user=mysql
复制mysql启动脚本到mysql的命令路径==>
cd /usr/local/mysql
cp support-files/mysql.server /etc/init.d/mysqld
加x权限,使脚本可执行==>
chmod +x /etc/init.d/mysqld
启动mysql==>
/etc/init.d/mysqld start
给mysql命令做软连接==>
ln -s /usr/local/mysql/bin/* /usr/local/bin
给mysql添加密码==>
mysqladmin -uroot password '123123'
PHP端
需要zlib-devel libxml2-devel libjpeg-devel libjpeg-turbo-devel
libiconv-devel freetype-devel libpng-devel gd
libcurl-devel libxslt-devel支持包
yum无法安装libiconv库,需要手动下载==>
wget http://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.14.tar.gz
解压libiconv到/usr/src/
进入:cd /usr/src/libiconv-1.14.tar.gz进行编译
./configure --prefix=/usr/local/libiconv && make && make install
需要使用epel源安装libmcrypt库、mhash加密扩展库、mcrypt加密扩展库
下载epel源到yum配置文件,重新清空生成缓存,下载epel源地址==>
wget http://mirrors.aliyun.com/repo/epel-6.repo
PHP下载路径==>
wget http://cn2.php.net/get/php-5.3.28.tar.gz/from/this/mirror
解压PHP包到/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
安装完之后需要做软链接==>
ln -s /usr/local/mysql/lib/libmysqlclient.so.18 /usr/lib64
手动创建一个文件==>
touch ext/phar/phar.phar
创建完之后直接make && make install
将PHP做个软链接方便使用==>
ln -s /usr/local/php5.3.28 /usr/local/php
复制php.ini-production==>
cd /usr/src/php5.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服务php-fpm==>
/usr/local/php/sbin/php-fpm
六、PHP实例
配置nginx配置文件==>vim /usr/local/nginx/conf/nginx.conf
添加一个网页
做一个动态首页,测试一下成不成功
在/usr/local/nignx/html/blog首页里创建一个text_info.php
在里面输入:
<?php phpinfo(); ?>
——配置完成
在主机添加映射,然后开始测试
打开浏览器输入:
回车出现如下所示:
测试成功
测试mysql连接是否成功
在/usr/local/nginx/html/blog里创建test_mysql.php
添加如下所示:
在浏览器输入:
连接成功
七、部署博客
先在mysql创建专用数据库wordpress,用于存放blog数据
登录mysql:mysql -uroot -p123123
create database wordpress;
创建一个wordpress专用管理用户
grant all on wordpress.* to wordpress@’localhost’ identified by ‘123123’;
配置nginx文件
下载wordpress的包wordpress-4.9.8.tar.gz
链接:https://pan.baidu.com/s/1_HjxLp2A_3FzEk43FLK50A
提取码:0xyp
解压到当前文件
将wordpress里的内容移动到/usr/local/nginx/html/bolg首页里
mv wordpress/* /usr/local/nginx/html/blog/
在浏览器登录网址:
实现wordpress博客程序URL静态化
网页修改设置:
在nginx配置文件添加如下图所示:
重启nginx服务==>/usr/local/nginx/sbin/nginx.conf -s reload