Nginx-入门与安装

常见的两种架构:负载均衡和高可用

集群:通过多台设备协调运作—满足我们一个功能

负载均衡:让原本一条线 变成多条,减轻一台的压力  (Nginx  + Lvs)     Nginx可以作为Web、负载(反向代理);

高可用:多台相同的服务器之间相互冗余  (Keepalived)

   Nginx(engine x)是一个高性能的HTTP和反向代理服务器。因它的稳定性、丰富的功能集、示例配置文件和低系统资源的消耗而闻名。

 Nginx是一款轻量级的Web服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,并在一个BSD-like协议下发行。其特点是占用内存少,并发能力强。事实上Nginx的并发能力确实在同类型的网页服务器中表现较好,中国大陆使用nginx网站用户有:百度BWS、新浪、网易、腾讯等;

Nginx的web服务器具有高性能,对比Apache并发量高5-10倍;轻量级体现在代码简洁;

Nginx的反向代理服务器,正向代理-只能用于客户端,比如NAT共享上网、个人使用VPN,代理设备代替客户端发送请求;反向代理-用于服务器-集群架构层面或者缓存,Nginx、squid等,代理设备代替服务器进行请求的接受,然后把请求发送给真实服务器(Real Server),进而保护RS的信息安全;

Nginx官方网站

RamBler : http://www.rambler.ru/ Nginx : http://nginx.org/

Mainline version 主线版本 奇数版本-叫做开发测试版本
Stable version 稳定版本 偶数版本-稳定的,用于生产环境
Legacy version 历史版本 偶数版本-也是稳定的

如果公司是最新的架构,那么就选择最新的稳定版本就行,大企业一般都是二开的,Nginx中小企业都是源码安装,大企业自建yum仓库安装,Nginx支持yum安装,但是需要EPEL源;

版本的选择:Nginx多个稳定,应该怎么去选择,1、看具体的业务,某个版本是否支持 2、会选择距离现在半年左右的稳定版本

了解Tengine:

Tengine是由淘宝网发起的Web服务器项目,它在Nginx的基础上,针对大访问量网站的需求,添加了很多高级功能和特性,Tengine的性能已经在大型网站得到了很好的检验,淘宝拿到了Nginx源代码之后,进行了功能的填充,优化等等,然后提交给Nginx官方,由于Nginx官方响应慢,加上语言沟通不顺畅,淘宝公司自己打包,于是就有现在的Tengine这个版本;适用于电商网站;

官网网站:http://tengine.taobao.org/

一、LNMP原理

Nginx本身只支持静态页面的处理,当客户端访问php页面的时候,Nginx会将php转到php-fpm处理,php-fpm服务会把php页面解析成html文件给Nginx处理,Nginx返回给客户端处理;

这里需要结合Apache的工作,对PHP文件处理过程的区别

1、Nginx是通过php-fpm这个服务来处理php文件

2、Apache是通过libphp5.so模块来处理php文件

Apache的libphp5.so随着apache服务器一起运行,而Nginx和php-fpm是各自独立运行,所以在服务的运行过程中,Nginx和php-fpm都需要分别启动,Nginx与php-fpm通讯端口9000;
Nginx特点是占用内存少,并发能力强,事实上Nginx的并发能力确实在同类型的网页服务器中表象较好。

Nginx相对于Apache优点如下:

  • 高并发响应性能非常好,官方Nginx处理静态文件并发5W/s,标准配置:CPU:8C,MEM:16G,Disk 600G,性能相当于Apache的5-10倍;
  • 负载均衡及反向代理性能非常强
  • 系统内存和CPU占用率低
  • 可对后端服务进行健康检查
  • 支持PHP cgi方式和FastCGI方式
  • 可以作为缓存服务器、邮件代理服务器;
  • 配置代码简洁且容易上手

二、Nginx工作原理

Nginx的模块从结构上分为如下三类:

  • 核心模块:HTTP模块、Event模块、Mail模块等;
  • 基础模块:HTTP Access模块、HTTP FastCGI模块、HTTP Proxy模块和HTTP Rewrite模快;
  • 第三方模块:HTTP Upstream Request Hash模块、Notice模块和HTTP Access Key模块、Limit_req模块等;

Nginx的模块从功能上分为如下三类:

  • Handlers (处理器模块):此类模块直接处理请求,并进行输出内容和修改headers信息等操作,Handlers处理器模块一般只能有一个;
  • Filters (过滤器模块):此类模块主要对其他处理模块输出的内容进行修改操作,最后由Nginx输出;
  • Proxies (代理类模块):此类模块是Nginx的HTTP Upstream之类的模块,这些模块主要与后端一些服务比如FastCGI等进行交互,实现服务代理和负载均衡等功能。

Nginx由内核和模块组成,其中内核的设计非常微小和简洁,完成的工作也非常简单,仅仅通过查找配置文件(nginx.conf)将客户端(用户)的请求映射到一个Location block,而location是Nginx配置中的一个指令,用于匹配用户访问的URL路径,而在这个Location中所配置的每个指令将会启动不同的模块去完成相应的工作,如下图所示:

Nginx的高并发得益于其采用了epoll模型,与传统服务器程序架构不同,epoll是Linux内核2.6以后才出现的,Nginx采用epoll模型,异步非阻塞,而apache采用的是select模型;

Select特点:Slelect选择句柄的时候,是遍历所有句柄,也就是说句柄有时间响应的时候,Select需要遍历所有句柄才能获取到那些句柄有时间通知,因此效率是非常低;

epoll的特点:epoll对于句柄事件的选择不是遍历的,是事件响应的,就是句柄上事件来就马上选择出来,不需要遍历整个句柄链表,因此效率非常高;

三、Nginx安装配置

Nginx Web安装时可以指定很多的模块,默认需要安装Rewrite模块,也即是需要系统又PCRE库,安装Pcre支持Rewrite功能(灵活的操作就一定需要正则,用正则就需要Pcre库),如下为安装Nginx Web服务器方法:

安装PCRE,不确定装那个,直接将开发组包都装上:

[root@LB ~]# yum install -y pcre-devel

安装基础软件:

[root@LB ~]# yum install -y vim gcc gcc-c++ wget lrzsz

上传nginx-1.12.2.tar.gz,并解压:

源码编译安装Nginx:

[root@LB ~]# cd nginx-1.12.2
[root@LB nginx-1.12.2]# useradd www -s /sbin/nologin -M      #创建nginx的系统用户www
[root@LB nginx-1.12.2]# ./configure --prefix=/usr/local/nginx --with-http_dav_module --with-http_stub_status_module --with-http_addition_module --with-http_sub_module --with-http_flv_module --with-http_mp4_module --with-pcre=/usr/local/src/pcre-8.37

预编译参数说明:

–prefix=/usr/local/nginx #源码编译安装路径

–with-http_dav_module #启用支持(增加PUT、DELETE、MKCOL:创建集合,COPY和MOVE方法) 默认是关闭的,需要编译开启;

–with-http_stub_status_module #启用支持(获取Nginx上次启动以来的工作状态);

–with-http_addition_module #启用支持(作为一个输出过滤器,支持不完全缓冲,分部分响应请求);

–with-http_sub_module #启用支持 (允许一些其他文本替换Nginx相应中的一些文本);

–with-http_flv_module #启用支持 (提供支持flv视频文件支持);

–with-http_mp4_module #启用支持 (提供支持MP4视频文件支持,提供伪流媒体服务端支持);

–with-pcre=/usr/local/src/pcre-8.37 #需要注意,这里指的是源码安装的pcre,需要指明路径,yum安装的则不需要,上述我们用的是yum安装的,所以这个参数现在不需要;

预编译的时候,出现error:

解决方式:yum install -y zlib-devel #缺少XXX library,就安装XXX-devel

安装zlib之后重新预编译、编译、安装:

[root@LB nginx-1.12.2]# make && make install

进入到安装路径,就4个目录,如下:

目录说明:
conf #Nginx的配置文件内容
html #网站的网页站点
logs #存放Nginx的日志
sbin #Nginx的控制命令

sbin目录下控制命令就一个:/usr/local/nginx/sbin/nginx

但是后面支持如下内容:

注释:
/usr/local/nginx/sbin/nginx #启动Nginx的Web服务
/usr/local/nginx/sbin/nginx -s stop #停止Nginx的Web服务
/usr/local/nginx/sbin/nginx -s reload #平滑重启Nginx的Web服务

启动Nginx,并访问Nginx的默认页面:

这个页面在Nginx的html目录下的index.html

将index.html移除,重启Nginx,重新访问页面:

为什么访问会出现403 Forbidden ? 如下:

首先,先过滤Nginx配置文件中的注释行和空行:

[root@LB ~]# cd /usr/local/nginx/conf/
[root@LB conf]# mv nginx.conf nginx.conf.bak
[root@LB conf]# egrep -v "#|^$" nginx.conf.bak > nginx.conf     

配置文件中内容,如下:

当Nginx访问错误,或者有错误页面,就会返回给用户html目录中的50x.html;

测试Nginx服务安装是否正确,代码命令如下:

/usr/local/nginx/sbin/nginx -t #检查nginx配置文件,返回OK和Successful即可

[root@LB conf]# /usr/local/nginx/sbin/nginx -t 
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful

四、Nginx升级更新

Nginx Web服务器定期更新,如果需要将低版本升级或者将高版本降级,升级或者降级方法如下,分为四个步骤,包括软件下载、预编译、编译、配置,具体方法如下:

查看当前Nginx软件版本:

/usr/local/nginx/sbin/nginx -v #查看Nginx的简要版本信息

/usr/local/nginx/sbin/nginx -V #能够看到版本信息、使用的编译器、以及编译进去的模块信息;

软件上传并且解压:nginx-1.14.2

预编译:添加上user 、group参数

[root@LB ~]# cd nginx-1.14.2
[root@LB nginx-1.14.2]# ./configure --prefix=/usr/local/nginx --with-http_dav_module --with-http_stub_status_module --with-http_addition_module --with-http_sub_module --with-http_flv_module --with-http_mp4_module --usre=www --group=www

编译:

[root@LB nginx-1.14.2]# make

配置:

#将原来Nginx的启动文件备份一下;

#在新的Nginx的源码安装包内的objs目录下将新的nginx文件cp到/usr/local/nginx/sbin/下去

[root@LB nginx-1.14.2]# mv /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.old 
[root@LB nginx-1.14.2]# cp objs/nginx /usr/local/nginx/sbin/ -a
[root@LB nginx-1.14.2]# cd /usr/local/nginx/sbin/
[root@LB sbin]# ls
nginx  nginx.old
[root@LB sbin]# 

#检测Nginx的配置;

[root@LB sbin]# /usr/local/nginx/sbin/nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful

验证:

#将原来的index.html修改回来

[root@LB sbin]# mv /usr/local/nginx/html/index.html.bak /usr/local/nginx/html/index.html

#平滑重启Nginx、查看version;

[root@LB sbin]# ./nginx -s reload
[root@LB sbin]# ./nginx -v      
nginx version: nginx/1.14.2

#访问页面正常;

本博客中Nginx相关博文,都是从头到尾相关联的,需要读者从头至尾阅读;