Linux自学笔记——nginx应用进阶

简介:

    本文部分参照博客http://blog.51cto.com/1992tao/1868267

Nginx除了作为web server,还具有反向代理、负载均衡和缓存的功能。

 

正向代理:是一个位于客户端和原始服务器之间的服务器,为了从原始服务器去的内容,客户端向代理发送一个请求并指定目标(原始服务器),然后代理向原始服务器转交请求并将获得的内容返回给客户端。客户端必须要进行一些特别的设置才能使用正向代理。

 

反向代理:指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet请求连接的客户端,此时代理服务器对外就表现为一个反向代理服务器;

 

两者区别:

1.      从用途来讲:

1)      正向代理可以为在防火墙内的局域网客户提供访问internet的途径。正向代理还可以使用缓冲特性减少网络使用率;

2)      反向代理将防火墙后面的服务提供给internet用户访问。反向代理还可以为后端的多台服务器提供负载均衡,或为后端的服务器提供缓存服务。

2.      从安全性讲:

1)      正向代理允许客户端通过它访问任意网站并且隐藏客户端自身,因此你必须采取安全措施以确保仅为经过授权的客户端提供服务。

2)      反向代理对外是透明的,访问者并不知道自己访问是一个代理服务器。

 

ngx_http_proxy_module模块

1.    proxy_pass  URL

    image.png                                               

       作用:将作为代理服务器,把客户端访问的资源的url映射到后端服务器;

       格式:

              Server {

listen

server_name

location  / {

proxy_pass   http://host[:port]/ ;

}

                     location /uri  {

                            poxy_pass  http://back_server:port/newuri;

                     location ~* /uri {

                            proxy_pass http://back_server;

                            }

                     }

              }

示例:

1)      实验环境

两台虚拟主机,一台作为nginx反向代理服务器,另外一台作为后端web服务器;nginx代理服务器要有一外网网卡和外网客户端通信,还要有一个内网网卡和后端主机通信;后端web服务器内网和nginx在同一网段。

2)      环境搭建

        a.       设置nginx反向代理服务器的IP地址,外网地址ip:192.168.19.130,内网ip:172.16.23.1

        image.png

        b.      后端web服务器IP地址为172.16.23.110;

        image.png

        c.       准备网页文件;

        image.png

3)      编辑代理服务器配置文件并测试

        a.       编辑配置文件如下:

image.png 

访问测试:

image.png

        b.      我们再次编辑配置文件,不代理整个跟,只代理test目录到后端服务器;

          image.png

        测试访问:

         image.png

        Note:此次我们在proxy_pass加了根,会将其替换吊location的uri,所以访问测试的结果还是访问了后端服务器的默认页面文件;

        c.       我们再次编辑配置文件,去掉proxy_pass后面的根;

        image.png

        测试:

        image.png

        Note:在proxy_pass后面不加根,会将location中的uri不到proxy的后面,及访问后端主机的test目录下的默认页面;

        d.      编辑配置文件,如果location是正则表达式匹配的。Proxy后面一定不能带uri,即不能带根,否则会报错;

        image.png

        测试:

        image.png

2.    proxy_set_header field  value

   image.png 

作用:将客户端请求代理服务器请求报文首部的值附加到代理服务器发往后端服务器请求报文的首部

Proxy_set_header  X-Real-IP  $remote_addr:直接记录前段主机的ip地址;

Proxy_set_header  X-Forward-For    $proxy_add_x_forwarded_for:记录IQ那段合租记发请求时记录的proxy_add_x_forwarded_for的值;

示例:

1)      查看后端服务器日志,可以看出请求的IP地址都是代理服务器的IP地址;

   image.png 

2)      编辑nginx代理服务器配置文件;

    image.png

修改后端服务器配置文件的日志格式,添加以下内容:

    image.png

重新访问测试:可以看出,在访问日志中出现了源地址信息;

    image.png

 

具体可参考https://www.cnblogs.com/jsonhc/p/7199295.html?utm_source=itdadao&utm_medium=referral这篇博客,有具体的日志格式设置;

 

Note:如果后端服务器用的apache,日志格式可改成如下格式即可;

    image.png

 

3.    proxy_cache缓存

 

proxy_cache_path path [levels=levels] keys_zone=name:size [inactive=time] [max_size=size] ;

image.png

作用:定义proxy功能的缓存路径等;

参数:

       levels=levels:缓存目录的层级数量;

例如:levels=1:2:2,表示一个一级子目录,两个二级子目录,两个三级子目录,每一级的数量为十六进制数;

        keys_zone=name:size :k/v映射的内存空间的名称和大小;

        inactive=time:非活动时长;

        max_size=size:磁盘上用于缓存数据的缓存空间上限;

示例:

     proxy_cache_path /data/nginx/cache levels=1:2 keys_zone=one:10m;

 

proxy_cache zone_name;

image.png

作用:指明要调用的缓存,或者关闭缓存机制;

 

proxy_cache_valid [code] time;

image.png

作用:定义对特定的响应码的响应内容的缓存时长;

 

proxy_cache_methods

     image.png   

     作用:指明为哪些请求方法去检测使用缓存;一般情况下,通常是GET  HEAD可以使用缓存;

proxy_cache_use_stale error timeout ...

image.png

作用:当代理服务器于后端主机出现故障时,在后端服务器的响应结果为哪种情况下,可以直接用缓存中的缓存项(可能是过期的内容)来响应客户端。

 

proxy_cache_min_uses

image.png

作用:设置响应将被缓存的请求的数量;

 

proxy_cache_bypass string: 设置在何种情形下nginx将不从cache取数据的;

$cookie_nocache $arg_nocache  $http_authorization

image.png

    作用:定义不从缓存中响应的条件,如果参数字符串中至少有一个值不是空的,并且不等于0,name响应就不从缓存中获取;

 

proxy_cache_key  string

image.png

作用:缓存中用于“键”的内容;

 

示例:定义调用缓存机制;

1)      创建缓存目录;

    image.png

2)      在配置文件中定义缓存路径(proxy_cache_path路径只能定义在http段)

    image.png

3)      可以在其它的location段定义缓存调用;

    image.png

4)      测试访问http://192.168.19.130/test,查看缓存目录;

   image.png 

 

ngx_http_upstream_module模块

image.png

作用:定义服务器组;

格式:

upstream name {

       server_adress  [parameters]

       ip_hash;

}

示例:

    image.png

1.      server address [parameters]

image.png

作用:定义upstream中server成员的地址和其他相关参数;

address这个地址可以指定为一个域名或者ip地址,后面加一个可选择的端口,或者是在unix前缀之后指定的unix域的套接字路径如果没有指定端口,则使用默认的80端口。一个域名解析到多个ip地址,同时定义多个服务器。

parameters

weight=number :权重,默认为1;

man_fails=number :失败尝试的最大次数;超出此处指定的次数时,server将被标记不可用;

fail_timeout=time :设置将服务器标记为不可用状态的超时时长;

down :手动标记server不可用;

backup :标记这个服务器为一个备用服务器,当主服务器不可用时,它将被传递请求。

 

示例:定义两个upstream server,用两台upstream server提供web测试界面,一台nginx服务器做反向代理服务器,实现负载均衡;

1)      编辑/etc/nginx/nginx.conf配置文件,配置upstream servers;

   image.png 

2)      编辑配置文件调用upstream server;

   image.png

3)      重载服务,并测试;

    image.png

Note:可以看出,访问根目录时,实现了负载均衡,访问test目录下页面文件时,都是172.16.23.210那台upserver在响应,这是因为在/test/的location下,定义了缓存机制,第一次从upstream server1上都到响应,之后的都是从缓存中获取的。

4)      注释掉缓存机制,重新访问测试;

  image.png  

重新访问测试:

   image.png 

5)      编辑配置文件,设置权重,max_fails等参数;

    image.png

6)      重载配置文件,我们手动停掉172.16.23.211的web服务这台upserver测试,可以发现只有第一台upserver响应了;

    image.png

7)      再重新启动停掉web服务的upserver的web服务,再次测试;

   image.png 

 

健康检查:

health_check

       建议:关闭访问日记

调度算法:

1.      ip_hash;

源地址hash调度方法

2.      least_conn

最少连接调度算法,当server拥有不同的权重是其为wlc;

3.      hash key [consistent]

基于指定的的key的hash表来实现对请求的调度,此处的key可以直接是文本、变量或者二者的组合;

作用:将请求分类,同一类请求将发往同一个upstream server;

示例:

hash  $request_uri  consistent;一致性hash算法;

hash  $remote_addr;来自于同一个ip地址的请求,将始终被发往同一个后端服务器;

4.      keepalive connections

为每个worker进程保留的空闲的长连接数量;

 

演示:

1.      ip_hash算法;

1)      编辑配置文件,采用ip调度方法;

    image.png

2)      重载服务测试;

    image.png

2.      hash key算法;

1)      在172.16.23.210后端主机上准备测试网页文件;

    image.png

2)      在172.16.23.211后端主机上准备网页测试文件;

    image.png

3)      不添加任何算法测试;

    image.png

4)      编辑配置文件,把用户请求的uri做哈希运算,用hash key算法;

    image.png

5)      重载服务,测试;

     image.png   

 

自定义响应首部:

add_header  X-Via  $server_addr;

add_header  X-Cache $upstream_cache_status;

示例:

1.      编辑配置文件,自定义响应首部;

    image.png

2.      测试;

image.png




本文转自 claude_liu 51CTO博客,原文链接:http://blog.51cto.com/claude666/2064723,如需转载请自行联系原作者
相关实践学习
部署高可用架构
本场景主要介绍如何使用云服务器ECS、负载均衡SLB、云数据库RDS和数据传输服务产品来部署多可用区高可用架构。
负载均衡入门与产品使用指南
负载均衡(Server Load Balancer)是对多台云服务器进行流量分发的负载均衡服务,可以通过流量分发扩展应用系统对外的服务能力,通过消除单点故障提升应用系统的可用性。 本课程主要介绍负载均衡的相关技术以及阿里云负载均衡产品的使用方法。
相关文章
|
27天前
|
Linux
linux查看应用对应的端口
linux查看应用对应的端口
16 0
|
27天前
|
网络协议 安全 Linux
linux系统安全及应用——端口扫描
linux系统安全及应用——端口扫描
36 0
|
1月前
|
传感器 Linux 数据处理
ARM Linux摄像头传感器数据处理全景视野:从板端编码视频到高级应用(二)
ARM Linux摄像头传感器数据处理全景视野:从板端编码视频到高级应用
46 1
|
22天前
|
Linux 测试技术 C语言
【Linux】应用编程之C语言文件操作
【Linux】应用编程之C语言文件操作
|
26天前
|
应用服务中间件 Linux PHP
Linux下安装php环境并且配置Nginx支持php-fpm模块
Linux下安装php环境并且配置Nginx支持php-fpm模块
23 0
|
28天前
|
存储 算法 Linux
Linux中的硬链接与软链接:原理、应用与最佳实践
Linux中的硬链接与软链接:原理、应用与最佳实践
54 0
|
28天前
|
监控 算法 Unix
【Linux 异步操作】深入理解 Linux 异步通知机制:原理、应用与实例解析
【Linux 异步操作】深入理解 Linux 异步通知机制:原理、应用与实例解析
59 0
|
28天前
|
Unix Linux C++
【C/C++ 造轮子】Linux异步计时器:深入探讨和应用 (Linux Asynchronous Timers: An In-depth Exploration and Application)
【C/C++ 造轮子】Linux异步计时器:深入探讨和应用 (Linux Asynchronous Timers: An In-depth Exploration and Application)
58 1
|
1月前
|
Shell Linux 开发者
【Shell 命令集合 文件管理】Linux 补丁文件应用命令 patch命令使用指南
【Shell 命令集合 文件管理】Linux 补丁文件应用命令 patch命令使用指南
36 0
|
1月前
|
传感器 存储 编解码
ARM Linux摄像头传感器数据处理全景视野:从板端编码视频到高级应用(三)
ARM Linux摄像头传感器数据处理全景视野:从板端编码视频到高级应用
51 2