nginx常用模块(三)
Nginx常用模块(三)
ngx_http_proxy_module模块配置(http或https协议代理)
- 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。内容如下
- 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以逗号分隔补原有值后,否则则直接添加此首部;
缓存相关的选项(缓存要先定义,后调用):
- proxy_cache_path path [levels=levels] [use_temp_path=on|off] keys_zone=name:size [inactive=time] [max_size=size]
定义缓存;可用上下文为http;
- proxy_cache zone | off;
调用缓存即要缓存哪个缓存;可用上下文 为http, server和location;
- proxy_cache_key string;
定义缓存键,即把什么当做缓存的键值,一般来使用IP;
proxy_cache_key $scheme$proxy_host$request_uri;
- proxy_cache_valid [code ...] time;
定义缓存(code)对象以及对不同响应码的响应设定其可缓存时长;
示例:
proxy_cache_valid 200 302 10m;
proxy_cache_valid 404 1m;
- proxy_cache_use_stale error | timeout | invalid_header | updating | http_500 | http_502 | http_503 | http_504 | http_403 | http_404 | off ...;
在于代理通信期间确定在哪种情况下可以使用过期的缓存直接响应客户端。这种情况一般适用于后端主机出现故障例如资源不存在响应码为404
跟连接相关的选项
- proxy_connect_timeout time;
定义与后端服务器建立连接的超时时长;默认为60s,不建议超出75s;
- proxy_send_timeout time;
把请求发送给后端服务器的超时时长;默认为60s;
- proxy_read_timeout time;
等待后端服务器发送响应报文的超时时长;
ngx_http_headers_module模块配置
- add_header name value [always];
向响应报文添加自定义首部,并为其赋值;
add_header X-via $server_addr;
- expires [modified] time;
expires epoch | max | off;
允许或禁止向响应报文的Cache-Control或Expires首部添加新值或修改其值;
ngx_http_upstream_module模块配置
用于将多个服务器定义成服务器组,而由proxy_pass, fastcgi_pass等指令进行引用;
- upstream name { ... }
定义一个后端服务器组,name为组名称;仅能用于http上下文 ;
- 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/;
}
- ip_hash;
源地址hash,把来自同一个ip地址的请求始终发往同一个backend server,除非此backend server不可用;
- least_conn;
最少连接调度方法;当各server权重不同时,即为加权最少连接;
- health_check [parameters];
健康状态检测机制;只能用于location上下文;
常用参数:
interval=time检测的频率,默认为5秒;
fails=number:判定服务器不可用的失败检测次数;默认为1次;
passes=number:判定服务器可用的失败检测次数;默认为1次;
uri=uri:做健康状态检测测试的目标uri;默认为/;
match=NAME:健康状态检测的结果评估调用此处指定的match配置块;
- 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
- 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
posted on 2019-07-09 14:33 HowOldAreYou 阅读(279) 评论(0) 编辑 收藏 举报