Nginx- 技术专题 - 技术介绍
Nginx 介绍
Nginx
是一个高性能的 HTTP
和反向代理 web
服务器,同时也提供了 IMAP/POP3/SMTP
服务。
Nginx
是由伊戈尔·赛索耶夫为俄罗斯访问量第二的 Rambler.ru
站点开发的,第一个公开版本 0.1.0
发布于 2004
年 10
月 4
日。
Nginx
特点是占有内存少,并发能力强。
事实上 nginx
的并发能力确实在同类型的网页服务器中表现较好,一般来说,如果我们在项目中引入了 Nginx
,我们的项目架构可能是这样:
这样的架构中 , Nginx
所代表的角色叫做负载均衡服务器或者反向代理服务器,所有请求首先到达 Nginx
上,再由 Nginx
根据提前配置好的转发规则,将客户端发来的请求转发到某个 Tomcat
上去。
那么这里涉及到两个概念:
负载均衡服务器
就是进行请求转发,降低某一个服务器的压力。负载均衡策略很多,也有很多层,对于一些大型网站基本上从 DNS
就开始负载均衡,负载均衡有硬件和软件之分,各自代表分别是 F5
和 Nginx
(目前 Nginx
已经被 F5
收购),早些年,也可以使用 Apache
来做负载均衡,但是效率不如 Nginx
,所以 现在主流方案是 Nginx
。
反向代理服务器
另一个概念是反向代理服务器,得先说正向代理,看下面一张图:
在这个过程中,Google 并不知道真正访问它的客户端是谁,它只知道这个中间服务器在访问它。因此,这里的代理,实际上是中间服务器代理了客户端,这种代理叫做正向代理。
那么什么是反向代理呢?看下面一张图:
在这个过程中,10086 这个号码相当于是一个代理,真正提供服务的,是话务员,但是对于客户来说,他不关心到底是哪一个话务员提供的服务,只需要记得 10086 这个号码就行了。
所有的请求打到 10086 上,再由 10086 将请求转发给某一个话务员去处理。因此,在这里,10086 就相当于是一个代理,只不过它代理的是话务员而不是客户端,这种代理称之为反向代理。
Nginx 优势
Nginx 有着非常广泛的使用,随便举几点:
Nginx 做静态资源服务器:Java 中的资源可以分为动态和静态,动态需要经过 Tomcat 解析之后,才能返回给浏览器,例如 JSP 页面、Freemarker 页面、控制器返回的 JSON 数据等,都算作动态资源,动态资源经过了 Tomcat 处理,速度必然降低。对于静态资源,例如图片、HTML、JS、CSS 等资源,这种资源可以不必经过 Tomcat 解析,当客户端请求这些资源时,之间将资源返回给客户端就行了。此时,可以使用 Nginx 搭建静态资源服务器,将静态资源直接返回给客户端。
Nginx 做负载均衡服务器,无论是使用 Dubbo 还是 Spirng Cloud ,除了使用各自自带的负载均衡策略之外,也都可以使用 Nginx 做负载均衡服务器。
支持高并发、内存消耗少、成本低廉、配置简单、运行稳定等。
Nginx 安装
由于基本上都是在 Linux 上使用 Nginx,因此松哥这里主要向大家展示 CentOS 7 安装 Nginx:
首先下载 Nginx
然后解压下载的目录,进入解压目录中,在编译安装之前,需要安装两个依赖:
然后开始编译安装:
装好之后,默认安装位置在 :
进入到该目录的 sbin
目录下,执行 nginx
即可启动 Nginx
:
Nginx 启动成功之后,在浏览器中直接访问 Nginx 地址:
看到如上页面,表示 Nginx 已经安装成功了。
如果修改了 Nginx 配置,则可以通过如下命令重新加载 Nginx 配置文件:
Nginx搭建静态资源web服务器
Nginx默认会访问index.html页面.
例如,如下图配置, 当访问http://172.16.204.5:90/时, 默认会访问安装目录下的mine_html目录中的index.html文件.
设置Nginx的gzip压缩:
Nginx支持访问文件树
效果如下(如果访问的url路径下有index.html, 默认还是会跳到index.html页面):
要达到上图中的效果,Nginx的配置文件需要添加如下设置:
添加上图中的配置后, 客户端访问http://172.16.204.5:90/时, 会以树的格式展示mine_html中的所有文件. 使用这种方式可以很好的共享静态资源.
在生产环境中
公网的带宽是有限的, 并发情况下各个客户端会争抢带宽资源, 为了防止访问大的静态资源对其他用户造成影响, 可以设置nginx响应的带宽. 例如如下图设置, nginx给客户端响应时会以每秒1k的速度响应.
Nginx缓存服务器上的静态文件
Nginx缓存的优点
如图所示,nginx缓存,可以在一定程度上,减少源服务器的处理请求压力。
因为静态文件(比如css,js, 图片)中,很多都是不经常更新的。nginx使用proxy_cache将用户的请求缓存到本地一个目录。下一个相同请求可以直接调取缓存文件,就不用去请求服务器了。
毕竟,IO密集型服务的处理是nginx的强项。
如何进行设置
先上个栗子:
因为我是在一台服务器上做试验,所以用了两个端口80
和90
进行模拟两台服务器之间的交互。
80
端口对接的是普通的域名(http://wangxiaokai.vip
)访问。
90
端口负责处理80
端口代理过来的资源访问。
相当于90
端口是源服务器,80
端口是nginx反向缓存代理服务器。
接下来讲一下配置项:
http层设置
proxy_connect_timeout
服务器连接的超时时间
proxy_read_timeout
连接成功后,等候后端服务器响应时间
proxy_send_timeout
后端服务器数据回传时间
proxy_buffer_size
缓冲区的大小
proxy_buffers
每个连接设置缓冲区的数量为number,每块缓冲区的大小为size
proxy_busy_buffers_size
开启缓冲响应的功能以后,在没有读到全部响应的情况下,写缓冲到达一定大小时,nginx一定会向客户端发送响应,直到缓冲小于此值。
proxy_temp_file_write_size
设置nginx每次写数据到临时文件的size(大小)限制
proxy_temp_path
从后端服务器接收的临时文件的存放路径
proxy_cache_path
设置缓存的路径和其他参数。被缓存的数据如果在inactive参数(当前为1天)指定的时间内未被访问,就会被从缓存中移除
server层设置
反向缓存代理服务器
proxy_pass
nginx缓存里拿不到资源,向该地址转发请求,拿到新的资源,并进行缓存
proxy_redirect
设置后端服务器“Location”响应头和“Refresh”响应头的替换文本
proxy_set_header
允许重新定义或者添加发往后端服务器的请求头
proxy_cache
指定用于页面缓存的共享内存,对应http层设置的keys_zone
proxy_cache_valid
为不同的响应状态码设置不同的缓存时间
expires
缓存时间
这里我设置了图片
、css
、js
静态资源进行缓存。
当用户输入http://wangxiaokai.vip
域名时,解析得到ip:port
的访问地址。port
默认为80。所以页面请求会被当前server截取到,进行请求处理。
当解析到上述文件名结尾的静态资源,会到缓存区获取静态资源。
如果获取到对应资源,则直接返回数据。
如果获取不到,则将请求转发给proxy_pass
指向的地址进行处理。
源服务器
这里直接处理90
端口接受到的请求,到服务器本地目录/mnt/blog
下抓取资源进行响应。
如何验证缓存是否有效
细心的读者应该发现,我在第二段栗子里,留了个彩蛋 add_header wall "hey!guys!give me a star."
。
add_header
是用于在报头设置自定义的信息。
所以,如果缓存有效的话,那么静态资源返回的报头,一定会带上这个信息。
访问http://wangxiaokai.vip
结果如下:
评论