Nginx常用模块(三)

ngx_http_proxy_module模块配置(http或https协议代理)

  1. proxy_pass URL;

应用上下文:location, if in location, limit_except

a)         proxy_pass后面的路径不带uri时,其会将location的uri传递给后端的主机;下面的示例会将/uri/传递给backend服务器;

location  /bbs/ {

proxy_pass http://b.com;

}

访问http://a.com/bbs /-->http://b.com/bbs/

b)         proxy_pass后面的路径是带uri时,则不会将location的uri传递给后端的主机,而是直接访问proxy_pass所指定的URL;

location  /uri/ {

proxy_pass http://b.com/SA/;

}

访问http://a.com/bbs /-->http://b.com/SA/

c)         如果location定义其uri时使用的正则表达式模式匹配,则proxy_pass后的路径不能够使用uri;

location  ~*  \.(jpg|gif|jpeg)$  {

proxy_pass  http://HOSTNAME;

}

此处的http://HOSTNAME后面不能有任何uri,哪怕只有/也不可以;

1.1     Eg:

两台服务器A,B。一台当做nginx_proxy服务器,一台做动态资源服务器。根据nginx_proxy实现访问后端动态资源分离。服务器B安装php,和http,存放动态资源。

a)         配置网络:A主机两块网卡IP分别是192.168.121.129(外网)和192.168.1.129(内网)

B主机一块网卡IP是192.168.1.128

b)         A做以下配置:

c)         B做以下配置

安装http和php模块

提供测试页:vim /var/www/html/1.php。内容如下

启动httpd:service httpd start

d)         访问http://192.168.121.129/1.php。内容如下

  1. proxy_set_header  field  value;

允许重新定义或附加字段到传递给代理服务器的请求头部。

注意:因为其默认值是proxy_set_header Host $proxy_host;所以后端主机的访问日志中记录的IP都是代理服务器的(如下图访问IP一直都是192.168.1.129)。这样不便于通过日志,去判断服务访问情况。

2.1     示例:如何配置后端主机记录真实的客户端IP,而不是反向代理服务器的IP

a)         A主机(代理服务器)做以下配置

在http配置段添加:proxy_set_header  X-Real-IP  $remote_addr;

b)         B主机(后端服务器)做以下配置

vim /etc/httpd/conf/httpd.con更改logformat,将%h替换为%{X-Real-IP},如下图

c)         使用192.168.1.1主机访问http://192.168.121.129/1.php 查看B(192.168.121.128)上的/var/log/httpd/access_log

proxy_set_header  X-Forwarded-For  $proxy_add_x_forwarded_for;

原有请求报文中如果存在X-Forwared-For首部,则将remote_addr以逗号分隔补原有值后,否则则直接添加此首部;

缓存相关的选项(缓存要先定义,后调用):

  1. proxy_cache_path path [levels=levels] [use_temp_path=on|off] keys_zone=name:size [inactive=time] [max_size=size]

定义缓存;可用上下文为http;

  1. proxy_cache zone | off;

调用缓存即要缓存哪个缓存;可用上下文 为http, server和location;

  1. proxy_cache_key string;

定义缓存键,即把什么当做缓存的键值,一般来使用IP;

proxy_cache_key $scheme$proxy_host$request_uri;

  1. proxy_cache_valid [code ...] time;

定义缓存(code)对象以及对不同响应码的响应设定其可缓存时长;

示例:

proxy_cache_valid 200 302 10m;

proxy_cache_valid 404      1m;

  1. proxy_cache_use_stale error | timeout | invalid_header | updating | http_500 | http_502 | http_503 | http_504 | http_403 | http_404 | off ...;

在于代理通信期间确定在哪种情况下可以使用过期的缓存直接响应客户端。这种情况一般适用于后端主机出现故障例如资源不存在响应码为404

跟连接相关的选项

  1. proxy_connect_timeout time;

定义与后端服务器建立连接的超时时长;默认为60s,不建议超出75s;

  1. proxy_send_timeout time;

把请求发送给后端服务器的超时时长;默认为60s;

  1. proxy_read_timeout time;

等待后端服务器发送响应报文的超时时长;

ngx_http_headers_module模块配置

  1. add_header name value [always];

向响应报文添加自定义首部,并为其赋值;

add_header X-via $server_addr;

  1. expires [modified] time;

expires epoch | max | off;

允许或禁止向响应报文的Cache-Control或Expires首部添加新值或修改其值;

ngx_http_upstream_module模块配置

用于将多个服务器定义成服务器组,而由proxy_pass, fastcgi_pass等指令进行引用;

  1. upstream name  { ... }

定义一个后端服务器组,name为组名称;仅能用于http上下文 ;

  1. server address  [parameters];

在upstream中定义一个服务器及其相关参数;仅能用于upstream上下文;

address格式:

IP[:PORT]

HOSTNAME[:PORT]

unix:/PATH/TO/SOCKET_FILE

常用参数:

weight=number:定义服务器权重,默认为1;

max_fails=number:最大失败连接尝试次数,失败连接超时时长由fail_timeout参数指定;

fail_timeout=number:服务器被标记为不可用的状态的时长。

backup:备用服务器,所有主服务器均故障时才启用此主机;

down:手动标记服务器下线,其不再处理任何用户请求;

使用方法:

(a) 定义upstream服务器组

upstream websrvs {

server 172.16.100.68 weight=2 max_fails=2 fail_timeout=6s;

server 172.16.100.6  weight=1 max_fails=2 fail_timeout=6s;

}

(b) 在反代场景中(proxy_pass, fastcgi_pass, ...)进行调用;

location / {

proxy_pass http://websrvs/;

}

  1. ip_hash;

源地址hash,把来自同一个ip地址的请求始终发往同一个backend server,除非此backend server不可用;

  1. least_conn;

最少连接调度方法;当各server权重不同时,即为加权最少连接;

  1. health_check [parameters];

健康状态检测机制;只能用于location上下文;

常用参数:

interval=time检测的频率,默认为5秒;

fails=number:判定服务器不可用的失败检测次数;默认为1次;

passes=number:判定服务器可用的失败检测次数;默认为1次;

uri=uri:做健康状态检测测试的目标uri;默认为/;

match=NAME:健康状态检测的结果评估调用此处指定的match配置块;

  1. match name { ... }

对backend server做健康状态检测时,定义其结果判断机制;只能用于http上下文;

常用的参数:

status  code[  code ...]: 期望的响应状态码;

status !code[  code ...]: 期望的非响应状态码;

header  HEADER[operator  value]:期望存在响应首部,也可对期望的响应首部的值基于比较操作符和值进行比较;

header Content-Type=text/html;

header Content-Type!=text/html;

body:期望响应报文的主体部分应该有的内容;

body ~ "OK";即内容中包含字母sa

  1. hash key [consistent];

定义调度方法,可以指名基于哪个值做hash值。例如可以基于HOSTNAME和cookies

hash  $remote_addr相当于ip_hash;

hash  $request_uri根据请求的uri做hash;

常用的hash key:

$cookie_name:将一个用户的请求始终发往同一个backend server,能实现会话绑定的功能;此处的name为cookie某些参数的名称,此处常用的有cookie_username;

$request_uri: 将对同一个uri的请求始终发往同一个backend server,后端为cache server时特别有用;

session会话保持:

session sticky:基于ip, ngix还可基于请求报文首部中的多种信息,例如cookie, uri;

session cluster:每个server均把创建和维护session同步集群中的其它主机;仅适用于较小规模的环境;

session server:使用一个共享的存储服务存储session信息;

location ~* \.php$ {

proxy_pass

}

location / {

proxy_pass

}

补充:如何查看请求数据是从服务器获取还是从缓存获取?

添加一个头部,引用变量$upstream_cache_status

nginx常用模块(三)的更多相关文章

  1. Nginx 常用模块

    Nginx 常用模块 1. ngx_http_autoindex_module # ngx_http_autoindex_module模块处理以斜杠字符(' / ')结尾的请求,并生成一个目录列表. ...

  2. (转)nginx 常用模块整理

    原文:http://blog.51cto.com/arm2012/1977090 1. 性能相关配置 worker_processes number | auto: worker进程的数量:通常应该为 ...

  3. Python之常用模块三(面向对象相关的三个模块)

    hashlib.configparser.logging模块 一.常用模块二 hashlib模块 hashlib提供了常见的摘要算法,如md5和sha1等等. 那么什么是摘要算法呢?摘要算法又称为哈希 ...

  4. nginx常用模块

    Nginx模块介绍 核心模块:core module 标准模块:stand modules HTTP modules: Standard HTTP modules Optional HTTP modu ...

  5. Python常用模块(三)

    一.shelve模块 shelve也是一种序列化方式,在python中shelve模块提供了基本的存储操作,shelve中的open函数在调用的事和返回一个shelf对象,通过该对象可以存储内容,即像 ...

  6. 9.Nginx常用模块

    1.nginx开启目录浏览 提供下载功能 默认情况下,网站返回index指定的主页,若该网站不存在主页,则将请求交给autoindex模块 如果开启autoindex模块,则提供一个下载的页面, 如果 ...

  7. Nginx常用模块及作用

    Nginx模块详解 nginx模块分为两种,官方和第三方,我们通过命令 nginx -V 查看 nginx已经安装的模块! [root@localhost ~]# nginx -V nginx ver ...

  8. nginx常用模块(一)

    1.Nginx目录索引 1.1Nginx默认是不允许列出整个目录浏览下载.Syntax: autoindex on | off;Default: autoindex off;Context: http ...

  9. 07 . Nginx常用模块及案例

    访问控制 用户访问控制 ngx_http_auth_basic_module 有时我们会有这么一种需求,就是你的网站并不想提供一个公共的访问或者某些页面不希望公开,我们希望的是某些特定的客户端可以访问 ...

随机推荐

  1. (一)django创建

    1.打开终端,安装django:输入pip install django 2.创建django项目:django-admin startproject myweb 3.启动项目:进入到myweb,输入 ...

  2. 爬虫连接mongodb、多线程多进程的使用

    一.连接mongodb 1.            设置数据库 client=pymongo.MongoClient(‘localhost’) 2.            db=client[‘lag ...

  3. Java面试官最爱问的volatile关键字

    在Java的面试当中,面试官最爱问的就是volatile关键字相关的问题.经过多次面试之后,你是否思考过,为什么他们那么爱问volatile关键字相关的问题?而对于你,如果作为面试官,是否也会考虑采用 ...

  4. vi文本编辑器命令

    基本上 vi 共分为三种模式,分别是『一般模式』.『编辑模式』与『指令列命令模式』. 这三种模式的作用分别是: 一般模式:以 vi 打开一个档案就直接进入一般模式了(这是默认的模式).在这个模式中, ...

  5. Flex 和 Bison 使用方法

    背景知识 在学编译原理的时候,同时在做南京大学的编译原理课程实验,这里是链接,整个实验的效果是实现一个完整的 C-- 语法的编译器.C-- 语法是他们老师指定的一种类 C 语言. Flex 和 Bis ...

  6. android studio ndk 环境配置成eclipse模式

    gradle.properties: android.useDeprecatedNdk=true build.gradle: android { ... sourceSets.main { jni.s ...

  7. Spring Cloud gateway 五 Sentinel整合

    微服务当前这么火爆的程度,如果不能学会一种微服务框架技术.怎么能升职加薪,增加简历的筹码?spring cloud 和 Dubbo 需要单独学习.说没有时间?没有精力?要学俩个框架?而Spring C ...

  8. 哟,来看看JS里面变量声明方式

    点点点点点点进来.点击此处领取双十一梦想大礼包. 终于被我忽悠进来了?老弟,不骚一下你不往里面点是吧,还想大礼包?想着吧. 今天要说的如题,JS里面变量声明方式.可能一提到这个话题大家能很快的打出来, ...

  9. Apache服务部署静态网站

    Web网络服务也叫WWW(World Wide Web),一般是指能够让用户通过浏览器访问到互联网中文档等资源的服务. 目前提供WEB网络服务的程序有Apache.Nginx或IIS等等,Web网站服 ...

  10. ASCALL码对照表

    ASCALL码对照表 目前计算机中用得最广泛的字符集及其编码,是由美国国家标准局(ANSI)制定的ASCII码(American Standard Code for Information Inter ...