nginx常用功能一文概览

1 概述

nginx常用功能有三:正反代理、负载均衡、动静分离。

近一年的时间,一头扎在B/S结构的项目上,nginx常见的应用形式基本都能接触到一点点,这里简单总结下,便于日后自己复习。

2 代理

用一个例子来说明:
A是一名顾客,要买一套房子;B是中介,手里有C的房源信息;C是房屋的拥有者,准备出售房屋。理论上A直接找C买了房子就可以了,但是A和C互相不认识,A和C无法达成交易。A找了B,B找了C,这样就可以实现A和C的交易了。在这个例子中,B的角色就是一个代理的角色。

正向代理和反向代理
A找C买房,即A——>C这个方向是正向,那么C——>A就是反向。

如果A是不固定的,C是固定的,即房源只有一套。B是为卖房者代理,这里的B就是反向代理。
如果A是固定的,即只有一个顾客,C是不固定的,有若干套房源。B为买房者代理,这里的B就是正向代理。

2.1 正向代理

目的:实现Server_1 访问 Server_3。

现状:服务器1无法直接访问服务器3;找来服务器2,既可以访问服务器1,也可以访问服务器3;

实现:在服务器上使用nginx将server_3进行一次代理,server_1访问server_2,透过代理可实现访问到server_3

看图示:
nginx常用功能一文概览_第1张图片
看配置:

server {
	resovler 8.8.8.8; #必须要有resovler,且不能有hostname
	resoler_timeout 30s;
	listen 8080;
	location / {
		proxy_pass http://$http_host$request_url; #定义代理的url
		proxy_set_header Host $http_host;
		proxy_buffers 256 4k; #配置缓存大小
        proxy_max_temp_file_size 0; #关闭磁盘缓存读写减少I/O
        proxy_connect_timeout 30; #设置连接超时时长
        proxy_cache_valid 200 302 10m; #设置http不同状态的缓存时长
        proxy_cache_valid 301 1h;
        proxy_cache_valid any 1m;
	}
}

2.2 反向代理

看图示:
nginx常用功能一文概览_第2张图片
看配置:

server {
	listen 8081;
	server_name localhost; #非域名访问,可以不用设置
	location / {
	proxy_pass http://192.168.28.10:80;
	proxy_set_header $http_host; #代理后,携带host信息
	proxy_set_header X-Real-IP $remote_addr; # X-Real-IP 真实的客户端IP
	proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # X-Forwarded-For 记录经过所有代理(匿名除外)
	}
}

3 负载均衡

负载均衡:所谓负载均衡,是将高负载均衡散落到多台服务器上,实现压力的均衡。
下面举4个负载均衡的示例,一起看下:

3.1 负载均衡的4种方式

3.1.1 weight

upstream的负载均衡,后面加上一个自定义的字符串,字符串可在后面的server中被引用;
weight是权重,可以根据机器配置定义权重。
weigth参数表示权值,权值越高被分配到的几率越大。

    upstream myserver {
        server 192.168.28.11:80 weight=3;
        server 192.168.28.12:80 weight=2;
        server 192.168.28.13:80 weight=3;

3.1.2 ip_hash

每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。
简而言之,同一个IP发起的请求,会分配给同一个服务上。看示例:

	upstream myserver {
		ip_hash;
		server 192.168.28.14:80;
		server 192.168.28.15:80;
      }

3.1.3 fair

此种方式,按后端服务器的响应时间来分配请求,响应时间短的优先分配。
fair功能的使用,需要依赖第三方的组件,在nginx编译的时候,需要将此功能编译好。

	upstream myserver {
		server 192.168.28.16:80;
		server 192.168.28.17:80
		fair;
        }

3.1.4 url_hash

此种方式,按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存时比较有效。
url_hash功能的使用,需要依赖第三方的组件,在nginx编译的时候,需要将此功能编译好。
在upstream中加入hash语句,server语句中不能写入weight等其他的参数,hash_method是使用的hash算法。

	upstream backend {
		server 192.168.28.18:3128;
		server 192.168.28.19:3128;
		hash $request_uri;
		hash_method crc32;
        #}

3.2 负载均衡设备控制

看个例子:

    upstream myserver {
        server 192.168.28.21:80;
        server 192.168.28.22:80 weight=2;
        server 192.168.28.24:80 down;
        server 192.168.28.25:80 backup;
        server 192.168.28.26:80 weight=3 max_fails=3 fail_timeout=15; #3次失败,关闭15s

每个设备的状态情况如下表所示:

序号 状态 描述
1 down 表示单前的server暂时不参与负载
2 weight 权重,weight越大,负载的权重就越大
3 max_fails 允许请求失败的次数默认为1.当超过最大次数时,返回proxy_next_upstream模块定义的错误
4 fail_timeout max_fails次失败后,暂停的时间
5 backup 其它所有的非backup机器down或者忙的时候,请求backup机器。所以这台机器压力会最轻

4 动静分离

在一个网页页面中,存在动态资源和静态资源的区分。使用 可以看到:

nginx常用功能一文概览_第3张图片

在 ( F12 ) 的检查页面中,动态资源和动态资源具有明显的分类。具体如下

资源类型 资源描述 备注
动态资源 XHR(XMLHttpRequest)/fetch 后端资源
静态资源 js文件、img图片、media媒体文件、font字体文件、doc文本文件 前端资源

所谓动静分离,即将动态资源和静态资源分离,我们使用nginx可以实现。
在nginx的实现中,是使用一个server,创建多个location。每个location可以指定不同的路径,从而实现对不同服务的访问。

下面是一个完整的动静分离nginx配置,请仔细阅读:

server {
listen 8080;
server_name localhost;

#静态资源
location / {
root /home/dist;  #定义静态资源文件
index index.htm index.html;  #定义index文件名,默认访问的文件
tryfiles $uir $uri/ /index.html;  #优先访问根目录下的index.html文件
}

#动态资源
location /server {
proxy_set_header Host $host; #把原http请求的host字段也转发出来,明确访问的是哪个域名的资源。
proxy_set_header REMOTE-HOST $remote_addr; # 在web服务器端获得用户的真实ip 需配置条件
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; #记录每一层转发的代理IP,目的是找到原始IP。
proxy_pass http://192.168.28.10; #反向代理的地址
	}
}

你可能感兴趣的:(nginx,nginx)