一、Nginx概述:

1、什么是Nginx:

Nginx是一个高性能的HTTP和反向代理、负载均衡服务器,也是一个IMAP/POP3/SMTP服务器。

2、为什么要用Nginx?

(1)跨平台、配置简单;

(2)非阻塞、高并发连接:处理2-3万并发连接数,官方监测能支持5万并发;

(3)内存消耗小:开启10个nginx才占150M内存,Nginx采取了分阶段资源分配技术;

(4)nginx处理静态文件好,耗费内存少;

(5)内置的健康检查功能:如果有一个服务器宕机,会做一个健康检查,再发送的请求就不会发送到宕机的服务器了。重新将请求提交到其他的节点上。

(6)节省宽带:支持GZIP压缩,可以添加浏览器本地缓存;

(7)稳定性高:宕机的概率非常小

(7)master/worker结构:一个master进程,生成一个或者多个worker进程。

(8)接收用户请求是异步的:浏览器将请求发送到nginx服务器,它先将用户请求全部接收下来,再一次性发送给后端web服务器,极大减轻了web服务器的压力;

(9)一边接收web服务器的返回数据,一边发送给浏览器客户端;

(10)网络依赖性比较低,只要ping通就可以负载均衡;

(11)可以有多台nginx服务器;

(12)事件驱动:通信机制采用epoll模型。

3、Master和Worker进程的作用:

master/worker结构:一个master进程,生成一个或者多个worker进程;master对worker进程采用信号进行控制。

Master进程:读取及评估配置和维持;Worker进程:处理请求。

4、Nginx是如何处理一个请求的呢?

(1)首先,nginx在启动时,会解析配置文件,得到需要监听的端口与ip地址;然后在nginx的master进程里面,先初始化好这个监控的socket,再进行listen;然后再fork出多个子进程出来,  子进程会竞争accept新的连接。

(2)此时,客户端就可以向nginx发起连接了。当客户端与nginx进行三次握手,与nginx建立好一个连接后;

(3)此时,某一个子进程会accept成功,然后Nginx创建对连接的封装,即ngx_connection_t结构体。接着,根据事件调用相应的事件处理模块,如http模块与客户端进行数据的交换。

(4)最后,nginx或客户端来主动关掉连接,到此,一个连接就完成了。

5、Nginx为什么不使用多线程?为什么性能这么高?nginx是如何实现高并发的?

(1)例如Apache服务器的工作原理,创建多个进程或线程,而每个进程或线程都会为其分配cpu和内存,但是并发过大会榨干服务器资源。由于web server的工作性质决定了每个request的大部份生命都是在网络传输中,实际上花费在server机器上的时间片不多。这是几个进程就解决高并发的秘密所在。即webserver刚好属于网络io密集型应用,不算是计算密集型。

(2)所以Nginx,采用单线程异步非阻塞处理请求,运用epoll模型,提供了一个队列,排队解决,不会为每个请求分配cpu和内存资源,节省了大量资源,同时也减少了大量的CPU的上下文切换。所以才使得Nginx支持更高的并发。

(3)Nginx会有一个master主进程,一个master对应多个worker工作进程,每个worker工作进程可以处理多个请求,每进来一个request,会有一个worker进程去处理。但不是全程的处理,处理到可能发生阻塞的地方,比如向后端服务器转发request,并等待请求返回。那么,这个处理的worker继续处理其他请求,而一旦后端服务器返回了,就会触发这个事件,worker才会来接手,这个request才会接着往下走。

6、动态资源、静态资源分离:

动态资源、静态资源分离是让动态网站里的动态网页根据一定规则把不变的资源和经常变的资源区分开来,动静资源做好了拆分以后,我们就可以根据静态资源的特点将其做缓存操作,这就是网站静态化处理的核心思路。

7、为什么要做动、静分离?

在我们的软件开发中,有些请求是需要后台处理的(如:.jsp,.do等等),有些请求是不需要经过后台处理的(如:css、html、jpg、js等等文件);这些不需要经过后台处理的文件称为静态文件,否则为动态文件。

有人说后台忽略静态文件不就完了吗?当然这是可以的,但是这样后台的请求次数就明显增多了。在我们对资源的响应速度有要求的时候,我们应该使用这种动静分离的策略去解决。动、静分离将网站静态资源(HTML,JavaScript,CSS,img等文件)与后台应用分开部署,提高用户访问静态代码的速度,减少对后台应用访问,减低后台服务器的压力。

这里我们将静态资源放到nginx中,动态资源转发到tomcat服务器中。

8、内存池的设计:

为了减少避免出现内存碎片、减少向操作系统申请内存的次数、降低各个模块的开发复杂度,Nginx采用了简单的内存池(统一申请,统一释放)。比如为每个http请求分配一个内存池,请求结束时销毁整个内存池。

 

 

二、Nginx的安装:
  在Centos上安装:

(1)安装模块依赖性:

gcc:安装 nginx 需要先将官网下载的源码进行编译,编译依赖 gcc 环境。

gzip模块需要zlib库:zlib库提供了很多种压缩和解压缩的方式,nginx使用zlib对http包的内容进行gzip,所以需要在linux上安装zlib库。

rewrite模块需要pcre库:PCRE是一个Perl库,包括 perl 兼容的正则表达式库。nginx的http模块使用pcre来解析正则表达式,所以需要在linux上安装pcre库。

ssl功能需要openssl库:openssl是一个强大的安全套接字层密码库,囊括主要的密码算法、常用的密钥和证书封装管理功能及SSL协议,并提供丰富的应用程序供测试或其它目的使用。nginx不仅支持http协议,还支持https(即在ssl协议上传输http),所以需要在linux安装openssl库。

安装预备软件的命令:

yum -y --noplugins install wget zip
yum -y --noplugins install unzip
yum -y --noplugins install make
yum install gcc-c++
yum install -y pcre pcre-devel
yum install -y openssl openssl-deve

(2)下载与编译安装nginx:

直接下载.tar.gz安装包:地址:https://nginx.org/en/download.html

使用wget命令下载:

wget -c https://nginx.org/download/nginx-1.10.1.tar.gz
解压:

tar -zxvf nginx-1.10.1.tar.gz
cd nginx-1.10.1
(3)配置:

①默认配置:

./configure
②自定义配置:

./configure \
--prefix=/usr/local/nginx \
--pid-path=/var/run/nginx/nginx.pid \
--lock-path=/var/lock/nginx.lock \
--error-log-path=/var/log/nginx/error.log \
--http-log-path=/var/log/nginx/access.log \
--with-http_gzip_static_module \
--http-client-body-temp-path=/var/temp/nginx/client \
--http-proxy-temp-path=/var/temp/nginx/proxy \
--http-fastcgi-temp-path=/var/temp/nginx/fastcgi \
--http-uwsgi-temp-path=/var/temp/nginx/uwsgi \
--http-scgi-temp-path=/var/temp/nginx/scgi
prefix是nginx的安装目录路径。临时文件目录为/var/temp/nginx,需要在/var下创建temp及nginx目录。

(4)编译安装:

make
make install
(5)启动、停止、重新加载配置文件:

cd /usr/local/nginx/sbin
./nginx //启动
./nginx -s stop //快速停止,强制kill进程
./nginx -s quit //完整停止,待nginx进程处理完任务后进行停止
./nginx -s reload //重新加载配置文件
(7)测试:

安装启动成功后,访问虚拟机上的nginx,可以看到"Welcome to nginx!"的界面:

 

3、在Ubuntu上安装:

(1)按照正常软件的安装方式,直接通过如下命令进行安装:

$ sudo apt-get install nginx

安装完成即可,在/usr/sbin/目录下是nginx命令所在目录,在/etc/nginx/目录下是nginx所有的配置文件,用于配置nginx服务器以及负载均衡等信息。

(2)查看nginx进程是否启动:

$ ps -ef|grep nginx

nginx会自动根据当前主机的CPU的内核数目创建对应的进程数量(当前ubuntu主机是2核4线程配置)

 

备注:这里启动的服务进程其实是4个进程,因为nginx进程在启动的时候,会附带一个守护进程,用于保护正式进程不被异常终止;如果守护进程一旦返现nginx继承被终止了,会自动重启该进程。

守护进程一般会称为master进程,业务进程被称为worker进程

(3)启动nginx服务器命令:

$ nginx

 

(4)停止nginx服务命令:

和windows系统执行过程一样,两种停止方式

$ nginx -s stop

$ nginx -s quit

(5)重新启动加载:

同样也可以使用命令reopen和reload来重新启动nginx或者重新加载配合着文件。

 

4、在mac os上安装:

直接通过brew进行nginx的安装,或者下载tar.gz压缩包都是可以的。

直接通过brew进行安装:

brew install nginx

安装完成后,后续的命令操作,服务器的启动、进程查看、服务器的停止、服务器的重启已经文件加载命令都是一致的。