Nginx服务器的安装与反向代理负载均衡

Nginx服务器

一:什么是Nginx?

我们生活的世界中,有的时候需要上网。我们可以浏览很多很多的网页,这些网页都是由一系列的程序组成,但是我们是否想过,这些程序存储在什么地方呢?没错,这些程序都是存储在一种名叫服务器的硬件上,比如我们的电脑也是一种服务器,只不过我们的个人电脑作为服务器的话性能会比较低。我们的网页程序存储在服务器硬件上,是否可以随意存储呢?不是的,我们需要在服务器硬件的操作系统中搭建一个服务器软件,那么这样,有服务器软件跟服务器硬件配合,才形成一个完整的服务器。服务器软件有非常多,比如Apache、tomcat等等都是服务器软件,而我们今天要学习的Nginx也是一种服务器软件之一。

Nginx是一种服务器软件,故而其最主要、最基本的功能当然是可以与服务器硬件结合,让程序员可以将程序放在Nginx服务器上,将程序发布出去,让成千上万的网民可以浏览。除此之外,Nginx是一种高性能的HTTP和反向代理服务器,同时也是一个代理邮件服务器。也就是说,我们Nginx上可以发布网站,也可以实现负载均衡的功能,还可以作为邮件服务器实现收发邮件等功能。所谓的负载均衡是指,当同时有N多用户访问我们服务器的时候,为了减少服务器压力,我们需要将用户分别引入各服务器,分担服务器的压力。

Nginx与其他服努器的性能比较

首先说IIS, IIS服务器只能在Windows上运行,Windows服务器性能不如Linux— 类服务器。其次说Tomcat,Tomcat服务器面向的是Java语言,是一种重量级的服 务器,而Nginx是轻量级服务器,Tomcat与Nginx不具备可比性。最后,我们讲一 下Apache,Apache优点非常多,比如稳定、幵源、跨平台等等,但是Apache不支 持高并发。Nginx能支持处理百万级的TCP连接,10万以上的并发连接,并且是一 个很好的跨平台服务器。

Nginx的主要优点有可以实现高并发、部署简单、内存消耗少、成本低等等。

Nginx的主要缺点有rewrite功能不够强大,模块没有Apache的多。

二:如何在Linux中搭建Nginx服务器?

先不要创建/usr/local/nginx目录,因为安装成功后会自动创建。

在Linux终端输入命令行的主要步骤:

下载
wget http://nginx.org/download/nginx-1.14.0.tar.gz
解压
tar -zxvf nginx-1.14.0.tar.gz
安装
./configure

如果安装错误,提示需要其它环境,请参考下面

安装 make

yum -y install gcc automake autoconf libtool make

安装 g++

yum install gcc gcc-c++

安装 PCRE库

yum -y install pcre pcre-devel

安装 Zlib

yum -y install zlib zlib-devel

如果./configure安装成功,只需要再执行两个命令:

make
make install

查看是否安装成功

cd /usr/local/nginx

如果安装成功,则会出现下列目录:

conf  html  logs  sbin

切换到sbin目录

cd /sbin

启动程序

./nginx

常见的错误

在Linux操作系统下搭建Nginx服务器,很多时候会出现不同的错误,在此,我们对搭建过程中出现的错误进行一些总结。主要有这些类型:

防火墙问题,缺少gc++,缺少pcre、zlib等库。

三:Nginx的反向代理和负载均衡

什么是反向代理

我们有时候,用自己的计算机A想访问国外的某个网站B,但是访问不了,此时,有一台中间服务器C可以访问国外的网站B,那么,我们可以用自己的电脑访问服务器C,通过C来访问B这个网站。那么这个时候,服务器C称为代理服务器,这种访问方式叫做正向代理。正向代理有一个特点,就是我们明确知道要访问哪个网站。再如,当我们有一个服务器集中,并且服务器集群中的每台服务器的内容一样的时候,同样我们要直接从个人电脑访问到服务器集中的服务器的时候无法访问,且此时第三方服务器能访问集群,这个时候,我扪通过第三方服务器访问服务器集群的内容,但是此吋我们并不知道是哪一台服务器提供的内容,此时的代理方式称为反向代理。

正向代理

反向代理

什么是负载均衡

当一台服务器的单位时间内的访问量越大的时候,服务器的压力会越大。当一台服务器压力大得超过自身的承受能力的时候,服务器会崩溃。为了避免服务器崩溃,让用户有更好地体验,我们通常通过负载均衡的方式来分担服务器的压力。那么什么是负载均衡呢?是这样,我们可以建立很多很多个服务器,这些服务器组成一个服务器集群,然后,当用户访问我们网站的时候,先访问一个中间服务器,再让这个中间服务器在服务器集群中选择一个压力较小的服务器,然后将该访问请求引入该选择的服务器。这样,用户的每次访问,都会保证服务器集群中的每个服务器的压力趋于平衡,分担了服务器压力,避免了服务器崩溃的情况。

基于反向代理的原理实现负载均衡

四:Nginx负载均衡的实现

Nginx 是一款可以通过反向代理实现负载均衡的服务器,使用 Nginx 服务实现负载均衡的时候,用户的访问首先会访问到 Nginx 服务器,然后 Nginx 服务器再从服务器集群表中选择压力较小的服务器,然后将该访问请求引向该服务器。若服务器集群中的某个服务器崩溃,那么从待选服务器列表中将该服务器删除,也就是说一个服务器假如崩溃了,那么 Nginx 就肯定不会将访问请求引入该服务器了。那么下面,我们通过实例来讲解一下 Nginx 负载均衡的实现。

负载均衡配置文件

默认配置文件nginx.conf 很重要,我们一般是新建一个配置文件,在启动时指定加载。

[root@yueshutong conf]# ls  //查看目录
fastcgi.conf            koi-win             scgi_params
fastcgi.conf.default    mime.types          scgi_params.default
fastcgi_params          mime.types.default  uwsgi_params
fastcgi_params.default  nginx.conf          uwsgi_params.default
koi-utf                 nginx.conf.default  win-utf
[root@yueshutong conf]# touch fzjh.conf  //新建负载均衡配置文件

编辑fzjh.conf配置文件

vi fzjh.conf
worker_processes  1;#工作进程的个数,一般与计算机的cpu核数一致  
  
events {  
    worker_connections  1024;#单个进程最大连接数(最大连接数=连接数*进程数) 并发 
}  
  
http {  
    include       mime.types; #文件扩展名与文件类型映射表  
    default_type  application/octet-stream;#默认文件类型  
  
    sendfile        on;#开启高效文件传输模式,sendfile指令指定nginx是否调用sendfile函数来输出文件,对于普通应用设为 on,如果用来进行下载等应用磁盘IO重负载应用,可设置为off,以平衡磁盘与网络I/O处理速度,降低系统的负载。注意:如果图片显示不正常把这个改成off。  
      
    keepalive_timeout  65; #长连接超时时间,单位是秒  
  
    gzip  on;#启用Gizp压缩  
      
    #服务器的集群  
    upstream  myproject {  #服务器集群名字   
        server    220.181.111.188:80  weight=1;#服务器配置   weight是权重的意思,权重越大,分配的概率越大。  
        server    42.121.252.58:80  weight=2;  
    }     
  
    #当前的Nginx的配置  
    server {  
        listen       80;  #监听80端口,可以改成其他端口  
        server_name  localhost; ##############   当前服务的域名  
  
        location / {  ##配置路径/下实现负载均衡
            proxy_pass http://myproject;  ##对应哪个服务器集群
            proxy_redirect default;  
        }  
          
        error_page   500 502 503 504  /50x.html;  
        location = /50x.html {  
           root   html;  #根目录
        }  
    }  
}  

我们在nginx目录下执行命令,启动负载均衡

./sbin/nginx -c ./conf/fzjh.conf

然后尝试访问你的服务器,多访问几次,你会发现它会访问2次csdn网站,1次百度。说明我们的负载均衡已经部署完毕。

如何关闭Nginx服务器

1.查看nginx进程号

ps -ef|grep nginx

2.kill掉进程即可 (1709是第二列的进程号)

kill 1709

或者

killall -9 nginx

五:HTTP Upstream 模块

1.ip_hash指令

什么是 HTTP Upstream 模块

Upstream 模块是 Nginx 服务器的一个重要模块。 Upstream 模块实现在轮询和客户端 iP 之间实现后端的负载均衡。常用的指令有 ip_hash指令、 server 指令和 upstream 指令等,下面我们分别来讲一下。

Http Upstream模块- ip_hash指令

在负载均衡系统中,假如用户在某台服务器上登录,那么如果该用户第二次请求的时候,因为我们是负载均衡系统,每次请求都会重新定位到服务器集群中的一个服务器,那么此时如果将已经登录服务器A的用户再定位到其他服务器,显然不妥。故而,我们可以采用 ip_hash指令解决这个问题,如果客户端请求已经访问了服务器A并登录,那么第二次请求的时候,会将该请求通过哈希算法自动定位到该后端服务器中。下面我们通过实例讲解。

实例

此时不应该使用weight权重。

  
http {  
     ....
    upstream  myproject {    
        ip_hash; #实现会话跟踪
        server 140.205.140.234;
        server 61.135.169.125;

    }     
   ....
} 

Http Upstream 模块一 upstream 指令及相关变量

upstream 指令主要是用于设置一组可以在 proxy_pass 和 fastcgi_pass 指令中使用代理服务器,默认负载均衡方式为轮询。

六:其他负载均衡实现方式

负载均衡的实现方法除了可以使用 Nginx服务器实现外,还可以通过很多种方法来实现。负载均衡的核心就是建立一个服务器集群,然后用户首先访问到第三方代理服务器,然后由代理服务器选择一个集群中的服务器,然后将请求引入选定的服务器。那么代理服务器可以使用多种方式来充当,故而实现负载均衡的方式也是多种。总的来说,负载均衡实现的方式分为软件实现和硬件实现两种,如果中间的代理机构是硬件,那么就是通过硬件设备来实现负载均衡的方式,如果中间的代理机构为软件,就是软件实现负载均衡的方式。而其中,软件又可以是服务器软件、系统软件以及应用软件等充当。

负载均衡实现方式小结

下面我们简单总结一下负载均衡不同实现方式的优缺点:

假如使用硬件的方式实现负载均衡,那么中间的转发机构就是硬件,这个时候运行的效率非常高,但是对应的成本也非常高。如果我们采用软件的方式来实现负载均衡,那么中间的转发机构就是软件,这个时候,运行效率不如硬件,但是成本相对来说低得多。而使用Nginx服务器实现负载均衡,那么就是通过软件的方式来实现负载均衡,并且 Nginx本身支持高并发等。故而使用 Nginx服务器实现负载均衡,能大大节约企业的成本,并且由于 Nginx是服务器软件,其执行效率也是非常高。

七:location匹配顺序

  1. “=”前缀指令匹配,如果匹配成功,则停止其他匹配
  2. 普通字符串指令匹配,顺序是从长到短,匹配成功的location如果使用^~,则停止其他匹配(正则匹配)
  3. 正则表达式指令匹配,按照配置文件里的顺序,成功就停止其他匹配
  4. 如果第三步中有匹配成功,则使用该结果,否则使用第二步结果

注意点

  1. 匹配的顺序是先匹配普通字符串,然后再匹配正则表达式。另外普通字符串匹配顺序是根据配置中字符长度从长到短,也就是说使用普通字符串配置的location顺序是无关紧要的,反正最后nginx会根据配置的长短来进行匹配,但是需要注意的是正则表达式按照配置文件里的顺序测试。找到第一个比配的正则表达式将停止搜索。
  2. 一般情况下,匹配成功了普通字符串location后还会进行正则表达式location匹配。有两种方法改变这种行为,其一就是使用“=”前缀,这时执行的是严格匹配,并且匹配成功后立即停止其他匹配,同时处理这个请求;另外一种就是使用“^~”前缀,如果把这个前缀用于一个常规字符串那么告诉nginx 如果路径匹配那么不测试正则表达式。

匹配模式及顺序

  location = /uri    =开头表示精确匹配,只有完全匹配上才能生效。

  location ^~ /uri   ^~ 开头对URL路径进行前缀匹配,并且在正则之前。

  location ~ pattern  ~开头表示区分大小写的正则匹配。

  location ~* pattern  ~*开头表示不区分大小写的正则匹配。

  location /uri     不带任何修饰符,也表示前缀匹配,但是在正则匹配之后。

  location /      通用匹配,任何未匹配到其它location的请求都会匹配到,相当于switch中的default。