博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
nginx反向代理相关配置(一)
阅读量:7119 次
发布时间:2019-06-28

本文共 10154 字,大约阅读时间需要 33 分钟。

一, 实现nginx反代理功能

所谓反代理功能就是将用户的请求转发至后端的某一台web服务器,而nginx不仅可以转发用户请求,并且还可以根据用户请求的URL来决定转发至那一台后端服务器。

相关模块ngx_http_proxy_module

1,设置反代理功能

指令

语法:proxy_pass URL;    可用在:location, if in location, limit_except

注意事项

示例:        server {                   listen 80;                root /nginx/html;                server_name www.b.com;                   location /bbs {                            proxy_pass http://www.a.com; "最后没有/"                }                   ...          }     "什么是URL,就是域名后面的第一个/开始往后的才算URL,例如:http://www.a.com/bbs 这网址的URL就是/bbs"    上面示例:如果proxy_pass没有跟URL 那么访问此网页http://www.b.com/bbs 将访问的是后端服务器的此网页--> http://www.a.com/bbs      如果上面示例中有"/",即:http://www.a.com/   意味着置换:当访问此网页http://www.b.com/bbs 将置换为,也就是访问后端服务器的主网页--> http://www.a.com/   proxy_pass后面的路径是一个uri时,其会将location的uri替 换为proxy_pass的uri     server {              ...              server_name HOSTNAME;              location /uri/ {                   proxy_pass http://host/new_uri/;              }              ...     }         即:http://HOSTNAME/uri/ --> http://host/new_uri/如果location定义其uri时使用了正则表达式的模式,则 proxy_pass之后必须不能使用uri; 用户请求时传递的uri将直 接附加至后端服务器之后         server {              ...              server_name HOSTNAME;              location ~|~* /uri/ {                   proxy_pass http://host; "不能加/"             }              ...     }         即:http://HOSTNAME/uri/ --> http://host/uri/

示例:实现nginx反向调度服务器,动,静分离调度

server {        listen 80;        root /nginx/html/;        index index.html        server_name www.a.com;        location /bbs {                proxy_pass http://www.b.com/index.html;        }        location ~* .*\.php$ {                proxy_pass http://www.c.com;        }}上面的例子就是:    1,当用户访问www.a.com时将返回调度器本机的index.html文件    2,当用户访问www.a.com/bbs时将被调度之后端的www.b.com主机并将URL替换至http://www.b.com/index.html,也就是间接的访问了www.b.com主机的index.html页面了。    3,当用户访问www.a.com/index.php动态程序时将被调度至后端的www.c.com主机中的php动态程序,日志    www.b.com主机的日志        192.168.68.7 - - [24/Mar/2018:12:22:51 +0800] "GET /index.php HTTP/1.0" 200 5 "-" "curl/7.19.7 (x86_64-redhat-linux-gnu) libcurl/7.19.7 NSS/3.21 Basic ECC zlib/1.2.3 libidn/1.18 libssh2/1.4.2"    www.c.com主机的日志        192.168.68.7 - - [23/Mar/2018:23:08:02 +0800] "GET / HTTP/1.0" 200 25 "-" "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.168 Safari/537.36"    "注意:为什么两个web服务器显示客户端IP都是一个,因为是nginx代理客户端访问数据再将数据转给客户端"

2,设定发往后端主机的请求报文的请求首部和值

语法:proxy_set_header field value;    可用在:http, server, location     相关参数:        field:可以是任意字符串,该字符串必须与后端的web的日志记录格式中的字符串一样,否则将不会记录该请求报文的首部信息    value变量        $remote_addr:            表示客户端的IP地址        $proxy_add_x_forwarded_for:            带有$remote_addr变量的“X-Forwarded-For”客户机请求标头字段,用逗号分隔。如果“X-Forwarded-For”字段在客户机请求头中不存在,则该$proxy_add_x_forwarded_for变量等于该$remote_addr变量。        $proxy_port            proxy_pass指令中指定的代理服务器 的端口或协议的默认端口;        $proxy_host            proxy_pass指令中指定的代理服务器的名称和端口 ;

示例:修改发往后端服务器的请求报文,设定后端主机的日志记录,实际客户端IP地址

实现步骤:

客户端IP:192.168.68.16    调度器IP:192.168.68.7    1,修改调度器的主配置文件添加如下内容        server {            listen 80;            root /nginx/html/;            server_name www.a.com;            index index.html;            location /bbs {                    proxy_pass http://www.c.com/;                    proxy_set_header client_ip $remote_addr;            }            location ~* .*\.php$ {                    proxy_pass http://www.b.com;                    proxy_set_header client_ip $remote_addr;            }        }    2,启动调度器服务        systemctl restart nginx    3,在后端的web服务器修改http主配置文件中的计入日志的配置段        原:LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined        修改后:LogFormat "%{client_ip}i %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined            "注意:%h表示客户端的IP地址,%{client_ip}i就是在调度器中定义的请求报文首部,注意格式请求报文首部必须用{}i,至于没什么,因为没有为什么,这么写就对了"    4,确认日志记录是调用该格式        CustomLog "logs/access_log" combined            注意:CustomLog配置段最后的"combined"表示调用的那个日志记录格式    5,启动后端web服务器服务        systemctl restart httpd    6,查看后端服务器的访问日志        没有配置前的访问日志            192.168.68.7 - - [24/Mar/2018:12:16:07 +0800] "GET /index.php HTTP/1.0" 200 5 "-" "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.168 Safari/537.36"        "配置后"            192.168.68.16 - - [24/Mar/2018:16:24:15 +0800] "GET /index.php HTTP/1.0" 200 10 "-" "curl/7.19.7 (x86_64-redhat-linux-gnu) libcurl/7.19.7 NSS/3.21 Basic ECC zlib/1.2.3 libidn/1.18 libssh2/1.4.2"

3,开启代理缓存存功能,加快用户访问速度

定义缓存

语法:proxy_cache_path path [levels=levels] [use_temp_path=on|off] keys_zone=name:size [inactive=time] [max_size=size] [manager_files=number] [manager_sleep=time] [manager_threshold=time] [loader_files=number] [loader_sleep=time] [loader_threshold=time] [purger=on|off] [purger_files=number] [purger_sleep=time] [purger_threshold=time];          "注意【】中括号里的表示可选值"     "可用在的:http语句块中"    指令解析:        path:            指定缓存临时存放目录路径        levels=levels:            设置缓存的路径和其他参数。缓存数据存储在文件中。缓存中的文件名是将MD5函数应用于 缓存键的结果。该levels参数定义了缓存的层次结构级别:从1到3,每个级别接受值1或2.例如,在以下配置中                proxy_cache_path / data / nginx / cache levels = 1:2 keys_zone = 1:10m;            缓存中的文件名将如下所示:"一级目录是URL哈希值16进制的最后一位,二级目录是哈希值最后一位的前两位"                / data / nginx / cache / c / 29 / b7f54b2df7773722d382f4809d650 29c        use_temp_path=on|off:            临时文件的目录根据use_temp_path参数设置,如果省略此参数或将其设置为该值on,则将使用proxy_temp_path指令为给定位置设置的目录。如果该值设置为off,临时文件将直接放入缓存目录中        "keys_zone=name:size:            注意此指令必须定义,该值是定义缓存的名字也就是之后在其他配置段中方便调用,给多大内存用来做缓存用户请求的页面内容,例如:keys_zone=1:1g"        inactive=time(s|m|h|d):            在inactive参数指定的时间内未访问的缓存数据将从缓存中删除,而不管其新鲜度如何。默认情况下,inactive设置为10分钟        max_size=10g:            表示这个zone的硬盘容量为10GB        purger= on|off            指示缓存 清除程序是否将从磁盘中删除与通配符键匹配的缓存条目 。将参数设置为on(默认为off)将激活“缓存清除器”进程,该进程永久遍历所有缓存条目并删除与通配符键匹配的条目。        purger_files=number            设置在一次迭代期间将被扫描的项目数量。默认情况下,purger_files设置为10        purger_threshold=number            设置一次迭代的持续时间。默认情况下,purger_threshold设置为50毫秒。        purger_sleep=number            在迭代之间设置暂停。默认情况下,purger_sleep设置为50毫秒。

2,调用缓存

调用缓存功能,需要定义在相应的配置段,如server{...};         在被代理的后端服务器出现哪种情况下,可以真接使用过 期的缓存响应客户端             proxy_cache_use_stale;  proxy_cache_use_stale error | timeout | invalid_header | updating | http_500 | http_502 | http_503 | http_504 | http_403 | http_404 | off ...         对哪些客户端请求方法对应的响应进行缓存,GET和 HEAD方法总是被缓存             proxy_cache_methods GET | HEAD | POST ...;        默认nginx在响应报文不传递后端服务器的首部字段Date, Server, X-Pad,X-Accel-等,用于隐藏后端服务器特定的响 应首部            proxy_hide_header field;         定义与后端服务器建立连接的超时时长,如超时会出现 502错误,默认为60s,一般不建议超出75s            proxy_connect_timeout time;         将请求发送给后端服务器的超时时长;默认为60s             proxy_send_timeout time;        等待后端服务器发送响应报文的超时时长,默认为60s             proxy_read_timeout time;

示例:实现代理缓存存功能步骤:

1,定义缓存方法,注意只能在http语句块中定义

http {        ...        proxy_cache_path /var/nginx/cache/proxy_cache  levels=1:2:2 keys_zone=proxycache:20minactive=120s max_size=1g;        ...    }

2,创建定义好的缓存存放路径目录

mkdir /var/nginx/cache/proxy_cache

3,调用

server {            listen 80;            root /nginx/html/;            server_name www.a.com;            index index.html;            "proxy_cache proxycache;        #调用keys_zone            proxy_cache_key $request_uri;   #对什么进行hash运算,这里指的是客户端请求的URL            proxy_cache_valid 200 302 301 1h; #缓存那些状态码的内容,缓存多长时间,1h表示1小时            proxy_cache_valid any 1m;" #这里指的是其他的状态码的内容,只缓存1分钟            location /bbs {                    proxy_pass http://www.c.com/;                    proxy_set_header client_ip $proxy_port-$remote_addr;            }            location ~* .*\.php$ {                    proxy_pass http://www.b.com;                    proxy_set_header client_ip $remote_addr;            }    }

**4, 启动调度服务器

systemctl restart nginx

5, 测试

ab -c 10 -n 2000 http://www.a.com/bbs    ab -c 10 -n 2000 http://www.a.com/index.php

6,这时候在调度服务器会出现这样一些目录,这就表示已经开始有缓存了

[root@centos7 ~]# tree /var/nginx/cache/proxy_cache/    /var/nginx/cache/proxy_cache/    └── d        └── 4d            └── f8                └── d3a08c68a64dfb2a23b30dae88a f8 4d d #这个文件就是hash客户端请求得出来的哈希值    3 directories, 1 file

示例:由代理服务器响应给客户端的响应报文添加自定义首部,或 修改指定首部的值

相关模块ngx_http_headers_module

1、添加响应报文首部        语法:add_header name value [always];            可用在:http, server, location, if in location        例如:            add_header X-Via  $server_addr;  #后端服务器地址            add_header X-Cache $upstream_cache_status;  #是否命中缓存,命中就显示"HIT",未命中显示"MISS",或者 REVALIDATED,UPDATIN,GSTALE,EXPIRED,BYPASS            add_header X-Accel $server_name;    #后端服务器域名    2,添加自定义响应信息的尾部         语法:add_trailer name value [always];示例:    server {        listen 80;        root /nginx/html/;        server_name www.a.com;        index index.html;        proxy_cache proxycache;        proxy_cache_key $request_uri;        proxy_cache_valid 200 302 301 1h;        proxy_cache_valid any 1m;        "add_header X-Via  $server_addr;           add_header X-Cache $upstream_cache_status;          add_header X-Accel $server_name;"        location /bbs {                proxy_pass http://www.c.com/;                proxy_set_header client_ip $proxy_port-$remote_addr;        }        location ~* .*\.php$ {                proxy_pass http://www.b.com;                proxy_set_header client_ip $remote_addr;        }    }测试:"未命中缓存:"    [root@centos6 ~]# curl -I http://www.a.com/bbs    HTTP/1.1 200 OK    Server: nginx/1.12.2    Date: Sat, 24 Mar 2018 12:28:34 GMT    Content-Type: text/html; charset=UTF-8    Content-Length: 2097152    Connection: keep-alive    Last-Modified: Fri, 23 Mar 2018 20:17:39 GMT    ETag: "12092f-200000-5681a1dadad02"    X-Via: 192.168.68.7    X-Cache: MISS    X-Accel: www.a.com    Accept-Ranges: bytes"命中缓存:"    [root@centos6 ~]# curl -I http://www.a.com/bbs    HTTP/1.1 200 OK    Server: nginx/1.12.2    Date: Sat, 24 Mar 2018 12:29:28 GMT    Content-Type: text/html; charset=UTF-8    Content-Length: 2097152    Connection: keep-alive    Last-Modified: Fri, 23 Mar 2018 20:17:39 GMT    ETag: "12092f-200000-5681a1dadad02"    X-Via: 192.168.68.7    X-Cache: HIT    X-Accel: www.a.com    Accept-Ranges: bytes

转载于:https://blog.51cto.com/13598893/2090726

你可能感兴趣的文章
[python基础]关于中文编码和解码那点事儿
查看>>
MySQL集群架构-DRBD+headbeat +lvs+keepalived
查看>>
[LUOGU] P2886 [USACO07NOV]牛继电器Cow Relays
查看>>
31. Next Permutation
查看>>
Interactive cloth
查看>>
字符编码【转载】
查看>>
mysql中的事物处理
查看>>
Android 车联网天气
查看>>
POJ 2430 状压DP
查看>>
C++Primer第5版学习笔记(三)
查看>>
Centos7系统介绍
查看>>
GIT简单实用
查看>>
Sonar - 部署常见问题及解决方法
查看>>
IOS 学习笔记(3) 视图UITabbarController
查看>>
java基础知识(一)
查看>>
浏览器的缓存
查看>>
WinForm Read Excel
查看>>
Linux时间子系统之六:高精度定时器(HRTIMER)的原理和实现
查看>>
React开发环境搭建
查看>>
jQuery-ui源代码重点难点分析
查看>>