nginx是一款自由的、开源的、高性能的HTTP服务器和反向代理服务器

概念

反向代理

说到代理,首先我们要明确一个概念,所谓代理就是一个代表、一个渠道;

此时就设计到两个角色,一个是被代理角色,一个是目标角色,被代理角色通过这个代理访问目标角色完成一些任务的过程称为代理操作过程;如同生活中的专卖店~客人到adidas专卖店买了一双鞋,这个专卖店就是代理,被代理角色就是adidas厂家,目标角色就是用户

正向代理

说反向代理之前,我们先看看正向代理,正向代理也是大家最常接触的到的代理模式,我们会从两个方面来说关于正向代理的处理模式,分别从软件方面和生活方面来解释一下什么叫正向代理

在如今的网络环境下,我们如果由于技术需要要去访问国外的某些网站,此时你会发现位于国外的某网站我们通过浏览器是没有办法访问的,此时大家可能都会用一个操作FQ进行访问,FQ的方式主要是找到一个可以访问国外网站的代理服务器,我们将请求发送给代理服务器,代理服务器去访问国外的网站,然后将访问到的数据传递给我们!

上述这样的代理模式称为正向代理,正向代理最大的特点是客户端非常明确要访问的服务器地址;服务器只清楚请求来自哪个代理服务器,而不清楚来自哪个具体的客户端;正向代理模式屏蔽或者隐藏了真实客户端信息。

反向代理

明白了什么是正向代理,我们继续看关于反向代理的处理方式,举例如我大天朝的某宝网站,每天同时连接到网站的访问人数已经爆表,单个服务器远远不能满足人民日益增长的购买欲望了,此时就出现了一个大家耳熟能详的名词:分布式部署;也就是通过部署多台服务器来解决访问人数限制的问题;多个客户端给服务器发送的请求,nginx反向代理服务器接收到之后,按照一定的规则分发给了后端部署的多台服务器之一进行处理。此时,请求的来源客户端是明确的,但是请求是由哪台服务器处理的就并不能确定了。

反向代理,主要用于服务器集群分布式部署的情况下,反向代理隐藏了服务器的信息!

负载均衡

我们已经明确了所谓代理服务器的概念,那么接下来,nginx是依据什么样的规则进行请求分发的呢?不用的项目应用场景,分发的规则是否可以控制呢?

由客户端发送的、nginx反向代理服务器接收到的请求数量,就是我们说的负载量。

把请求按照一定的规则分发到不同的服务器的过程,就称为负载均衡。

Nginx支持的负载均衡规则

  1. weight轮询(默认):接收到的请求按照顺序逐一分配到不同的后端服务器,即使在使用过程中,某一台后端服务器宕机,nginx会自动将该服务器剔除出队列,请求受理情况不会受到任何影响。 这种方式下,可以给不同的后端服务器设置一个权重值(weight),用于调整不同的服务器上请求的分配率;权重数据越大,被分配到请求的几率越大;该权重值,主要是针对实际工作环境中不同的后端服务器硬件配置进行调整的。
  2. ip_hash:每个请求按照发起客户端的ip的hash结果进行匹配,这样的算法下一个固定ip地址的客户端总会访问到同一个后端服务器,这也在一定程度上解决了集群部署环境下session共享的问题。
  3. fair:智能调整调度算法,动态的根据后端服务器的请求处理到响应的时间进行均衡分配,响应时间短处理效率高的服务器分配到请求的概率高,响应时间长处理效率低的服务器分配到的请求少;结合了前两者的优点的一种调度算法。但是需要注意的是nginx默认不支持fair算法,如果要使用这种调度算法,请安装upstream_fair模块
  4. url_hash:按照访问的url的hash结果分配请求,每个请求的url会指向后端固定的某个服务器,可以在nginx作为静态服务器的情况下提高缓存效率。同样要注意nginx默认不支持这种调度算法,要使用的话需要安装nginx的hash软件包

安装nginx

ubuntu上可以直接用apt-get来安装Nginx,-y 表示安装过程中所有询问都按默认的勾选

sudo apt-get -y install nginx

安装完成后使用nginx命令启动Nginx,现在用浏览器访问主机的ip地址就能看见Nginx的测试页面了

配置

配置文件存放位置

Nginx默认加载的配置文件在/usr/share/nginx/html; 而这个配置里面写了

include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;

所以我们的配置只要放在 /etc/nginx/conf.d//etc/nginx/sites-enabled/* 中都能自动加载。

一般建议把配置保存在/etc/nginx/sites-available/xxxxxx.conf,sites-available顾名思义就是可用的配置而不一定要使用,当要使用某个配置时,再软连接到sites-enabled目录中

sudo ln -s /etc/nginx/sites-available/xxx.conf /etc/nginx/sites-enabled/xxx.conf

配置文件示例

server {
    listen  80; #外网通过这个端口访问
    server_name xxxxx.com; #域名或者ip地址
    charset     utf-8;
    access_log  /var/log/nginx/日志文件名; #日志会记录在这个文件
    root         指定一个根目录;
		#比如所指定了根目录为/data/www
		#Nginx就将/data/www/static 作为所有静态资源请求的根路径
		#如果访问: http://119.29.250.68/static/index.html
		#Nginx 将会去 /data/www/static/ 目录下去查找 index.html
    
    location / {                       # 路由访问配置
    }
    
    upstream xxxx {                    # 负载均衡配置
    }
}

location模块是Nginx配置中出现最多的一个配置,主要用于配置路由访问信息

location的反向代理配置方式

通过反向代理代理服务器访问模式,通过proxy_set配置让客户端访问透明化

location / {
    proxy_pass http://localhost:8888;
    proxy_set_header X-real-ip $remote_addr;
    proxy_set_header Host $http_host;
}
location的wsgi配置方式
location / {
    include uwsgi_params;
    uwsgi_pass localhost:8888
}
upstream负载均衡配置(可不配置)
upstream name {
    ip_hash;
    server 192.168.1.100:8000;
    server 192.168.1.100:8001 down;
    server 192.168.1.100:8002 max_fails=3;
    server 192.168.1.100:8003 fail_timeout=20s;
    server 192.168.1.100:8004 max_fails=3 fail_timeout=20s;
}
  • ip_hash:指定请求调度算法,默认是weight权重轮询调度,可以指定
  • server host:port:分发服务器的列表配置
  • down:表示该主机暂停服务
  • max_fails:表示失败最大次数,超过失败最大次数暂停服务
  • fail_timeout:表示如果请求受理失败,暂停指定的时间之后重新发起请求

应用配置

测试配置文件

sudo service nginx configtest

要是测试失败了,可以先restart一下,然后按照提示输入如下指令,会告诉你哪里出错了

systemctl status nginx.service

每次修改了配置文件都需要restart或者reload

sudo service nginx restart
sudo service nginx reload