在前面的一篇博客中,我已经介绍过,如何通过源码编译安装LAMP,见教你源码编译制作LAMP详细过程 ,这里就介绍下如何编译安装LNMP,以及如何在LNMP中添加ssl认证。
LNMP,也叫做LEMP。L,即linux操作系统;N,即nginx,因其读作engine x,所以也成为LEMP;M,即MySQL;P,即Php等脚本语言。说白了,LNMP也是个组合。只不过将LAMP中的Apache换成了Nginx而已,但别看仅仅是名字的替换,这个替换可是有着巨大的意义。他们实现的功能虽说差异不大,但它们背后的实现机制还是有很多区别的。因在上篇博客中已经介绍过了其他几个,这里就主要介绍nginx了。那我们一块来认识下nginx到底是何方神圣吧。

Nginx(发音同engine x)是一款由俄罗斯程序员Igor Sysoev所开发轻量级的网页服务器、反向代理服务器以及电子邮件(IMAP/POP3)代理服务器。起初是供俄国大型的门户网站及搜索引擎Rambler(俄语:Рамблер)使用。此软件在BSD-like协议下发行,可以在UNIXGNU/LinuxBSDMac OS XSolaris,以及Microsoft Windows等操作系统中运行。因它的高性能、稳定性、丰富的特性、简单方便的配置和低系统资源的消耗而闻名。因其占有内存少,并发能力强等众多优点,广受各大门户网站的喜爱。中国大陆使用nginx网站用户有:新浪、网易、腾讯等。下图是netcraft网站统计的在所有领域的顶级服务器市场份额的相关信息,通过该图,我们可以对nginx有个初步的了解。

215605395.pngspacer.gif
从上图,可以看到,apache因其成熟的技术、强大的功能及开源特性依然占据着服务器市场的半壁江山,但其市场份额却很不稳定;而nginx从其出现开始,一直保持其增长趋势,到目前为止,其市场份额已达12.18%。预计,在未来几年,由于nginx的众多优点,nginx的市场份额还会继续增长。
那究竟是什么原因让nginx从其出现就保持强劲增长呢?要回答清楚这个问题,且听我一一分解。
首先,先看一下nginx都有哪些特性,只有知道其特性才更容易理解。

Nginx 是一个很强大的高性能Web和反向代理服务器,它具有很多非常优越的特性:

在高连接并发的情况下,NginxApache服务器不错的替代品:Nginx在美国是做虚拟主机生意的老板们经常选择的软件平台之一。能够支持高达 50,000 个并发连接数的响应。

Nginx作为负载均衡服务器:Nginx 既可以在内部直接支持 Rails PHP 程序对外进行服务,也可以支持作为 HTTP代理服务器对外进行服务。Nginx采用C进行编写,不论是系统资源开销还是CPU使用效率都比 Perlbal 要好很多。

作为邮件代理服务器:Nginx 同时也是一个非常优秀的邮件代理服务器(最早开发这个产品的目的之一也是作为邮件代理服务器)。

Nginx 是一个安装非常的简单,配置文件非常简洁(还能够支持perl语法),Bugs非常少的服务器:Nginx 启动特别容易,并且几乎可以做到7*24不间断运行,即使运行数个月也不需要重新启动。你还可以再不间断服务的情况下进行软件版本的升级。

nginx可以做网页服务器,反向代理服务器,同时还可以做电子邮件代理服务器,这里我们主要介绍其网页服务器,其他服务器特性这里暂不介绍。


单进程、多进程及线程在多请求到来时的比较:
单进程:仅接受一个请求,其他请求阻塞,直到完成才响应下一个请求
多进程:每个进程响应一个请求
    进程量大,进程切换次数过多
    每个进程的地址空间是独立的,很多空间是重复的数据,所以内存使用效率较低
线程:每个线程响应一个请求,但因linux对线程支持不够,故
    线程依然需要切换:切换较之进程属于轻量级切换
    同一个进程的线程可以共享进程的诸多资源,比如打开的文件
    对内存的需求较之进程略有下降
    快速切换时会带来线程抖动
传统上基于进程或线程模型架构的web服务通过每进程或每线程处理并发连接请求,这势必会在网络和I/O操作时产生阻塞,其另一个必然结果则是对内存或CPU的利用率低下。生成一个新的进程/线程需要事先备好其运行时环境,这包括为其分配堆内存和栈内存,以及为其创建新的执行上下文等。这些操作都需要占用CPU,而且过多的进程/线程还会带来线程抖动或频繁的上下文切换,系统性能也会由此进一步下降。
同时由于传统的web服务器是基于进程或线程模型架构的,在处理C10K(当我们的并发连接达到10K时,会出现众多问题,由此称为C10K)问题时,显得很吃力,不能很好地处理高并发的请求。而因nginx工作在AIO(异步I/O)模型下,且支持内存映射、事件驱动,因此,nginx很好的解决了这个问题。

在设计的最初阶段,nginx的主要着眼点就是其高性能以及对物理计算资源的高密度利用,因此其采用了不同的架构模型。受启发于多种操作系统设计中基于“事件”的高级处理机制,nginx采用了模块化、事件驱动、异步、单线程及非阻塞的架构,并大量采用了多路复用及事件通知机制。在nginx中,连接请求由为数不多的几个仅包含一个线程的进程worker以高效的回环(run-loop)机制进行处理,而每个worker可以并行处理数千个的并发连接及请求。
Nginx会按需同时运行多个进程:一个主进程(master)和几个工作进程(worker),配置了缓存时还会有缓存加载器进程(cache loader)和缓存管理器进程(cache manager)等。所有进程均是仅含有一个线程,并主要通过“共享内存”的机制实现进程间通信。主进程以root用户身份运行,而worker、cache loader和cache manager均应以非特权用户身份运行。

主进程主要完成如下工作:
1. 读取并验正配置信息;
2. 创建、绑定及关闭套接字;
3. 启动、终止及维护worker进程的个数;
4. 无须中止服务而重新配置工作特性;
5. 控制非中断式程序升级,启用新的二进制程序并在需要时回滚至老版本;
6. 重新打开日志文件,实现日志滚动;
7. 编译嵌入式perl脚本;

worker进程主要完成的任务包括:
1. 接收、传入并处理来自客户端的连接;
2. 提供反向代理及过滤功能;
3. nginx任何能完成的其它任务;
cache loader进程主要完成的任务包括:
1. 检查缓存存储中的缓存对象;
2. 使用缓存元数据建立内存数据库;

cache manager进程的主要任务:
1. 缓存的失效及过期检验;
Nginx的配置有着几个不同的上下文:main、http、server、upstream和location(还有实现邮件服务反向代理的mail)。配置语法的格式和定义方式遵循所谓的C风格,因此支持嵌套,还有着逻辑清晰并易于创建、阅读和维护等优势。
Nginx的代码是由一个核心和一系列的模块组成, 核心主要用于提供Web Server的基本功能,以及Web和Mail反向代理的功能;还用于启用网络协议,创建必要的运行时环境以及确保不同的模块之间平滑地进行交互。不过,大多跟协议相关的功能和某应用特有的功能都是由nginx的模块实现的。这些功能模块大致可以分为事件模块、阶段性处理器、输出过滤器、变量处理器、协议、upstream和负载均衡几个类别,这些共同组成了nginx的http功能。事件模块主要用于提供OS独立的(不同操作系统的事件机制有所不同)事件通知机制如kqueue或epoll等。协议模块则负责实现nginx通过http、tls/ssl、smtp、pop3以及imap与对应的客户端建立会话。
在nginx内部,进程间的通信是通过模块的pipeline或chain实现的;换句话说,每一个功能或操作都由一个模块来实现。例如,压缩、通过FastCGI或uwsgi协议与upstream服务器通信,以及与memcached建立会话等。

上边介绍了这么多关于nginx的知识,不知你是否了解了nginx。下面我们就一块来安装LNMP吧。


实验坏境:
系统:rhel6.4系统
内核:linux-2.6.32-358.el6.i686
平台在VMware虚拟机上实现。
虚拟机IP:172.16.32.50
所需要的软件包:nginx-1.4.1.tar.gz,mysql-5.6.10-linux-glibc2.5-i686.tar.gz,php-5.4.13.tar.bz2,xcache-3.0.1.tar.bz2(提供php加速)
扩展rpm包:libev-4.03-3.el6.i686.rpm,libmcrypt-devel-2.5.8-9.el6.i686.rpm,mhash-devel-0.9.9.9-3.el6.i686.rpm,libev-devel-4.03-3.el6.i686.rpm,mcrypt-2.6.8-10.el6.i686.rpm,libmcrypt-2.5.8-9.el6.i686.rpm   mhash-0.9.9.9-3.el6.i686.rpm
解决依赖关系:安装开发组"Development Tools"和 "Development Libraries",安装pcre-devel,bzip2-devel,libcurl-devel,libxml2-devel,openssl-devel
在开始我们的安装前,请先同步时间。否则,因你虚拟机的时间不是现在的时间,可能是过去的某个时间,因此当你安装某个软件包时,你会发现该软件包来自未来。
service ntpd stop
ntpdate 172.16.0.1   #同步时间,该IP是本地的默认网关,可与外部网络通信,这里是与其同步时间,读者可自行设定
crontab -e   #为了避免以后还要同步时间,这里添加了任务计划,没3分钟同步一次,将同步后的结果都送到/dev/null中,否则会每3分钟收到一封信
*/3 * * * * /sbin/ntpdate 172.16.0.1 &> /dev/null    
接下来,下载所需要的各软件包,并配置好yum源。
各软件包的可在epel网站下载,这里仅给出链接,不再给出各个附件,请各位自行下载。
这里我们将下载好的各软件包放在了/root目录下。在/root目录下,除了上边提到的软件包之外,不要有其他rpm包,在当前目录下,执行如下命令:
yum grouplist   #查看安装的组,假如你没有安装"Development Tools"和 "Server Platform Development",请执行下面的命令
yum -y groupinstall "Development Tools"  "Server Platform Development"  #安装开发工具和服务器端开发平台
yum -y --nogpgcheck localinstall *rpm   #安装本地当前目录下所有的rpm包
yum -y pcre-devel bzip2-devel libcurl-devel libxml2-devel openssl-devel  #确保以配置好yum源,然后安装所依赖的各软件包,否则后边编译安装时会报错
yum -y groupinstall "Compatibility libraries"   #这个是兼容库,兼容一些老版本的库,如果需要可以安装,不需要可不安装,这里没有安装该兼容库

准备工作已经完毕,现在开始编译安装我们的各个软件。


安装nginx:
groupadd -r nginx    #创建nginx系统组
useradd -r -g nginx nginx    #添加用户nginx,实现以nginx用户身份运行nginx服务进程
tar xf nginx-1.4.1.tar.gz   #解压该文件
cd nginx-1.4.1
./configure \              #在相应目录下执行该命令,其中\表示续行符--prefix=/usr \           #指定安装文件目录,安装完毕后会在此目录下生成一个html目录--sbin-path=/usr/sbin/nginx \                  #nginx的可执行程序路径--conf-path=/etc/nginx/nginx.conf \          #指定配置文件所在路径--error-log-path=/var/log/nginx/error.log \     #错误日志所在路径--http-log-path=/var/log/nginx/access.log \    #访问日志所在路径--pid-path=/var/run/nginx/nginx.pid  \          #pid文件所在路径--lock-path=/var/lock/nginx.lock \                #锁文件所在路径--user=nginx \                                           #指定运行nginx服务的用户,知道为何创建nginx用户了吧--group=nginx \                                        #指定运行nginx服务的组--with-http_ssl_module \                           #启用ssl模块--with-http_flv_module \                           #启用flv模块--with-http_stub_status_module \              #启用stub状态模块--with-http_gzip_static_module \                #启用gzip静态模块--http-client-body-temp-path=/var/tmp/nginx/client/ \       #指定客户端报文主体缓存的临时文件目录--http-proxy-temp-path=/var/tmp/nginx/proxy/ \              #指定代理临时文件路径--http-fastcgi-temp-path=/var/tmp/nginx/fcgi/ \                #指定fastcgi临时文件路径--http-uwsgi-temp-path=/var/tmp/nginx/uwsgi \               #指定uwsgi临时文件路径--http-scgi-temp-path=/var/tmp/nginx/scgi \                     #指定scgi临时文件路径--with-pcre \                                                                 #启用pcre--with-file-aio                                                               #启用文件aio功能
如果想了解更多选项的意义,可在nginx-1.4.1目录下,执行./configure --help命令查看。这里不再过多的介绍。
make && make install
安装完毕后,为我们的nginx提供SysV风格的服务脚本:
vim /etc/init.d/nginx     #编辑该文件
#!/bin/sh             #这里是/bin/sh,不是/bin/bash,千万不要写错了
#
# nginx - this script starts and stops the nginx daemon
#
# chkconfig:   - 85 15
# description:  Nginx is an HTTP(S) server, HTTP(S) reverse \
#               proxy and IMAP/POP3 proxy server
# processname: nginx
# config:      /etc/nginx/nginx.conf        #nginx配置文件
# config:      /etc/sysconfig/nginx        #服务脚本的配置文件
# pidfile:     /var/run/nginx.pid
# Source function library.
. /etc/rc.d/init.d/functions               #读取系统自带的函数
# Source networking configuration.
. /etc/sysconfig/network            #读取网络配置
# Check that networking is up.
[ "$NETWORKING" = "no" ] && exit 0     #判断时候启用网络功能,如果没有返回0
nginx="/usr/sbin/nginx"
prog=$(basename $nginx)
NGINX_CONF_FILE="/etc/nginx/nginx.conf"
[ -f /etc/sysconfig/nginx ] && . /etc/sysconfig/nginx     #如果存在服务脚本的配置文件,则读取该文件
lockfile=/var/lock/subsys/nginx                  #设定锁文件
make_dirs() {                       #定义函数,创建相关目录# make required directoriesuser=`nginx -V 2>&1 | grep "configure arguments:" | sed 's/[^*]*--user=\([^ ]*\).*/\1/g' -`options=`$nginx -V 2>&1 | grep 'configure arguments:'`for opt in $options; doif [ `echo $opt | grep '.*-temp-path'` ]; thenvalue=`echo $opt | cut -d "=" -f 2`if [ ! -d "$value" ]; then# echo "creating" $valuemkdir -p $value && chown -R $user $valuefifidone
}
start() {[ -x $nginx ] || exit 5[ -f $NGINX_CONF_FILE ] || exit 6make_dirsecho -n $"Starting $prog: "daemon $nginx -c $NGINX_CONF_FILEretval=$?echo[ $retval -eq 0 ] && touch $lockfilereturn $retval
}
stop() {echo -n $"Stopping $prog: "killproc $prog -QUITretval=$?echo[ $retval -eq 0 ] && rm -f $lockfilereturn $retval
}
restart() {configtest || return $?stopsleep 1start
}
reload() {configtest || return $?echo -n $"Reloading $prog: "killproc $nginx -HUPRETVAL=$?echo
}
force_reload() {restart
}
configtest() {$nginx -t -c $NGINX_CONF_FILE
}
rh_status() {status $prog
}
rh_status_q() {rh_status >/dev/null 2>&1
}
case "$1" instart)rh_status_q && exit 0$1;;stop)rh_status_q || exit 0$1;;restart|configtest)$1;;reload)rh_status_q || exit 7$1;;force-reload)force_reload;;status)rh_status;;condrestart|try-restart)rh_status_q || exit 0;;*)echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload|configtest}"exit 2
esac
保存退出。
chmod +x /etc/init.d/nginx   #为该脚本赋予执行权限
chkconfig --add nginx   #将nginx添加至服务列表
chkconfig nginx on       #让nginx开机自启动
service nginx start      #启动nginx服务,进行测试

在物理机上测试一下吧。

215900794.jpg

可能有些人在启动nginx服务,即执行service nginx start命令时出现如下错误:
spacer.gif215933496.jpg

出现此问题,是因为你本地的80端口已经被占用了,这时候,你可使用netstat -tnlp命令查看下,本地是否已经启用了80端口,一般来说都是本地自动启动了httpd服务,导致80端口被占用造成的错误。因为httpd和nginx使用的是同一个端口80。查看及解决办法如下图所示:

220005657.jpg

然后在测试就可以出现欢迎界面了。你也可以为其提供一个主机面,不显示自带的欢迎界面。到此,我们的nginx安装完毕。
先一块来看下nginx的配置文件的信息,这里我们只贴出待会我们要用到的信息,介绍,有些是默认注释掉的,我们也一块介绍下。
/etc/nginx/nginx.conf文件部分信息
worker_processes  1;     #工作进程个数,默认为1,可自行修改,但要看你服务器的性能如何
#error_log  logs/error.log;
#error_log  logs/error.log  notice;         #定义错误日志,我们在编译安装是已指定过,因此,这里默认是注释掉的
#error_log  logs/error.log  info;
#pid        logs/nginx.pid;                      #pid文件,编译安装时,已指定过,这里默认为注释掉了
events {worker_connections  1024;              #事件驱动模型中,工作进程单个最大连接数,系统最大连接总数为worker_processes*worker_connections
}
http {                        #http服务段include       mime.types;                #支持mime类型,已支持非文本格式default_type  application/octet-stream;#log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '#                  '$status $body_bytes_sent "$http_referer" '#                  '"$http_user_agent" "$http_x_forwarded_for"';#access_log  logs/access.log  main;sendfile        on;#keepalive_timeout  0;keepalive_timeout  65;        #持续连接超时时长#gzip  on;server {                   #服务段设置listen       80;                   #监听端口server_name  localhost;          #服务名#charset koi8-r;#access_log  logs/host.access.log  main;location / {               #相当于httpd服务配置文件的<Directory />段root   html;           #相当于httpd服务配置文件的DocumentRoot配置段,用来定义web文档所在目录,是相对路径,相对于/usr/html而言index  index.html index.htm;         #定义web文档类型}#error_page  404              /404.html;       #定义错误页面,默认没有启用,也没有此页面# redirect server error pages to the static page /50x.html#error_page   500 502 503 504  /50x.html;        #定义错误代码界面location = /50x.html {                 #如果匹配到该界面,显示该界面信息,该文件内容见下图root   html;      }# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000##location ~ \.php$ {                     #php段,默认是注释掉的,待会我们安装完php后就需要启用该段#    root           html;#    fastcgi_pass   127.0.0.1:9000;             #监听的地址及端口号#    fastcgi_index  index.php;                     #指定类型为php#    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;#    include        fastcgi_params;                #其他相关配置在该文件中设定#}}# another virtual host using mix of IP-, name-, and port-based configuration##server {                    #虚拟主机配置,可使用基于虚拟主机访问,这里我们不使用基于虚拟主机访问,仅使用基于IP的访问,默认是注释掉的,假如你想使用基于虚拟主机的访问,可启用此段#    listen       8000;#    listen       somename:8080;#    server_name  somename  alias  another.alias;#    location / {#        root   html;#        index  index.html index.htm;#    }#}# HTTPS server##server {                   #基于https的服务,默认为注释掉的,待会使用CA时就需要启用该段了#    listen       443;         #监听的端口#    server_name  localhost;#    ssl                  on;                   #是否启用ssl认证#    ssl_certificate      cert.pem;             #ssl认证的证书所在文件#    ssl_certificate_key  cert.key;           #ssl认证的密钥文件#    ssl_session_timeout  5m;                #ssl会话超时时长#    ssl_protocols  SSLv2 SSLv3 TLSv1;           #ssl支持的协议#    ssl_ciphers  HIGH:!aNULL:!MD5;               #ssl认证使用的加密算法#    ssl_prefer_server_ciphers   on;                 #启动服务器ssl认证#    location / {                               #        root   html;#        index  index.html index.htm;#    }#}
}


location段各字符含义备注

location [=|~|~*|^~] uri {}

location uri {};
    对当前路径及子路径下的所有对象都生效
location = uri {};
    精确匹配指定的路径,不包括子路径,因此,只对当前资源生效;
location ~ uri {};    
location ~* uri {};
    模式匹配uri,此处的uri可使用正则表达式,与~的区别是:~区分字符大小写,~*不区分字符大小写;
location ^~ uri {};
    不使用正则表达式;
优先级由高到低:= > ^~ > ~*|~ > 空(当省略=|~|~*|^~时即为空)
/usr/html/50x.html文件显示内容如下图:
220144900.jpg
配置文件介绍完毕,我们先去自己添加个个人主页测试下再说吧。
cd /etc/nginx/        #进入该目录
cp nginx.conf nginx.conf.bak       #先做个备份,到时候修改完了还可以恢复过来
vim nginx.conf               #编辑该文件location / {                  #修改该段root   /web/html;            #修改默认设置,然后指定web文档根目录index  index.html index.htm;}
mkdir /web/html   #创建该目录,作为我们的根目录
vim /web/html/index.html       #编辑该文件,添加如下信息
<h1>http://lq2419.blog.51cto.com/</h1>
保存退出。然后重新载入nginx服务。
说到这里,不管前面有没有提到,介绍一个nginx很重要的特性。就是nginx服务在线时,可实现不需重启服务即可实现修改其配置,且新配置会在下次响应请求时自动启用。假如现在nginx正在响应请求,但我们对nginx的配置进行了修改,则正响应的请求依然使用原来的配置。当响应完毕后,再有新的请求到来时,使用新的配置进行响应。
service nginx reload   #重新载入nginx服务

下图是显示效果:

220241722.jpg

spacer.gif

到此,nginx已经介绍完毕。等安装完毕所有的软件再来介绍其他功能。


安装mysql:

在前面的博客中,我已经介绍过如何安装mysql了,这里本不想在重复介绍如何编译安装mysql了,但由于安装环境不同,加上一些人呢懒得去打开另一个网页,这里就在啰嗦一遍,重新介绍下如何编译安装mysql,同时,将自己在创建逻辑卷及安装过程中遇到的问题及解决办法一并分享一下。假如你在创建逻辑卷时没有遇到什么问题,就当我在说废话,下面两个问题可以忽略。


问题一:先分享一下我在创建逻辑卷时遇到的一个问题吧。虚拟机是通过克隆生成的一个虚拟机,原虚拟机安装的rhel6.4的32位系统,添加了两块磁盘,一个SCSI口的磁盘,大小为120G,一个IDE口磁盘(后来又添加的),大小为20G,内存大小为256M。由于是第一次在rhel6.4的32位系统上安装mysql-5.6.10版本,我们知道,为了数据的安全及因数据增加让磁盘空间具有可扩展性,需创建逻辑卷来保存我们的数据。本人在创建逻辑卷时,在命令行界面输入的fdisk /dev/sda,查看磁盘分区情况后没发现什么问题,显示的大小也是128G多,然后执行的分区、修改磁盘类型等一步步操作完成后,在还没保存退出时,使用p选项查看磁盘分区情况,显示的是/dev/sda2,一切正常,保存退出。在执行partprobe /dev/sda系统提示错误,说磁盘有问题,需重启。检查各种地方都没有发现错误后,没有办法只好重启。就reboot了,但当我重启后,使用fdisk -l命令发现我刚创建的磁盘分区/dev/sda2现在居然变成了/dev/sdb2,很是郁闷。好吧,我认了,重启过了,也就没必要执行partprobe /dev/sdb命令了。执行fdisk -l查看一切正常后,创建物理卷、卷组、逻辑卷,然后一切才算正常。所以,总结出来假如在分区过程过遇到类型提示你必须重启的问题,那就果断重启吧。不要浪费我们宝贵的时间了。IT人伤不起啊。
问题二:这个是同学遇到的问题。暂时还没有解决,对于为何会出现此问题仅仅是猜测。其实这个问题不应该在这里就提,应该更早些就分享出来。发现这个问题也是在准备去创建逻辑卷时出现的。先说下问题时什么吧。我与同学用的是同一个rhel6.4的引导盘,安装的镜像文件也是同一个,唯一不同的是我创建了两个磁盘,而同学就创建了一个120G的SCSI磁盘,没有要IDE磁盘。在rhel6.4上执行fdisk -l命令让人不爽的是系统上所有磁盘分区,包括创建的所有逻辑卷都会显示出来,系统自动创建的逻辑卷忒多,显示信息太多,让人看得眼花缭乱。他在执行fdisk -l命令查看磁盘分区情况时,还是给个图片吧:
220327461.jpgspacer.gif
结合我们两个的虚拟机猜测,可能是因为安装该系统就需要两个磁盘,而同学正好就按了一个磁盘造成的缘故,目前此问题还没有解决。以下是kickstart里与此相关的内容,不知是否与此有关,贴出来供高手参考,还请高手指点:

zerombr yes

clearpart --all

part /boot --fstype=ext4 --size=200

part pv.008 --size=61440


volgroup vg0 --pesize=8192 pv.008logvol / --fstype=ext4 --name=root --vgname=vg0 --size=20480logvol swap --name=swap --vgname=vg0 --size=2048logvol /usr --fstype=ext4 --name=usr --vgname=vg0 --size=10240logvol /var --fstype=ext4 --name=var --vgname=vg0 --size=20480


废话不多说,继续我们上边的安装吧。

先创建我们的逻辑卷。本地是磁盘分区/dev/sdb2,所以直接创建物理卷、卷组、逻辑卷。
pvcreate /dev/sdb2     #创建物理卷
vgcreate myvg /dev/sdb2    #创建卷组,卷组名为myvg
lvcreate -n mydata -L 10G myvg    #在卷组上创建逻辑卷,大小为10G,卷标为mydata
lvs     #查看创建的逻辑卷信息
mke2fs -j /dev/myvg/mydata    #格式化该逻辑卷
mkdir /mydata  #创建该目录,用于挂载我们的逻辑卷
vim /etc/fstab   #编辑该文件,添加如下该行信息,将我们的创建的逻辑卷挂载至/mydata目录下
/dev/myvg/mydata       /mydata          ext3    defaults    0 0
mount -a    #挂载所有磁盘分区
然后创建mysql用户mysql组。
groupadd -r mysql    #创建mysql组
useradd -r -g mysql mysql   #创建mysql系统用户
mkdir /mydata/data       #创建该目录,用于存放我们mysql 的数据文件
chown -R mysql.mysql /mydata/data    #修改该文件及子文件为mysql属主属组,方便mysql写入数据
tar xf mysql-5.6.10-linux-glibc2.5-i686.tar.gz -C /usr/local/    #解压该文件到指定目录,确保当前处于mysql压缩文件所在目录
ln -sv mysql-5.6.10-linux-glibc2.5-i686 mysql          #创建mysql-5.6.10-linux-glibc2.5-i686到mysql的链接
cd /usr/local/mysql    #进入该目录
scripts/mysql_install_db --user=mysql --datadir=/mydata/data   #--user指定我们的mysql服务器创建的文件及目录以哪个用户运行,--datadir指定我们的数据文件所在目录,这里mysql不需要执行./configure命令
完成后在当前目录下会生成一个my.cnf的文件,这就是我们的配置文件,直接编辑。
vim my.cnf
datadir = /mydata/data   #修改我们的数据文件存放位置
socket = /tmp/mysql.sock   #添加套接字文件所在路径
innodb_file_per_table=ON    #启用每表一个表空间
保存退出。同样,为我们的mysql服务提供服务脚本。这里我们使用系统自带的,我们不需修改即可使用。
cp support-files/mysql.server  /etc/rc.d/init.d/mysqld   #将该目录下的脚本拷贝到指定目录下,并重命名
vim /etc/profile.d/mysql      #编辑该文件,添加环境变量
export PATH=$PATH:/usr/local/mysql/bin  #添加环境变量,让系统直接使用mysql的命令
同样,将该服务脚本添加到服务列表。
chkconfig --add mysql     #添加该服务脚本至服务列表
chkconfig mysql on    #设置开机启动,默认级别为2345
service mysql start   #开启mysql服务
netstat -tunlp     #查看我们的mysql服务端口是否已开启,默认mysql监听在3306端口
现在为我们的mysql创建帮助手册,并添加其开发组件至系统。
在我们的mysql目录下,有个man目录,其下就是mysql的帮助手册了。
vim /etc/man.config   #编辑该文件,添加如下一行信息
MANPATH  /usr/local/mysql/man
ln -sv /usr/local/mysql/include /usr/include/mysql  #创建符号链接,输出mysql的头文件至系统头文件路径
echo "/usr/local/mysql/lib" > /etc/ld.so.conf.d/mysql.conf   #添加该行信息,输出mysql的库文件给系统库查找路径
ldconfig     #让系统重新载入系统库
进入mysql测试下。
mysql -uroot -p     #通过以root身份进入mysql,下图为测试效果
spacer.gif220450564.jpg

到此,mysql安装完毕。


安装php
在准备阶段,我们已经安装过libmcrypt,libmcrypt-devel,mhash,mhash-devel,mcrypt,libev,libev-devel软件包,现在,我们只需解压php,编译安装即可。
tar xf php-5.4.13.tar.bz2
cd php-5.4.13
./configure   \
--prefix=/usr/local/php  \                            #安装文件所在目录
--with-mysql=/usr/local/mysql    \               #mysql文件所在目录
--with-openssl      \                                    #启用openssl认证功能
--enable-fpm  \                                          #支持fpm
--enable-sockets  \                           
--enable-sysvshm  \
--with-mysqli=/usr/local/mysql/bin/mysql_config  \
--enable-mbstring  \
--with-freetype-dir  \
--with-jpeg-dir     \
--with-png-dir      \
--with-zlib-dir      \
--with-libxml-dir=/usr      \
--enable-xml  \
--with-mhash  \                         #启用mhash扩展
--with-mcrypt   \                        #启用mcrypt扩展
--with-config-file-path=/etc  \
--with-config-file-scan-dir=/etc/php.d   \
--with-bz2 --with-curl
make  && make install
完成后为php提供配置文件。
cp php.ini-production /etc/php.ini
为php-fpm提供Sysv init脚本,并将其添加至服务列表:
cp sapi/fpm/init.d.php-fpm  /etc/rc.d/init.d/php-fpm
chmod +x /etc/rc.d/init.d/php-fpm
chkconfig --add php-fpm
chkconfig php-fpm on
为php-fpm提供配置文件:
cp /usr/local/php/etc/php-fpm.conf.default /usr/local/php/etc/php-fpm.conf
编辑php-fpm的配置文件,修改如下内容:
vim /usr/local/php/etc/php-fpm.conf
pm.max_children = 50
pm.start_servers = 5
pm.min_spare_servers = 2
pm.max_spare_servers = 8
pid = /usr/local/php/var/run/php-fpm.pid
配置完成后,启动php-fpm服务。
service php-fpm start
ps aux | grep php-fpm   #查看该进程,显示如下
root      4132  0.0  1.1 104036  2984 ?        Ss   May18   0:03 php-fpm: master process (/usr/local/php/etc/php-fpm.conf)                                                         
nobody    4133  0.0  1.9 104564  4916 ?        S    May18   0:00 php-fpm: pool www                                                                                                 
nobody    4134  0.0  2.1 104564  5260 ?        S    May18   0:00 php-fpm: pool www                                                                                                 
nobody    4135  0.0  1.9 104564  4948 ?        S    May18   0:00 php-fpm: pool www                                                                                                 
nobody    4136  0.0  1.9 104564  4960 ?        S    May18   0:00 php-fpm: pool www                                                                                                 
nobody    4137  0.0  1.9 104564  4948 ?        S    May18   0:00 php-fpm: pool www
php安装完毕。现在去修改nginx配置文件,整合nginx和php。
vim /etc/nginx/nginx.conf   #编辑该文件,启用如下选项,上边已经介绍个各选项含义,这里直接修改location ~ \.php$ {root           /web/html;fastcgi_pass   127.0.0.1:9000;fastcgi_index  index.php;fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;include        fastcgi_params;}location / {root   /web/html;index  index.php index.html index.htm;    #添加index.php}
vim /etc/nginx/fastcgi_params   #编辑该文件,删除里边所有信息,添加如下信息
fastcgi_param  GATEWAY_INTERFACE  CGI/1.1;
fastcgi_param  SERVER_SOFTWARE    nginx;
fastcgi_param  QUERY_STRING       $query_string;
fastcgi_param  REQUEST_METHOD     $request_method;
fastcgi_param  CONTENT_TYPE       $content_type;
fastcgi_param  CONTENT_LENGTH     $content_length;
fastcgi_param  SCRIPT_FILENAME    $document_root$fastcgi_script_name;
fastcgi_param  SCRIPT_NAME        $fastcgi_script_name;
fastcgi_param  REQUEST_URI        $request_uri;
fastcgi_param  DOCUMENT_URI       $document_uri;
fastcgi_param  DOCUMENT_ROOT      $document_root;
fastcgi_param  SERVER_PROTOCOL    $server_protocol;
fastcgi_param  REMOTE_ADDR        $remote_addr;
fastcgi_param  REMOTE_PORT        $remote_port;
fastcgi_param  SERVER_ADDR        $server_addr;
fastcgi_param  SERVER_PORT        $server_port;
fastcgi_param  SERVER_NAME        $server_name;
修改完毕后,保存退出。重新装载nginx服务。
service nginx reload
修改我们刚才建的主界面,添加几行信息:
vim /web/html/index.html
<h1>http://lq2419.blog.51cto.com/</h1>
<?php
phpinfo();          #添加php相关的信息
?>
mv /web/html/index.html /web/html/index.php
添加完成,现在去我们的物理机上测试下,看下效果。
220621811.jpg
一切OK,搞定。

现在我们去安装xcache加速。


安装xcache
tar xf xcache-3.0.1.tar.bz2
cd xcache-3.0.1/usr/local/php/bin/phpize
./configure --enable-xcache --with-php-config=/usr/local/php/bin/php-config
make && make install
现在去整合php和xcache。
mkdir /etc/php.d
cp xcache.ini /etc/php.d
vim /etc/php.d/xcache.ini   #编辑该文件,添加如下一行信息,如果php.ini文件中有多条zend_extension指令行,要确保此新增的行排在第一位
extension = /usr/local/php/lib/php/extensions/no-debug-zts-20100525/xcache.so
启用php-fpm服务:
service php-fpm restart
在物理机上,在测试下。
220706280.jpg

xcache添加完毕。到此,LNMP制作完毕,就是那么简单。你成功了么?


SSL认证
貌似,童话故事到现在了还差个人物嘞。好吧,现在我们去添加CA认证。
首先,生成自签证书。
在生成自签证书前,为了我们待会方便,先去修改配置文件
vim /etc/pki/tls/openssl.conf   #编辑该文件,修改如下内容
[ req_distinguished_name ]
countryName_default             = CN
stateOrProvinceName_default     = Henan
localityName_default    = Zhengzhou
0.organizationName_default      = MageEdu
organizationalUnitName_default  = Tech
cd /etc/pki/CA
(umask 077;openssl genrsa -out private/cakey.pem 2048)
openssl req -new -x509 -key private/cakey.pem -out cacert.pem     #有x509表示生成自签证书Country Name (2 letter code) [CN]:State or Province Name (full name) [Henan]:Locality Name (eg, city) [Zhengzhou]:Organization Name (eg, company) [MageEdu]:Organizational Unit Name (eg, section) [Tech]:Common Name (eg, your name or your server's hostname) []:lq2419.langdu.comEmail Address []:lq2419@langdu.com
touch index.txt serial
echo 01 > serial
mkdir /etc/nginx/ssl
cd /etc/nginx/ssl
(umask 077;openssl genrsa -out nginx.key 1024)
openssl req -new -key nginx.key -out nginx.csr     #没有x509表示生成证书请求Country Name (2 letter code) [CN]:State or Province Name (full name) [Henan]:Locality Name (eg, city) [Zhengzhou]:Organization Name (eg, company) [MageEdu]:Organizational Unit Name (eg, section) [Tech]:Common Name (eg, your name or your server's hostname) []:www.langdu.comEmail Address []:www@magedu.comPlease enter the following 'extra' attributesto be sent with your certificate requestA challenge password []:An optional company name []:
openssl ca -in nginx.csr -out nginx.crt -days 3650    #生成证书
证书生成完成后,编辑我们的nginx配置文件,启用ssl认证功能。
vim /etc/nginx/nginx.conf    #编辑该文件,启用如下选项,并添加部分内容server {listen       443;server_name  localhost;ssl                  on;ssl_certificate      /etc/nginx/ssl/nginx.crt;      #证书所在路径ssl_certificate_key  /etc/nginx/ssl/nginx.key;    #密钥所在路径ssl_session_timeout  5m;ssl_protocols  SSLv2 SSLv3 TLSv1;ssl_ciphers  HIGH:!aNULL:!MD5;ssl_prefer_server_ciphers   on;location / {root   /web/html;           #修改根所在路径index  index.php index.html index.htm;}location ~ \.php$ {              #添加此段,已支持phproot           /web/html;fastcgi_pass   127.0.0.1:9000;fastcgi_index  index.php;fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;include        fastcgi_params;}}
保存退出。重新载入nginx服务。
service nginx reload
现在再去我们的物理机上测试一下吧。
220810341.jpg
好了,现在ssl认证功能也已实现。
到此。LNMP和CA认证均已完成。公主和王子终于可以在一起了,从此过上了……