Nginx (engine x) 是一款高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务。Nginx是由伊戈尔·赛索耶夫为俄罗斯访问量第二的Rambler.ru站点(俄文:Рамблер)开发的,第一个公开版本0.1.0发布于2004年10月4日。
其将源代码以类BSD许可证的形式发布,因它的稳定性、丰富的功能集、示例配置文件和低系统资源的消耗而闻名。
Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,其特点是占有内存少,并发能力强,中国大陆很多知名互联网公司均在使用nginx,例如淘宝、腾讯、京东、新浪、网易等。下面我们来介绍一下nginx原生的一些功能特性。
nginx的优势
- 高并发:官方测试能够支撑5万并发连接,在实际生产环境中能同时支撑到2-3万并发连接数
- 内存消耗少:每个进程平均消耗内存15M左右,在3万并发连接下,开启的10个nginx进程才消耗内存150M
- 配置文件非常简单:及其简单的命令配置
- 成本低廉:nginx为开源软件,可以免费使用。而购买F5 BIG-IP、NetScaler等硬件负载均衡交换机则需要十多万至几十万人民币
- 支持Rewrite重写规则:能够根据域名、URL的不同,将HTTP请求分到不同的后端服务器群组
- 内置的健康检查功能:Nginx自带健康检查功能,如果某台服务器宕机了,nginx自动挑选运行正常的服务
- 节省带宽:支持GZIP压缩,可以添加浏览器本地缓存的Header头
- 稳定性高:用于反向代理,宕机的概率微乎其微
- 模块化设计:模块可以动态编译,功能的扩展性非常的好
- 外围支持好:文档全,二次开发和模块较多
- 支持热部署:可以不停机重载配置文件
- 支持事件驱动、AIO(AsyncIO,异步IO)、mmap(Memory Map,内存映射)等性能优化
原生nginx功能
- 反向代理
反向代理是Nginx最重要、也是最常用的的功能,这也是nginx非常流行的原因。反向代理,“它代理的是服务端”,反向代理隐藏了真实服务端,客户端不能直接感知到。
-
基本原理:
nginx以代理服务器来接受外部的连接请求,然后将请求转发给内部服务器,并将内部服务器上得到的结果返回给外部请求连接的客户端,此时代理服务器对外就表现为一个反向代理服务器。
简言之,就是真实的服务资源不能直接被外部网络访问,所以需要一台代理服务器,用来代理的方式可以是代理服务器,也可以是代理端口。 -
目的:
保证内部服务的安全,通常将反向代理作为对外访问地址,Web服务器在内网运行。
均衡网络负担,就是我们平时所说的负载均衡(BL),通过反向代理服务器来优化网站的网络流量
- 负载均衡
负载均衡也是Nginx常用的一个功能,同时,负载均衡配置一般都需要同时配置反向代理,通过反向代理跳转到负载均衡。
- 基本原理:
负载均衡就是外部请求分摊到多个服务单元上处理,处理完成后再将结果返回代理,由代理再返回给客户端。
个人认为服务单元更准确一点,因为处理请求的对象可以是部署在同一台服务器上的多个服务、也可以是部署在不同服务器上的多个服务,而不是具体的服务器。
- 负载均衡策略
1). RR
每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。
配置代码样例
upstream webserver{
server 192.168.10.1:8080;
server 192.168.10.2:8080;
}
这里我配置了2个服务,如果其中一个服务坏掉了,会自动认跳转到另一个服务商处理请求,这是因为Nginx会自动判断服务器的状态,如果服务器处于不能访问(服务器挂了),就不会跳转到这台服务器,所以也避免了一台服务器挂了影响使用的情况,由于Nginx默认是RR策略,所以我们不需要其他更多的设置。
2). 权重
就是当请求发过来时,nginx根据服务的权重来决定将请求交给谁来处理,权重越大,获得请求处理的概率越大。比如我们有多台性能不同的服务器,那么我们就可以将更多的请求交给性能高的服务器处理,而将较少的请求交给性能差的服务器处理,这样配置有以下几个好处。
a. 充分利用服务器资源;
b. 在请求高峰时,能较好的分担请求流量。
配置代码样例
upstream webserver{
server 192.168.10.1:8080 weight=1;
server 192.168.10.2:8080 weight=9;
}
3). ip_hash
ip_hash就是为了解决有状态服务的问题
前面2种方式都有一个问题,假如我们有两个处理服务器,server1和server2,客户端前一个请求处理被分配到了server1, 下一个请求来的时候请求可能被分配到了server2,当我们的服务是无状态的时候能运行的很好,当服务是有状态的时候(例如我们需要保存用户的登录状态),这时候就不能正常运转了,比如把登录信息保存到了session中,那么跳转到另外一台服务器的时候就需要重新登录了,所以很多时候我们需要一个客户只访问一个服务器,那么就需要用iphash了,iphash的每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。
配置代码样例
upstream webserver{
ip_hash;
server 192.168.10.1:8080;
server 192.168.10.2:8080;
}
-http服务器(动静分离)
Nginx本身也是一个静态资源的服务器,当只有静态资源的时候,就可以使用Nginx来做服务器,同时现在也很流行动静分离,就可以通过Nginx来实现。
先来一段配置代码
server {
listen 8080; #监听端口
server_name 127.0.0.1; #监听地址
location / {
root /var/web/root; #根目录
index index.html; #设置默认页
}
}
这样如果访问http://127.0.0.1:8080 就会默认访问到/var/web/root目录下面的index.html,如果一个网站只是静态页面的话,那么就可以通过这种方式来实现部署。
动静分离
动静分离是让动态网站里的动态网页根据一定规则把不变的资源和经常变的资源区分开来,动静资源做好了拆分以后,我们就可以根据静态资源的特点将其做缓存操作,这就是网站静态化处理的核心思路
还是先给个代码:
upstream webserver{
server 192.168.10.1:8080;
server 192.168.10.1:8090 backup; #热备
}
#错误页
error_page 404 404.html;
server {
listen 8080; #监听端口
server_name 127.0.0.1; #监听地址
#请求的url过滤,正则匹配,~为区分大小写,~*为不区分大小写。
location \.(png|jpeg|jpg|css|js)$ {
root /var/web/root; #根目录
index index.html; #设置默认页
}
location \(jsp|do)$ {
proxy_pass http://webserver;
}
}
- 正向代理
正向代理,意思是一个位于客户端和原始服务器(origin server)之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),然后代理向原始服务器转交请求并将获得的内容返回给客户端。
简言之,正向代理就是内网服务器主动要去请求外网的地址或服务,所进行的一种行为。内网服务—访问—>外网
正向代理与反向代理的区别
正向代理:代理和客户端同属于一个局域网,隐藏了客户端信息;
反向代理:代理和服务端同属于一个局域网,隐藏了服务端信息;