nginx常用功能全揭秘

2018-11-23  本文已影响0人  浣熊_b213

转载:nginx常用功能全揭秘

正向代理

定义: 内网服务器主动去请求外网服务的一种行为。

正向:相同的或一致的方向 代理:自己做不了的事情或者不打算做的事情,委托或依靠别人来完成。

正向代理:其实就是客户端无法主动或者不打算完成主动去向某服务器发起请求,而是委托了nginx代理服务器 去向服务器发起请求,并且获得处理结束,返回客户端。

客户端向目标服务器发起的请求,是由代理服务器代替它向目标主机发起,得到结果之后,通过代理服务器返回给客户端。

正向代理.jpg

正向代理的配置

  1. resolver: DNS服务器IP地址
  2. listen : 主动发起请求的内网服务器端口
  3. proxy_pass : 代理服务器的协议和地址
server {
    #指定DNS服务器IP地址  
    resolver 114.114.114.114;   
    #指定代理端口    
    listen 8080;  
    location / {
        #设定代理服务器的协议和地址(固定不变)    
        proxy_pass http://$http_host$request_uri; 
    }  
} 

在 linux下可以执行命令设置代理服务器:
curl --proxy proxy_server:8080 http://www.taobao.com/

反向代理

  reverse proxy: 指用代理服务器来接收客户端发来的请求,然后将请求转发给内网的上游服务器,上游服务器处理完后,把结果通过nginx返回给客户端。

反向代理.jpg

  反向代理是对于外界的请求,先通过nginx统一接收,然后按需要转发给内网中的服务器,并且把处理请求返回给外界客户端,此时代理服务器对外表现为 一个web服务器,客户端不知道上游服务器的存在。

反向代理栗子.jpg
栗子:
  一个服务器的 80 端口只有一个,但是服务器中可能有多个项目。假设当前服务器中存在 三个项目 A,B,C,三个项目分别对应端口:8081,8082,8083,且指向该服务器的域名为: wwww.xxx.com

此时,访问三个项目的方式:

  此时,我们将 80 端口给 nginx服务器,给每个项目分配一个独立的子域名,如 A项目 a.xxx.com,并且在nginx中设置每个项目的转发配置,然后对所有项目的访问都有 nginx服务器接收,再根据配置转发给不同的服务器处理。

流程图.jpg

反向代理配置

配置关键

  1. server_name: 代表客户端向服务器发起请求时输入的域名
  2. proxy_pass: 代表 源服务器的访问地址,即真正处理请求的服务器(localhost + 端口号)

事实上,设置nginx反向代理一定程度上 访问服务时不想加上难看的域名 + 端口形式,而将端口号放置到代理服务器上,作为统一访问。

 1 server {
 2    #监听端口
 3    listen 80;
 4    #服务器名称,也就是客户端访问的域名地址
 5    server_name  a.xxx.com;
 6    #nginx日志输出文件
 7    access_log  logs/nginx.access.log  main;
 8    #nginx错误日志输出文件
 9    error_log  logs/nginx.error.log;
10    root   html;
11    index  index.html index.htm index.php;
12    location / {
13        #被代理服务器的地址
14        proxy_pass  http://localhost:8081;
15        #对发送给客户端的URL进行修改的操作
16        proxy_redirect     off;
17        proxy_set_header   Host             $host;
18        proxy_set_header   X-Real-IP        $remote_addr;
19        proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
20        proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
21        proxy_max_temp_file_size 0;
22   }
23}

透明代理

又称为简单代理,当客户端向服务器发起请求时,请求会先到达透明代理服务器,代理服务器再将请求转发给真正的 源服务器处理,即客户端根本不知道代理服务器的存在。

透明代理.jpg

例子:
   类似于拦截器。公司拦截员工对外发送的东西,对外发送时,实际上先经过网络上一个透明的服务器(员工不可见),经过处理后,才接着往外网走。

区别和联系

透明代理 VS 反向代理
过程貌似一致:都是由代理服务器先接受请求,再转发到源服务器。
透明代理:客户端感知不到代理服务器的存在,隐藏了自己;
反向代理:客户端感知只有一个代理服务器的存在,隐藏了源服务器;

透明代理 VS 正向代理
相同点: 都是由客户端主动发起请求,代理服务器处理;
差异点:
正向代理:代理服务器代替客户端请求,客户端知道代理的存在;
透明代理:客户端在发送请求时,会先经过 透明代理服务器,在达到服务端,客户端不会感知代理服务器的存在。

负载均衡

将服务器接收到的请求 按照规则分发的过程,称为负载均衡。负载均衡是反向代理的一种体现。
  在当前服务器集群中,nginx充当了接收流量和分流的作用。当请求到 nginx服务器时,nginx就可以根据设置的负载信息,把请求分配到不同的服务器,服务器处理完毕后,再将处理的结果返回给客户端。

负载均衡.jpg

nginx实现负载均衡的几种方式

1. 轮询

nginx默认模式,每个请求按照时间顺序逐一分配到不同的后端服务器。

优点 配置简单,只需要将服务器列表加入到 upstream 模块中即可。

# 负载中有三台服务器,当请求到达时,nginx按照时间顺序将请求分配给这三台服务器
1 upstream serverList {
2    server 1.2.3.4;
3    server 1.2.3.5;
4    server 1.2.3.6;
5}

2.ip_hash

每个请求按照 IP的hash结果分配,同一个IP客户端固定访问一个后端服务器。
优点 可以保证来自同一个IP的请求,被打到固定的机器上,可以解决session问题。

# 负载中有三台服务器,当请求到达时,nginx会优先按照ip_hash的结果进行分配,其他则按照时间顺序把请求分配给三台服务器处理。
1 upstream serverList {
2    ip_hash
3    server 1.2.3.4;
4    server 1.2.3.5;
5    server 1.2.3.6;
6}

3. url_hash

按访问url的hash结果来分配请求,相同url固定转发到同一个后端服务器进行处理。

1 upstream serverList {
2    server 1.2.3.4;
3    server 1.2.3.5;
4    server 1.2.3.6;
5    hash $request_uri; 
6    hash_method crc32; 
7}

4. fair

按 后端服务器的响应时间来分配请求,响应时间短的优先分配。(能者多劳)

1 upstream serverList {
2    server 1.2.3.4;
3    server 1.2.3.5;
4    server 1.2.3.6;
5    fair;
6}

备注:

# 负载中包含三台服务器,当请求到达时,nginx按照 时间顺序和权重把请求分配给三台服务器处理。例如100个请求,30%的4处理,50%的5处理,20%的6处理
1 upstream serverList {
2    server 1.2.3.4 weight=30;
3    server 1.2.3.5 weight=50;
4    server 1.2.3.6 weight=20;
5}
# 负载中三台服务器,服务器4的失败超时时间 60s,服务器5暂不参与负载,服务器6只是作为备份机。
# upstream:是负载的配置模块,serverList是名称,随便起
1 upstream serverList {
2    server 1.2.3.4 fail_timeout=60s;
3    server 1.2.3.5 down;
4    server 1.2.3.6 backup;
5}

负载均衡示例(关键配置)

# upstream:是负载的配置模块,serverList是名称,随便起
 1 upstream serverList {
 2    server 1.2.3.4 weight=30;
 3    server 1.2.3.5 down;
 4    server 1.2.3.6 backup;
 5}   
 6
 7 server {
 8    listen 80;
 9    server_name  www.xxx.com; # server_name:是客户端请求的域名地址
10    root   html;
11    index  index.html index.htm index.php;
12    location / {
13        proxy_pass  http://serverList; # 指向负载的列表的模块,如serverList
14        proxy_redirect     off;
15        proxy_set_header   Host             $host;
16   }
17}

静态服务器

前后分离的项目,即前端服务器和后端服务器分离,分别部署;

好处:

  1. 前后端人员各司其职,不需要相互依赖;
  2. 前端项目的运行是不需要用 Tomcat、Apache等服务器环境的。
    可以直接用nginx来作为静态服务器。

1 server {
2        listen       80;                                                         
3        server_name  www.xxx.com;        # 静态网站访问的域名地址;                                        
4        client_max_body_size 1024M;
5        location / {
6               root   /var/www/xxx_static;  # 直接静态项目绝对路径的根目录;
7               index  index.html;
8           }
9    }

nginx的安装

// 依赖安装
yum -y install gcc zlib zlib-devel pcre-devel openssl openssl-devel
yum install nginx
// 检查是否成功
nginx -v
// 启动 / 停止 nginx
/etc/init.d/nginx start
/etc/init.d/nginx stop
# 编辑配置文件
/etc/nginx/nginx.conf
上一篇 下一篇

猜你喜欢

热点阅读