Nginx(总结整理)

1. Nginx简介

Nginx ("engine x") 是一个高性能HTTP和反向代理服务器,也是一个 IMAP/POP3/SMTP 代理服务器。

其特点是占有内存少,并发能力强,能够支持高达50000个并发连接响应。这归功于它选择了epoll and kqueue作为开发模型(socket数量不限制)(Apache采用的select开发模型)。它处理请求是异步非阻塞,在高并发下保持低资源低消耗高性能。非常稳定,bug极少。Apache使用处理每个连接都需要一个进程,其并发性能不是很好。而Nginx使用多路复用的技术,让一个进程处理多个连接,所以并发性能比较好。可以说构建大型网站无一例外都是使用nginx,如:新浪、网易、腾讯、京东、淘宝等。

(1)Nginx是一个高性能的HTTP和方向代理服务器
(2)采用C语言编写
(3)支持的操作系统众多,windows、linux、MacOS X
(4)安全性高,外界只能访问nginx所在服务器,nginx将请求转发内部服务器。调用后,返回调用的结果
(5)可实现负载均衡
(6)Rewrite功能强大

电商、互联网架构大部分都采用Nginx+Tomcat的架构。

官网下载地址:http://nginx.org/en/download.html

中文文档路径:http://www.nginx.cn/doc/

1.1.  Nginx目录结构

Nginx(总结整理)_第1张图片

1.2.   Nginx配置文件

conf/nginx.conf

系统配置:server,可以配置多个server

转发规则:location路径、root目录、index欢迎页面

反向代理规则:location拦截路径、proxy_pass转向地址、index

1.3.   Nginx启动停止

我写了3个bat脚本,方便一键操作。

启动: start nginx.exe   (不能双击,双击后进程无法关掉)

停止: nginx.exe –s stop

重新加载:nginx.exe –s reload

验证安装是否成功: nginx.exe –t

1.4.   Nginx优化

部分常用优化如下:

user root; 

#对应系统哪个用户,最好专为nginx创建用户和组,并单独设置权限,这样安全。如:user nginx nginx。

worker_processes  1;  

#定义了nginx对外提供web服务时的worker进程数,习惯配置和当前服务器的core数(CPU内核数)相同,或者2倍。

worker_connections  1024; 

#设置可由一个worker进程同时打开的最大连接数。开启数为实际数量的1/4,浏览器访问时会自动发起2个;反向代理tomcat又是两个。这个数值和操作系统能打开的文件数。理论上并发数=worker_processes * worker_connections。跟物理内存大小也有关系,因为系统打开的文件数和系统的内存成正比。一般1GB内存可也打开大约10W左右。

worker_rlimit_nofile  65535; 

#定义了一个nginx进程打开最多的文件数目,配置和Linux下文件打开个数一致。ulimit–n来查看,最大设置为65535。设置为“auto”将尝试自动检测它。

keepalive_timeout  10; 

# 给客户端分配keep-alive链接超时时间,服务器将在这个超时时间过后关闭链接。我们将它设置低些可以让ngnix持续工作的时间更长。一般设置65左右。

open_file_cache  max=100000  inactive=20s; 

#打开缓存的同时也指定了缓存最大数目,以及缓存的时间。我们可以设置一个相对高的最大时间,这样我们可以在它们不活动超过20秒后清除掉。

gzip  on;

#告诉nginx采用gzip压缩的形式发送数据,这将会减少我们发送的数据量。

gzip_comp_level  4;

#设置数据的压缩等级。这个等级可以是1-9之间的任意数值,9是最慢但是压缩比最大的。通常设置为3-5,太高会占用CPU。

events { use  epoll; }

#设置用于复用客户端线程的轮询方法。Linux推荐使用epoll模型。

access_log  off; 

#access_log 设置nginx是否将存储访问日志。关闭这个选项可以让读取磁盘IO操作更快(aka,YOLO)。

error_log /var/log/nginx/error.log  crit; 

#error_log 告诉nginx只能记录严重的错误,Error日志优化,运行期间设置crit,可以减少I/O。


2. Nginx作用:反向代理

和日常我们上网不同,在公司我们上网时,不是所有电脑直接访问外网,而是访问一个代理服务器,由代理服务器再访问我们要访问的网站,代理服务器获得访问网站的返回信息后,再返回给我们。这种代理我们的电脑的方式叫做正向代理。

Nginx(总结整理)_第2张图片

而nginx不同,它实现也是代理,但是代理的后台服务器,我们访问nginx,而nginx代理后面的服务器,由它去决定具体访问哪台服务器。这种方式和正向代理刚好反过来,所以把这种方式称作反向代理。

反向代理的好处,它屏蔽了后台具体的服务器,我们访问者根本不知道访问的哪台服务器,这样使访问更加安全。

Nginx(总结整理)_第3张图片

通过前置机(也叫踏板机)将内网和外网隔离,用户只能访问前置机,其他的机器是无法直接访问内网中其他服务器资源,必须通过前置机中转,请求重定向才可以。这样保证了网络的安全。


3. 流行的Nginx部署结构(实现负载均衡)

Nginx(总结整理)_第4张图片

首先通过一个nginx进行转发到2个nginx上,然后再通过nginx进行负载到多个tomcat集群上。这样的结构优点是,防止单个节点压力过重。

也可以实现keepalive和HAProxy+nginx集群,实现nginx高可用。

3.1.  请求转发

举个例子,用自己的电脑当做服务器:

当用户访问 http://localhost:80nginx 将这个请求什么也不做,只负责转发到 tomcat 的访问地址 http://localhost:8080

server {
	listen       80;
	server_name  localhost;

	location / {                                #拦截所有的资源
		proxy_pass   http://127.0.0.1:8080;     #转向tomcat的地址
	}	
}

3.2.  动静分离

静态资源:图片、css、js、html(静态资源处理时并发非常高)

动态资源:asp/aspx、php、jsp

nginx默认配置:

location / {
	#相对路径,配置了一个html目录,我们可以将网站所用到的所有的静态资源从war中移除,放到这个目录下
	root   html; 
	#配置的欢迎页面
	index  index.html index.htm;		
}

传统将项目是把资源一起放到war中,而动静分离是把静态资源从war中剥离出来,单独放在一个目录中。

这样当访问静态资源时,就由nginx直接重定向文件资源。当访问动态资源就由tomcat解析。nginx解析静态比tomcat快很多。


4. 各个服务器(指向一个目录)

接着上面的例子,首先在C盘目录下找到hosts文件,C:\Windows\System32\drivers\etc\hosts,配置指向路径:

127.0.0.1    www.aaa.com
127.0.0.1    bbb.aaa.com
127.0.0.1    ccc.aaa.com

然后在nginx配置不同服务器:(例如图片服务器)

server {
	listen       80;
	server_name  bbb.aaa.com;		#域名地址,修改hosts文件做一个配置 bbb.aaa.com 127.0.0.1 
		
	location / {
            root d:\\images;		#图片文件所在目录,按日期来分目录:yyyy/mm/dd/uuid.jpg 或者当前时间的毫秒数+随机值.jpg
	}
}

目录:D:\images\2017\09\08\222.jpg

访问:http://bbb.aaa.com/images/2017/09/08/222.jpg


5. Nginx常见面试问题

5.1. 请解释一下什么是Nginx

Nginx是一个web服务器和方向代理服务器,用于HTTP、HTTPS、SMTP、POP3和IMAP协议。

5.2. 请列举Nginx的一些特性

Nginx服务器的特性包括:

(1)反向代理/L7负载均衡器
(2)嵌入式Perl解释器
(3)动态二进制升级
(4)可用于重新编写URL,具有非常好的PCRE支持

5.3. 请列举Nginx相对Apache 的优势

(1)nginx是轻量级的。同样起web 服务,比apache 占用更少的内存及资源。

(2)nginx抗并发能力强。nginx 处理请求是异步非阻塞的,在高并发下nginx 能保持低资源低消耗,而apache 则是阻塞型的。

(3)nginx是高性能高度模块化的设计,编写模块相对简单,而apache 的功能模块编写较复杂。

由于没有用过apache,只能百度总结下不同点,网上普遍说法是nginx 适合做静态,简单,效率高,而apache 适合做动态,稳定,功能强

5.4. 请解释Nginx如何处理HTTP请求

Nginx使用反应器模式。主事件循环等待操作系统发出准备事件的信号,这样数据就可以从套接字读取,在该实例中读取到缓冲区并进行处理。单个线程可以提供数万个并发连接。

5.5. 在Nginx中,如何使用未定义的服务器名称来阻止处理请求

只需将请求删除的服务器就可以定义为:

Server {

    listen  80;

    server_name  "" ;

    return  444;

}

这里,服务器名被保留为一个空字符串,它将在没有“主机”头字段的情况下匹配请求,而一个特殊的Nginx的非标准代码444被返回,从而终止连接。

5.6.  使用“反向代理服务器”的优点是什么

反向代理服务器可以隐藏源服务器的存在和特征。它充当互联网云和web服务器之间的中间层。这对于安全方面来说是很好的,特别是当您使用web托管服务时。



你可能感兴趣的:(Nginx)