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:WindowsSystem32driversetc)

     方式二:使用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 

 

原文地址:https://www.cnblogs.com/yft-javaNotes/p/10025648.html