nginx
一.Lamp(Linux + Apache + MySQL + PHP)
1.Lamp架构概述
LAMP(Linux- Apache-MySQL-PHP)网站架构是目前国际流行的Web框架,该框架包括:Linux操作系统,Apache网络服务器,MySQL数据 库,Perl、PHP或者Python编程语言,所有组成产品均是开源软件,是国际上成熟的架构框架,很多流行的商业应用都是采取这个架构,和 Java/J2EE架构相比,LAMP具有Web资源丰富、轻量、快速开发等特点,微软的.NET架构相比,LAMP具有通用、跨平台、高性能、低价格的 优势,因此LAMP无论是性能、质量还是价格都是企业搭建网站的首选平台。在国内可以说每一个公司都有使用LAMP这种架构,可以说它在国内互联网公司中的占有率基本上达到100%.
对于大流量、大并发量的网站系统架构来说,除了硬件上使用高 性能的服务器、负载均衡、CDN等之外,在软件架构上需要重点关注下面几个环节:使用高性能的操作系统(OS)、高性能的网页服务器(Web Server)、高性能的数据库(Database)、高效率的编程语言等。
2.Lamp和Lnmp的区别(了解)
重点要记住:对于PHP来说,Apache面对逻辑复杂计算量大的程序它比较稳定也比较快,Nginx在方面是比不过Apache的,另外更重要的是Nginx的诞生不是为了取代Apache,因为Nginx是为了访问量而设计的服务器,Apache是为了计算量设计的服务器。在最早的时候Nginx服务器并不支持PHP的,是后来加入了FastCgi才开始支持PHP的。因此社会上有一些人告诉你LNMP将来一定是主流的组合,其实不是完全正确的说法,因为LAMP依然是无可取代的。
1)nginx和apache的软件底层架构不一样。Nginx的并发性要比apache好很多,nginx属于轻量级服务器软件,apache属于重量级软件,nginx在处理静态页的效率要比apache好很多;apache在安全性要比nginx要好,apache在处理动态页面上的效率要比nginx高。
2)运行模式不同的。php在apache环境下,运行的是php5模块方式运行的,由于是apache去加载php5模块,所以每次修改了php配置文件需要重启apache;在nginx模式下,php运行的时候使用的是php-fpm方式(fastCGI)进行运行,这个方式会创建服务php-fpm(端口是9000),因此在nginx下修改了php配置文件则需要重启php-fpm服务。
二.Nginx是什么
Nginx ("engine x") 是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP服务器。Nginx是由塞索耶夫(Igor Sysoev)为俄罗斯访问量第二的Rambler.ru站点开发的.
Nginx有俄语发音和英语发音两种发音(因此有人叫Nix和也有人叫engine x).
Nginx服务器的特点:
1)热部署
2)可以高并发连接
3)低的内存消耗
4)处理响应请求很快
5)具有很高的可靠性
国内使用nginx作为服务器的著名网站有:
百度、京东、新浪、网易、腾讯、淘宝、三七互娱等。
查看一个网站是否使用nginx
使用lua命令:curl -I -H "Accept-Encoding: gzip, deflate" "网址"
获取37wan这个网站的相关信息:
curl -I -H "Accept-Encoding: gzip, deflate" "http://www.37.com"

其实淘宝也是使用Nginx只不过,淘宝的工程师把Nginx的源代码进行了修改,他们把修改后的Nginx服务器叫Tengine,所以如果你去购买了阿里云你就可以使用Tengine服务器,是一个进阶版Nginx

三.安装LNMP
1.lnmp的特点
Lnmp是Linux+Nginx+MySql+PHP的组合服务器架构,Nginx修改配置文件可以无需重启Nginx服务,它管理PHP是依赖PHP的内存管理工具php-fpm,所以当php的配置发生修改,Nginx服务器是不需要重新启动去加载php的配置的,只需要单纯重新启动php-fpm本身就可以完成php的配置。
2.安装Lnmp的详细步骤(Lmnp)
如果安装lnmp的顺序搭建那么就会有以下的版本出现:
Centos6.5+Nginx1.6.2+Mysql5.5+PHP5.3
我们需要搭建的环境版本:
Centos6.5+Nginx1.6.2+Mysql5.1.73+PHP5.6.4
其实lnmp环境是为了解决访问量和负载均衡而生的,所以安装这个lnmp的环境其实最特别的地方就是安装nginx,但是安装lnmp最特别的地方是要同一个叫atomic的协议,而这个协议同意后,假设你安装MySql就会是MySql5.5的版本,然而我们在开发当中一般使用MySql的经典版本5.1.73.所以安装Lnmp开始必须先安装mySql5.1.73而不同不能通atomic协议.
第1步:安装MySql5.1.73
yum -y install mysql mysql-server mysql-devel

回车执行以上的yum脚本那么安装mysql5.1.73成功.由于mysql5.1.73有中文乱码的可能性,所以我们必须去补一个中文乱码的脚本包,把脚本包上传到/usr/local/src/下进行配置

我们需要修改mysql.sh为777的执行权限,如下所示:

回车修改权限完成后,我们就可以执行mysql.sh,执行命令可以使用sh mysql.sh或者./mysql.sh

因为安装lnmp有一个特殊性,必须把mysql的客户端也设置一个utf8的默认编码,这时需要使用vim /etc/my.cnf文件,修改的内容如下:

完成后,保存并退出(:x),然后重启mysqld服务

完成后需要为mysql加入root用户和密码:

完成以上工作后,登录数据库去查看utf8的相关信息:

确认以上无误后,就代表mysql5.1.73安装和配置成功了。
第2步:安装php5.6,由于Red Hat系列的Linxu默认会安装php5.3,所以需要先修改yum源,修改代码如下:
配置yum源
rpm -Uvh http://ftp.iij.ad.jp/pub/linux/fedora/epel/6/x86_64/epel-release-6-8.noarch.rpm
rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-6.rpm

由于nginx是靠php-fpm来启动php的,所以必须首先安装php-fpm,安装命令如下:
yum -y install --enablerepo=remi --enablerepo=remi-php56 php-fpm

出现以下界面代表安装成功:

执行以上就安装了php-fpm,然后就可以安装php5.6了,安装命令如下:
yum -y install --enablerepo=remi --enablerepo=remi-php56 php php-opcache php-devel php-mbstring php-mcrypt php-mysqlnd php-pecl-xdebug php-pecl-xhprof libmemcached php-pecl-memcache php-pecl-memcached php-pecl-mongodb php-pecl-redis
执行以上命令完成后就会出现以下界面:

第3步:但是由于安装nginx在linux当中比较特殊,由于nginx它加入GNU计划,所以在安装nginx之前必须要先同意和支持该计划,否则nginx无法安装。
wget命令:相当于windows的迅雷,功能就是下载如果你要下载一个atomic的脚本到/usr/local/src那么你就需要遵循以下步骤:
①切换到/usr/local/src

②使用wget + url如下所示:

下载成功后,就会在/usr/local/src下出现一个脚本文件

wget下载不了https拥有安全证书认证文件,例如下载百度的图片:

由于atomic的脚本没有执行的权限,所以我们需要给它777的权限,使用命令:
chmod -R 777 atomic

完成权限设置后,需要执行该脚本的运行 ./atomic ,效果如下:

输入yes之后,出现GPG keys的时候或者输入ok

出现以下界面,继续输入yes

完成后就已经同意了该协议了,我们需要执行yum check-update 来更新nginx当前版本的yum源,执行效果如下:

完成后,就可以安装Nginx了。
第4步:安装Nginx,使用以下安装命令:yum -y install nginx

安装完成后,需要启动nginx,启动命令: service nginx start,启动完毕后,通过浏览器可以看到以下界面,就代表nginx,安装成功了:

第5步:把nginx相关的脚本(nginx_cn.zip和nginx.sh)上传到/usr/local/src目录下

并且把nginx.sh文件的权限设置为777,如下图所示:

完成后,执行./nginx.sh脚本

这时需要检查以下配置文件的语法是否正常,使用nginx -t检查语法,效果如下:

得到以上结果,证明nginx的语法正常,这时,我们重启nginx

如果一切都正常,那么就代表配置的补丁已经成功了,这时我们还需要知道一点,nginx占据80端口,如果当前拥有apache或者启动服务器占据了80端口那么就需要杀死其他占据该端口的进程让nginx可以正常的启动:

如果访问linux的服务器地址就会出现以下界面:

证明nginx启动成功,但这个界面可以是不同的模板样式,因为安装的时候,其实nginx官方会随机下载一个模板回来你的本地,你没办法控制模板的样,如果我们现在nginx的站点目录(默认在/usr/share/nginx/html下)编写phpinfo.php脚本,内容如下:

运行结果,不支持php,如下:

因为这时nginx跟apache不一样,它默认情况不支持php,你必须修改nginx的配置文件和php-fpm的配置文件,才可以让nginx支持php
第6步:让nginx支持php的运行,所以我们需要修改nginx相关的配置,使用vim /etc/nginx/conf.d/default.conf 编辑该文件,把以下设置打开即可:


把以上代码的php部分配置打开,如下所示:

保存并退出(:x),但暂时不要重启nginx服务器,可以使用nginx -t查看语法是否修改正确:

修改php-fpm的相关配置, vim /etc/php-fpm.d/www.conf

打开该文件,发现默认的是支持apche

把user和group选项分别改为nginx,如下图所示:

修改完成,开启php-fpm和重启nginx


完成后,需要使用vim /usr/share/nginx/html/phpinfo.php 编辑该文件

编辑内容如下:

测试结果如下:
①首先,要先查看nginx到底有没有出现语法错误:

②访问浏览器打开phpinfo

注意:如果你是修改的配置或者安装了扩展是不需要重启nginx服务器的,我们是需要重启php-fpm,因为lnmp环境下php是由php-fpm去控制和管理的.
如果安装没有某些php的扩展,我们可以在日后需要的时候随时进行补加操作,比如我们要加入 php-gd*库那么可以使用以下命令进行安装:
yum -y install --enablerepo=remi --enablerepo=remi-php56 php-gd*
出现以下界面,就证明补加gd库在Lnmp中成功了:

如果我们修改的php的扩展,我们要重启是php-fpm,而不是nginx,重启php-fpm

出现gd库,那么就代表php-gd加载到lnmp中成功:

3.让nginx支持thinkphp
第1步:首先我们把thinkphp传到nginx的站点目录中(/usr/share/nginx/html)
修改目录权限为777

清空目录,方便thinkphp的部署

上传ThinkPHP目录和index.php文件到站点目录中:

看起来好像thinkphp被lnmp支持:

第2步:编写IndexController.class.php文件如下,增加一个action名为lnmp

在lnmp环境中访问路径:
http://192.168.84.197/index.php/Home/Index/lnmp,结果如下:

在默认的情况下,lnmp不能识别thinkphp的pathinfo访问形式,所以我们必须要在nginx的配置中启动thinkphp的pathinfo模式

第3步:在nginx的配置文件中(/etc/nginx/conf.d/default.conf),修改内容如下:

保存并退出(:x),使用nginx -t来查看代码的语法:
重启nginx服务器


建议不要按照thinkphp官方的配置,否则无法配置成功
第4步:如果我们用ftp上传一个开发的php文件到lnmp的站点目录中,每次我们都需要修改这个站点目录的权限为777,其实是很麻烦的,因此建议使用定时命令每1分中修改依次站点目录的权限,编写命令如下:

保存并退出(:x),修改777之后,包括php的上传也可以具备权限

三.Nginx配置文件基本格式

1、全局块:配置影响nginx全局的指令。一般有运行nginx服务器的用户组,nginx进程pid存放路径,日志存放路径,配置文件引入,允许生成worker process数等。
2、events块:配置影响nginx服务器或与用户的网络连接。有每个进程的最大连接数,选取哪种事件驱动模型处理连接请求,是否允许同时接受多个网路连接,开启多个网络连接序列化等。
3、http块:可以嵌套多个server,配置代理,缓存,日志定义等绝大多数功能和第三方模块的配置。如文件引入,mime-type定义,日志自定义,是否使用sendfile传输文件,连接超时时间,单连接请求数等。
4、server块:配置站点的模块。
5、location块:配置请求的路由,以及各种页面的处理情况。
四.nginx的配置文件分析
1.全局配置文件和子配置文件
全局配置的文件的路径: /etc/nginx/nginx.conf
子配置文件的路径: /etc/nginx/conf.d/default.conf
2.全局配置文件的分析
使用vim打开/etc/nginx/nginx.conf,看到的内容如下:

上图最重要最需要理解的选项worker_processes,代表当前cpu的核数+进程数,如果有一个cpu为双核的,这时由于双核的cpu一般都是双线程的,所以我们可以把worker_processes设置为4,一般真正的公司开发环境,设置为4的很多.最大设置8.
假设我们有一个8核的双线程cpu那么我们是否可以把worker_processes设置为16呢?
答案:可以设置,但不太建议,因为其实如果你把cpu的进程选项设置为16反而会拖慢nginx的进程,因为16是最大瓶颈,因此很多运维把这个值一般大定义8,我们学习的时候一般改为1就可以了,防止我们的机器重启。

1024代表1核cpu的最大连接数,如果cpu为双核这时nginx在运行式就会使用
worker_processes * worker_connections = 2 * 1024 表示最大支持并发在线使用人数为
2048,如果你的cpu为4核,这时就是4*1024,如果使用lnmp的环境来提高访问量的的并发数,其实重点在于添加硬件设备cpu的核数核修改worker_processes的值(最大设置为8)
nginx其实还提供错误日志信息如下 :

错误日志的格式分为3个部分:

error_log表示nginx的错误日志选项
/var/log/nginx/error.log表示nginx错误日志的文件的存放路径
notice表示该日志只存放关于notice错误类型的相关信息
在开发中有写运维编写错误日志的代码如下:
error_log /var/log/nginx/error.log
不加错误类型,就表示所有的错误都会记录在一个文件当中,这样好处就是一次只需查看一个文件,但是不好的地方就是需要定时是清理这个文件,因为会越来越大
3.子配置文件的分析
使用vim打开/etc/nginx/conf.d/default.conf,打开之后,内容如下:


location / 表示当网站遇到打开的初始化
location ~ \.php 遇到.php后缀的时候执行{}中的配置操作
location ~ .+\.php($|/) 遇到php的pathinfo重写的时候执行{}中的操作
location ~ .*\.(jpg|jpeg|gif|css|png|js|ico|mp3|mp4|swf|flv) 遇到的后缀名在()中任意一者,只要匹配那么就执行{}中配置操作
$document_root表示网站的站点根目录

表示反向代理服务器的标识,跟全局配置主文件以下选项相关:

他们两者通过web关键词来关联
4.主配置文件的http{}节点

/etc/nginx/mime.types文件,该文件包含网站请求所有允许的常见文件类型,查看该文件内容如下:

一般如果没有特殊要求,最好不要修改和添加
default_type application/octet-stream;代表nginx优先解析的脚本文件类型(lua,python,php,jsp)

log_format表示日志的文件的格式,一般不做修改,这个文件表示重要文件就要main来表示
access_log表示网站请求的的访问日志,包括ip,浏览器类型,时区等都可以在该文件中查找,其格式就是log_format当中定义的格式,所以有网站统计的功能就是分析此文件,分析此文件一般多少asp.net程序员

引导加载多个子文件后缀名为.conf的子配置,也就说可以利用这个自文件配置多个nginx站点目录

表示Nginx的gzip压缩功能的配置,是网站加速的一种手段,是nginx独有的

五.网站的静态资源和gzip压缩
一般静态页面指没有和服务器互相交互的html页面。
我们平常所说的html,css,image,js,xml,json,视频,音乐等都属于静态资源。
静态资源越大越多网页加载的速度就会越慢,因此有必要对静态资源进行压缩优化,这就可以为网站提速不少。
然而有一些大型网站他们除了对静态资源压缩之外他们还会使用CDN静态资源服务器做支撑,但CDN服务器是需要一定的资金成本的。
查看一个网站是否有启用静态资源压缩:

在Nginx服务器中,我们可以通过开启gzip来对网站的静态资源进行压缩
配置如下:
使用vim打开/etc/nginx/nginx.conf,把该文件的配置修改如下:

其实就算把gzip的选项#号全部打开,这个配置是原创作者是张宴
修改完成后,可以有以下两种方式让配置生效
①重启nginx服务器:service nginx restart
②使用nginx -s reload重新加载(建议,因为效率更高)
但在重启之前最好先使用nginx -t来检查配置的语法

然后可以使用nginx -s reload来重新加载配置文件:

六.部署华道官网到Nginx中测试gzip
华道官网是一个用js滚屏特效加上高质量图片做的一个网站,这个网站的静态资源很大,当800人访问时这个网站就会打不开,这个测试是当初在ChinaJoy游戏峰2012会上《服务器架构运维技术》分享交流会中张宴提供的案例代码。这个网站示例专门用来做测试gzip使用的,这个网站曾经被专业测试人员在有压缩和无压缩的情况下进行过测试,无压缩的情况下用户访问大于800人时网站的访问会出现白屏,如果经过gzip压缩后2000人访问依然能够很快地打开,所以我们可以学习有用的经验,把这些东西变成我们的知识。
第一步:把华道官网解压如下

第二步:使用ftp上传的/usr/share/nginx/html下,修改把/usr/share/nginx/html/权限修改为777,访问如下,代表成功部署华道官网


第三步:部署完成后,使用lua的curl测试网站
curl -I -H "Accept-Encoding: gzip, deflate" "http://192.168.84.197"

第四步:打开gzip压缩选项

第五步:分析gzip选项的意义
gzip_types:压缩网页文件的类型有哪些(最关键)
gzip_disable "MSIE [1-6]\.":因为gzip启动压缩跟客户浏览器是相关的,IE如果遇到gzip就会产生白屏或者网站无法显示图片的现象,所以这个选项禁止gzip压缩在IE中发生
gzip_min_length 1k; 如果网页的文件超过1k,那么gzip就会启动压缩,压缩该文件

由于gzip压缩会消耗服务器cpu,所以就需要使用4倍*16k的方式申请当前压缩所需要的内存空间大小,gzip_comp_level压缩速度等级,1是最快也是消耗最大,所以一般设置2比较合理
第六步:查看华道官网是否对js文件和css文件以及图片文件进行压缩
curl -I -H "Accept-Encoding: gzip, deflate" "http://192.168.84.197"
在默认情况其实是压缩首页html文件,那么是否会压缩js,这时修改命令如下
curl -I -H "Accept-Encoding: gzip, deflate" "http://192.168.84.197/js/jquery-1.12.2.min.js"

发觉js是可以被压缩的,愿意是gzip_types当中设置js的压缩类型为,如果我们去掉image/jpeg这个选项,那么是否还会压缩jpg图片呢?

因为去除了类型文件选项,所以Jpg无法进行压缩,如果重新添加,查看结果如下:

说明gizp的类型一般不需要做任何更改
细心观察发现,gzip能够压缩文件不包括音乐和视频,动画等文件,那么这些文件不需要做优化吗?因为gzip无法压缩媒体,因此nginx建议对媒体文件进行缓存操作
七.使用缓存功能把静态资源缓存到客户端
1.启动缓存功能的配置如下(vim /etc/nginx/conf.d/default.conf):

如果希望对静态文件缓存10天,设置为如下:

注意:如果linux的时间是不对的,那么缓存时间就会有误差,而且这个误差很明显,因此我们需要设置Linux系统的系统时间和硬件时间同步。

保存并退出,然后重启nginx服务(nginx -s reload)
使用lua的curl测试如下:

注意:如果您设置的nginx缓存时间小于浏览器的默认缓存时间(默认设置3天),有些浏览器可以会不进行理会,所以缓存的化尽量设置一些时间比较长值会更为有意义.
如果客户禁止浏览缓存,那么你将无法把数据缓存到客户端浏览器当中
缓存的查看一般以Lua的curl为主,因为这个缓存是发生服务器端到浏览器对的过程。
八.什么是集群(了解)
服务器(电脑主机箱),安装许多软件,例如php/apache/mysql/redis/memcache等等
这些软件是网站运行需要的
网站运行经营的比较好的,每天就会有许多人员进行访问(pv(point view):1000万)
(一天3600*4=14400秒),平均并发访问量:700次,峰值:3000/4000/5000或以上并发量:服务器每秒被访问的次数
现在服务器每天的负载很高(工作量非常多)
并发访问量高的时候,服务器要做优化(否则影响用户使用):
可以购买多个服务器来支撑网站运行,这个多服务器的组合就是“集群”
集群就是成本很高,维护很困难,使用云计算的服务器空间。云计算在世界上最专业最贴近运维技术的就是亚马逊云
九.负载均衡的分发实验
1.正向代理和反向代理的原理图:


1.负载均衡的原理和作用

2.使用nginx部署一个负载均衡的实验
第1步:修改Proxy服务器的主配置文件如下(加入负载均衡服务器的集群ip地址)
修改/etc/nginx/nginx.conf如下:

weight:权重值越高被分发几率越大,如果一台服务器的性能非常好应该服务器的权重稍高
如果两台服务器的weight是1比1那么就被分发的几率就是50%,服务会定时切换
max_fails:请求反向代理的最多失败次数,如果失败超过3次,就证明后端某台服已经挂机了
fail_timeout:请求的最长相应时间,如果服务器的性能很强大,那么这个响应式可以设置为更大
第2步:配置子配置文件(/etc/nginx/conf.d/default.config)负责分发请求的代理,内容如下:

保存并退出(:x),然后重启nginx服务器

第3步:在lamp1这台服务器的/var/www/html下编写php25.php,内容如下:

第4步:在lamp2这台服务器的/var/www/html下编写php25.php,内容如下:

第5步:访问反向代理服务器Proxy,查看结果如下 :


我们发觉两台被反向代理后,会切换工作,因此在业界当中运维人员把这中现象称为服务器轮巡,虽然负载均衡非常的实用但是同样会带来session丢失的问题,因为session在默认的情况下是用files来进行存储的,这时问题如下
第1步:在lamp1当中编写setSession.php文件内容如下:

第2步:在lamp1当中编写getSession.php文件内容如下:

第3步:在lamp2当中编写getSession.php文件内容如下:

这时我们经过上面的准备,setSession.php文件只有lamp1服务器拥有,所以请求setSession.php的时候一定会在lamp1的服务器/var/lib/session目录中建立一个文件,而不会再lamp2当中建立,于是运行效果如下:

而在lamp2下没有sess文件,这时如果我们访问getSession.php就会出现以下的结果:


以上问题如果需要完美的解决,最好的方案就是设置session入库(到memcached)当中
十.负载均衡的Session问题(session入库)
第1步:修改lamp1的setSession.php文件,内容如下所示:

测试结果如下下:

第2步:修改lamp1的getSession.php文件,内容如下所示:

第3步:修改lamp2的getSession.php文件,内容如下所示:

经过session入库处理后,那么就会两台服务都从memcache当中获取session的相关数据,因此服务器轮巡session就不会丢失。



浙公网安备 33010602011771号