分布式专题(3)- Nginx
- 什么是Nginx?
- 为什么选择Nginx?
- 它和 Tomcat 有什么区别?
- 怎么用Nginx?
上面这几个问题,是每个刚接触Nginx的人都想知道的。一开始也是根据上面的问题去找对应的答案,但找到的答案里面质量是参差不齐、感觉说得都不是很通俗易懂,没有那种看完就豁然开朗的感觉,所以关于Nginx的内容暂时还没有特别推荐的文章。这里小兵综合自己的理解和使用情况,在分布式专题里总结一篇关于Nginx的内容。全文看完,答案自然也就知道了。
什么是Nginx?
总结一句话,就是:
Nginx是一款轻量级的Web 服务器。也可以用作做反向代理、负载均衡、动静分离和 HTTP缓存。
从这句话我们可以得出Nginx的基本定位是Web服务器,然后Nginx还提供反向代理、负载均衡、动静分离、HTTP缓存的功能。
什么是Web服务器?
Web服务器是指驻留于因特网上某种类型计算机的程序,是可以向发出请求的浏览器提供文档的程序。当Web浏览器(客户端)连到Web服务器上并发送请求时,Web服务器将处理该请求并将文件反馈到该浏览器上,附带的信息会告诉浏览器如何查看该文件(即文件类型)。Web服务器使用HTPP协议与客户机浏览器进行信息交流,这就是人们常把它们称为HTTP服务器的原因。Nginx最基本的功能便是作为Web服务器。目前最主流的三个Web服务器是Apache、 Nginx 、IIS。常用的还有Tomcat、WebLogic、JBoss、Jetty、Netty等。下面简单介绍下几个主流开源的Web服务器:
- Apache是目前市场占用量最高的web服务器,据最新数据统计,市场占有率目前是50%左右。主要优势在于一个是比较早出现的一个Http静态资源服务器,可以作为Web服务器使用,用于处理静态网页,比如HTML、图片、视频、音频等静态文件,Apache稳定性良好,支持的模块丰富。但是其不适宜高并发的请求。
- Nginx是俄罗斯人编写的一款高性能的HTTP和反向代理服务器,在高连接并发的情况下,它能够支持高达50000个并发连接数的响应,但是内存、CPU等系统资源消耗却很低,运行很稳定。目前Nginx在国内很多大型企业都有应用,据最新统计,Nginx的市场占有率已经到33%左右了。虽然Apache的市场占有率虽然仍然是最高的,但是是呈下降趋势。而Nginx的势头很明显。在Nginx的基础上,淘宝还搞出了一个Web服务器Tengine。相信大公司的眼光是不会差的。
- Tomcat是Apache的拓展,更实质的说是Java应用服务器。它主要用于解析servlet/JSP,能够动态地生成资源,同时具备HTTP服务。Tomcat根据请求将动态的内容转化为静态的内容之后,通过 HTTP Server 分发到客户端,对静态页的支持效率就没有Apache高。单纯的Tomcat性能有限,在很多地方表现有欠缺,如活动连接支持、静态内容、大文件和HTTPS等。因此大多数公司都是Tomcat配合Apache或者Nginx一起使用。
为什么选择Nginx?
选择Nginx的理由也很简单:
- 第一,它可以支持每秒5W高并发连接;
- 第二,内存消耗少;
- 第三,成本低,如果采用F5、NetScaler等硬件负载均衡设备的话,需要大几十万。而Nginx是开源的,可以免费使用并且能用于商业用途
下面,我们先把Nginx下载回来,结合实例,一起来认识和理解“Nginx是一款轻量级的Web 服务器。也可以用作做反向代理、负载均衡、动静分离和 HTTP缓存。”的含义。
Nginx安装
(以下安装步骤基于CentOS 7.x)
一、安装编译工具及库文件
yum -y install make gcc gcc-c++ libtool zlib zlib-devel openssl openssl-devel
二、安装 PCRE
2.1 下载pcre,下载完成后解压:
[aaa@qq.com_0_10_centos ~]# cd /usr/local/src/
[aaa@qq.com_0_10_centos src]# wget http://downloads.sourceforge.net/project/pcre/pcre/8.35/pcre-8.35.tar.gz
[aaa@qq.com_0_10_centos src]# tar zxvf pcre-8.35.tar.gz
2.2 解压后进入目录并编译安装:
[aaa@qq.com_0_10_centos src]# cd pcre-8.35/
[aaa@qq.com_0_10_centos pcre-8.35]# ./configure
[aaa@qq.com_0_10_centos pcre-8.35]# make && make install
2.3 查看pcre版本,出现版本号即安装pcre成功
[aaa@qq.com_0_10_centos pcre-8.35]# pcre-config --version
8.35
三、安装 Nginx
3.1 下载nginx,下载完成后解压:
[aaa@qq.com_0_10_centos ~]# cd /usr/local/src/
[aaa@qq.com_0_10_centos src]# wget http://nginx.org/download/nginx-1.6.2.tar.gz
[aaa@qq.com_0_10_centos src]# tar zxvf nginx-1.6.2.tar.gz
3.2 解压后进入目录并编译安装:
[aaa@qq.com_0_10_centos src]# cd nginx-1.6.2/
[aaa@qq.com_0_10_centos nginx-1.6.2]# ./configure
[aaa@qq.com_0_10_centos nginx-1.6.2]# make && make install
2.3 查看nginx版本,出现版本号即安装nginx成功。(默认安装在/usr/local/nginx)
[aaa@qq.com_0_10_centos nginx-1.6.2]# cd /usr/local/nginx/sbin/
[aaa@qq.com_0_10_centos sbin]# ./nginx -v
nginx version: nginx/1.6.2
2.4 启动并访问
[aaa@qq.com_0_10_centos sbin]# ./nginx
nginx默认监听的是80端口,所以在客户端(浏览器)输入服务器ip即可访问nginx。
nginx相关命令:
/usr/local/nginx/sbin/nginx -t # 检查配置文件语法
/usr/local/nginx/sbin/nginx -c #指定nginx.conf的文件。不指定时默认为NGINX_HOME/conf/nginx.conf
/usr/local/nginx/sbin/nginx -s reload # 重新载入配置文件
/usr/local/nginx/sbin/nginx -s reopen # 重启 Nginx
/usr/local/nginx/sbin/nginx -s stop # 停止 Nginx
Nginx配置文件
我们说“Nginx是一款轻量级的Web 服务器。也可以用作做反向代理、负载均衡、动静分离和 HTTP缓存”。Nginx能提供这些功能,都是通过配置nginx.conf文件来实现,所以这个配置文件的重要性可想而知。我们查看 conf/nginx.conf 文件,去除注释后得默认配置如下。可以看到nginx的核心配置可以是很简洁的,最主要包括三个模块:main、 events 、 http。每个模块都可以根据自己的需要进行相应的配置,我们也可以添加自己的模块。本篇对配置文件不做过多介绍,可参考nginx.conf配置文件解析。
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;sendfile on;
keepalive_timeout 65;server {
listen 80;
server_name localhost;location / {
root html;
index index.html index.htm;
}error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
Nginx用做Web服务器
Nginx默认就是当作Web服务器来使用,我们能访问到Nginx的默认首页,就是Nginx作为Web服务器给浏览器响应返回了配置文件 nginx.conf 中配置的 html目录下的index.html 文件。
为了方便介绍Nginx的功能,我们搞一个自己的静态页面“偷宝网”,内容如下。
然后我们把这个偷宝网放到nginx中,配置nginx.conf,让其作为首页。
然后检查配置是否正确,并重新加载配置文件:
[aaa@qq.com_0_10_centos sbin]# /usr/local/nginx/sbin/nginx -t
[aaa@qq.com_0_10_centos sbin]# /usr/local/nginx/sbin/nginx -s reload
然后重新访问:
可以看到我们的静态页面已经部署在了nginx中。我们说的“Nginx是一款轻量级的Web 服务器。也可以用作做反向代理、负载均衡、动静分离和 HTTP缓存。”,所以Nginx是一款轻量级的Web 服务器也就不难理解了。
Nginx用做反向代理
什么是反向代理?什么是正向代理?二者有何区别?找资料时经常可以看到说:
正向代理的代理对象是客户端,反向代理的代理对象是服务端。
但光凭这一句话肯定是理解不了的,不理解的事情,我们就很容易忘记。在学习新知识时,我们对一些新接触的概念得有自己的理解,争取能用自己的话把自己的理解说出来,多思考多总结才有助于我们理解,只有理解了才便于我们的记忆。在工作中接到一项任务时也是,你得有自己的理解,按照自己的理解是要怎么做,能不能做,需要什么支援,有什么风险,大概需要多少时间,你都得做到心里有数,都要及时沟通及时纠正,这样你才能让人放心把事情交给你做,你慢慢地才能成长。说绝大部分工作问题,不来自于技能本身,而来自于沟通,还是很有道理的。关于如何学习与认知,这里强烈推荐咱们*的《实践论》和《矛盾论》,伟人随手的两篇文章就如此惊艳不已,让人拜服。好像又写偏了,回到正文,下面我们举例说明什么是正向代理和反向代理,然后再看Nginx是如何实现反向代理的。
正向代理
举个例子,A同学想去找马云爸爸借钱,可想而知,最后被保安打出来了。然后A同学经过打听知道他的老师王老师是马云的同学,于是A同学找到王老师,托王老师帮忙去马云那借500万过来,当然最后事成了。不过马云并不知道这钱是A同学借的,马云是借给王老师的,最后由王老师转交给A同学。这里的王老师在这个过程中扮演了一个非常关键的角色,就是代理,也可以说是正向代理,王老师代替A同学办这件事,这个过程中,马云(服务端)不知道真正借钱的人(客户端)是谁,这点非常关键。
再举个例子,如今的网络环境下,如果我们有需要去访问国外的某些网站,此时你会发现位于国外的某网站我们通过浏览器是没有办法访问的,此时大家可能都会连接一个VPN后进行访问,VPN的方式主要是找到一个可以访问国外网站的代理服务器,我们将请求发送给代理服务器,代理服务器去访问国外的网站,然后将访问到的数据传回给我们。
上述这样的代理模式称为正向代理.
正向代理总结:客户端非常明确要访问的服务器地址;服务器只清楚请求来自哪个代理服务器,而不清楚来自哪个具体的客户端;正向代理模式隐藏了真实客户端信息,所以说正向代理的代理对象是客户端。
反向代理
举个栗子,我们很多人都用过淘宝,要知道每天同时连接到淘宝网站的访问人数已经爆表,单个服务器远远不能满足人民日益增长的购买欲望了,此时就出现了一个大家耳熟能详的名词:分布式部署;也就是通过部署多台服务器来解决访问人数限制的问题;淘宝网站中大部分功能也是直接使用nginx进行反向代理实现的。如下图:
上图表示的是全国各地的用户在淘宝客户端发出请求,经过了Nginx 反向代理服务器,nginx服务器接收到之后,按照一定的规则分发给了后端的业务处理服务器进行处理。此时请求的来源也就是客户端是明确的,但是请求具体是由哪台服务器处理的并不明确。Nginx扮演的就是一个反向代理角色。
反向代理隐藏了真实的服务端,再如我们访问 www.baidu.com 的时候,背后可能有成千上万台服务器为我们服务,但具体是哪一台,你不知道,也不需要知道,你只需要知道反向代理服务器是谁就好了,www.baidu.com 就是我们的反向代理服务器,反向代理服务器会帮我们把请求转发到提供真实计算的服务器那里去。Nginx 就是性能非常好的反向代理服务器。
反向代理总结:代理服务器根据客户端的请求,从其关联的一组或多组后端服务器上获取资源,然后再将这些资源返回给客户端;客户端只会得知反向代理的IP地址,而不知道真正提供服务的服务器地址。反向代理隐藏了服务器的信息,所以说反向代理的代理对象是服务端。
所以正向代理和反向代理一起使用就会像下图这样:
所以还是得出:
正向代理的代理对象是客户端,即正向代理隐藏了客户端的信息,代替客户端去向服务器请求资源;
反向代理的代理对象是服务端,即反向代理隐藏了服务端的信息,代替服务端向客户端返回资源。
然后我们看看Nginx是怎么实现的反向代理。
既然要实现反向代理,那首先要有需要代理的服务端,所以我们先建一个基本的springboot项目,打成war包,发布到8080端口。
反向代理的作用
加密和SSL加速
负载均衡
缓存静态内容
压缩
减速上传
安全防火墙
外网发布
突破互联网*
解决跨域问题
Nginx用做负载均衡
待补充
Nginx用做动静分离
待补充
Nginx用做Http缓存
待补充
Nginx原理简介
待补充
上一篇: (二)Redis投票应用