Nginx
一、前言
1.1 图片上传分析
传统方式:
在tomcat的webapp下建立一个Images文件夹,里面存放着上传的图片。通过浏览器访问当前的项目/images/图片名称,就可以访问此图片。这时图片的上传下载都能实现了。
但在互联网项目中会涉及到高并发的问题,此时就需要集群,传统方式就行不通了。
集群环境:
假设集群环境下需要2台服务器,每个服务器装上1个tomcat,将工程在每个服务器上部署一份,每个服务器下的webapp都有一个images文件夹存放上传的图片。2台服务器同时服务,需要一台负载均衡服务器,将请求平均分配到这2台服务器。当用户打开上传的功能时,假设tomcat1提供服务,此时图片(a.jpg)将会上传到tomcat1,上传成功后需要回显(再次发送请求),这时的请求可能会发送到tomcat2,而tomcat2下webapp的Images目录下没有a.jpg,导致404错误。
此时,我们可以专门准备1台服务器(FastDFS)用来存放图片,不管是tomcat1还是tomcat2服务,只要是上传图片,都把图片保存到图片服务器上的images目录下。当访问该图片时,需要通过http方式来访问,此时需要再装上1个http服务器。http服务器有tomcat、Apache、nginx,而tomcat的强项是处理jsp,作为servlet的容器,访问静态资源并不是tomcat的强项,并且tomcat的并发量大概只有500。我们需要1台比tomcat性能好的http服务器,它不需要解析jsp,仅仅用来访问静态资源即可,nginx就很适合了。
1.2 什么是nginx
Nginx是一款高性能的http 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器。由俄罗斯的程序设计师Igor Sysoev所开发,官方测试nginx能够支支撑5万并发链接,并且cpu、内存等资源消耗却非常低,运行非常稳定。
1.3 niginx的应用场景
-
http服务器。Nginx是一个http服务可以独立提供http服务。可以做网页静态服务器。
-
虚拟主机。可以实现在一台服务器虚拟出多个网站。例如个人网站使用的虚拟主机。
-
反向代理,负载均衡。当网站的访问量达到一定程度后,单台服务器不能满足用户的请求时,需要用多台服务器集群,可以使用nginx做反向代理。并且多台服务器可以平均分担负载,不会因为某台服务器负载高宕机而某台服务器闲置的情况。
二、Nginx的安装
官方网站:http://nginx.org/
2.1 要求的安装环境
1、需要安装gcc的环境。
命令:yum install gcc-c++
2、需要第三方的开发包。
■ PCRE
PCRE(Perl Compatible Regular Expressions)是一个Perl库,包括 perl 兼容的正则表达式库。nginx的http模块使用pcre来解析正则表达式,所以需要在linux上安装pcre库。
命令:yum install -y pcre pcre-devel
■ zlib
zlib库提供了很多种压缩和解压缩的方式,nginx使用zlib对http包的内容进行gzip,所以需要在linux上安装zlib库。
命令:yum install -y zlib zlib-devel
■ openssl
OpenSSL 是一个强大的安全套接字层密码库,囊括主要的密码算法、常用的密钥和证书封装管理功能及SSL协议,并提供丰富的应用程序供测试或其它目的使用。
nginx不仅支持http协议,还支持https(即在ssl协议上传输http),所以需要在linux安装openssl库。
命令:yum install -y openssl openssl-devel
2.2 安装步骤
第一步:把nginx的源码包上传到linux系统
第二步:解压缩:tar zxf nginx-1.8.0.tar.gz
第三步:在nginx的目录下使用configure命令创建一makeFile文件。(默认没有makeFile文件)
./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
注意:启动nginx之前,上边将临时文件目录指定为/var/temp/nginx,需要在/var下创建temp及nginx目录
Linux命令:mkdir /var/temp/nginx/client -p
第四步:make
第五步:make install
安装完成后的文件夹结构为:
2.3 启动nginx
第一步:启动sbin目录下的nginx文件
第二步:查看nginx是否启动成功(查看进程)
nginx的其他命令:
关闭nginx:
[root@localhost sbin]# ./nginx -s stop
推荐使用:[root@localhost sbin]# ./nginx -s quit
重启nginx:
方式1:先关闭后启动
方式2:[root@localhost sbin]# ./nginx -s reload (推荐)
2.4 访问nginx
默认是80端口。
注意:是否关闭防火墙。
三、配置虚拟主机
在一台服务器上启动多个网站。
3.1 通过端口号区分不同虚拟机
修改Nginx的配置文件:/usr/local/nginx/conf/nginx.conf
(使用Notepad++的ftp插件连接Linux系统来修改,插件的使用教程:NppFTP小插件的使用)
添加虚拟主机:
重新加载配置文件:
[root@localhost nginx]# sbin/nginx -s reload
访问默认80端口:
访问81端口:
3.2 通过域名区分不同虚拟机
【什么是域名】
域名就是网站。比如:www.baidu.com www.taobao.com
● 一级域名: Baidu.com Taobao.com
● 二级域名:www.baidu.com www.taobao.com
● 三级域名:image.baidu.com Aaa.image.baidu.com
一个域名对应一个ip地址,一个ip地址可以被多个域名绑定
Dns服务器:把域名解析为ip地址。保存的就是域名和ip的映射关系。
本地测试可以修改hosts文件。
方式一:修改window的hosts文件:(C:\Windows\System32\drivers\etc)
方式二:使用SwitchHost来管理hosts文件
** 注意:如果hosts文件中配置了域名和ip的对应关系,不需要走dns服务器。
【Nginx的配置】
四、反向代理
4.1 什么是反向代理?
● 正向代理
举个例子:
我是一个用户,我访问不了某网站,但是我能访问一个代理服务器,这个代理服务器呢,他能访问那个我不能访问的网站,于是我先连上代理服务器,告诉他我需要那个无法访问网站的内容,代理服务器去取回来,然后返回给我。从网站的角度,只在代理服务器来取内容的时候有一次记录,有时候并不知道是用户的请求,也隐藏了用户的资料,这取决于代理告不告诉网站。
再举一个例子:
把整个流程比如成去饭店吃饭,我们也就是用户(客户端)去饭店吃饭(发送一个请求),你知道你要吃的是鱼香肉丝(请求),可是你不能自己做,那么就需要让大厨(服务端)给你做 ,可是去了饭店,大厨是在后台的,你也不能直接去告诉大厨,因为你没有权限(服务端在后台)这时候就需要服务员(代理)来帮忙告诉说某某某客户(客户端)要一盘鱼香肉丝(请求/访问资源)大厨(服务端)收到给做好然后交给服务员(代理)服务员拿到鱼香肉丝(资源/响应)给客户(用户端)送回来。
正向代理最大的特点是客户端非常明确要访问的服务器地址;服务器只清楚请求来自哪个代理服务器,而不清楚来自哪个具体的客户端;正向代理模式屏蔽或者隐藏了真实客户端信息。
● 反向代理
举个例子:
我们(客户端)今天要在你饭店吃一个大闸蟹(请求),服务员(代理)收到这个请求发现大厨做不了这个大闸蟹,可是又需要挣钱,这怎么办呢?服务员这么一想,隔壁那家饭店可以做,而我也和那家大厨(另一个服务端)有交集,那我去让另一家大厨给做怎么样?好。于是服务员就去告诉另一家大厨说你帮我做一个大闸蟹(请求)吧,隔壁大厨说好呀,可以。就做好交给服务员。那么这个时候,这个服务员(反向代理)就成为了反向代理,因为他去调用别的服务端。这个时候我们(客户端)通常来说是没必要知道这大闸蟹怎么来的,只要有就好。
注意:
那这个服务员是谁都可以当的吗?肯定不可以呀,所以这个服务员(代理)需要在饭店任职(配置)之后才可以。也就是代理需要配置。
那么反向代理需要吗?答案是不需要的。
那么反向代理的优点就体现出来了,我不需要配置,而且我不仅只能在一家调用请求,我可以向多个服务端去发出请求。而且反向代理还可以向多台后端服务器进行负载平衡。
4.2 Nginx实现反向代理
两个域名指向同一台nginx服务器,用户访问不同的域名显示不同的网页内容。
两个域名是www.sian.com.cn和www.sohu.com
nginx服务器使用虚拟机192.168.66.128
实现步骤:
第一步:安装两个tomcat,分别运行在8080和8081端口。
● 安装tomcat-sina和tomcat-sohu
● 修改tomcat-sina的端口号为8081
第二步:启动两个tomcat。
第三步:配置反向代理服务器
第四步:重新加载nginx配置文件
第五步:在hosts文件中添加域名和ip的映射关系
五、负载均衡
5.1 什么是负载均衡?
由于目前现有网络的各个核心部分随着业务量的提高,访问量和数据流量的快速增长,其处理能力和计算强度也相应地增大,使得单一的服务器设备根本无法承担。在此情况下,如果扔掉现有设备去做大量的硬件升级,这样将造成现有资源的浪费,而且如果再面临下一次业务量的提升时,这又将导致再一次硬件升级的高额成本投入,甚至性能再卓越的设备也不能满足当前业务量增长的需求。 为了避免服务器崩溃,让用户有更好地体验,我们通常通过负载均衡的方式来分担服务器的压力。
那么什么是负载均衡呢?我们通过建立很多个服务器,把这些服务器组成一个服务器集群,然后,当用户访问我们网站的时候,先访问一个中间服务器,再让这个中间服务器在服务器集群中选择一个压力较小的服务器,然后将该访问请求引入该选择的服务器。这样,用户的每次访问,都会保证服务器集群中的每个服务器的压力趋于平衡,分担了服务器压力,避免了服务器崩溃的情况。负载均衡就是采用反向代理的思想。
5.2 Nginx实现负载均衡
假设sina有2台服务器(192.168.66.128:8081和192.168.66.128:8082)同时提供同样的服务,也就是集群,这2台服务器便实现了主备关系,1台服务器挂了,还有另外1台。那怎样才能让2台服务器同时做这个事呢?这时就要用到负载均衡。要实现负载均衡很容易,只要在upstream sina{}再加一台服务器即可。
实现步骤:
第一步:复制一台tomcat命名为tomcat-sina2(cp -r apache-tomcat-7.0.57 tomcat-sina2)
第二步:修改tomcat-sina2的端口号(vim tomcat-sina2/conf/server.xml)
第三步:修改tomcat-sina2/webapps/ROOT/index.jsp,以便测试时方便区分
第四步:启动tomcat-sina2
第五步:将请求转发给服务集群,实现负载均衡
第六步:重新加载nginx配置文件(./sbin/nginx -s reload)
第七步:测试,访问www.sina.com,效果为:2台服务器轮流响应,从而实现了负载均衡。
还可以根据服务器的实际情况调整服务器权重。权重越高分配的请求越多,权重越低,请求越少。默认是都是1
部分引用:https://blog.csdn.net/zhanghanboke/article/details/77488894