什么是代理
在计算机中, 客户端 A 与服务端 B 进行同行, 中间加入中介 C 进行数据传递, 则形成了代理. 来个浅显易懂的比喻, 三年级二班小明和小花谈恋爱, 由于小明和小花座位离的太远, 这时候需要小王在中间传递纸条, 在这个爱情故事中小王在中间充当了代理作用.
什么是正向代理呢
正向代理中, 客户端通过代理服务器从服务端收发数据, 即为正向代理.
举个栗子: 有一个局域网, 但是只有主机局域访问外部网络的权限, 现在所有的机器都需要访问外部网络, 通过将主机设置为代理服务器, 让所有的机器通过主机可以访问外部网络, 即称为正向代理.
正向代理示意图
反向代理又是什么
反向代理中, 代理服务器替服务端收发数据, 所有的请求与相应都经过反向代理, 可以用来实现数据缓存, 负载均衡等.
举个栗子: 张三开了一个保险公司 (服务端), 一开始公司业务小, 一个人接电话就够了, 后来随着公司扩张, 每天无数电话打进来, 张三招了一个客服李四 (代理), 张三把和客户对接的事情都交给了李四, 形成了反向代理.
反向代理示意图
反向代理常用配置
- server {
- listen 80;
- server_name localhost; #实际情况可以写域名
- location / {
- index index.html index.htm;
- proxy_set_header Host $host:$server_port;
- proxy_pass http://127.0.0.1:9992;
- rewrite ^/(.*) /index.php?s=$1;
- }
- }
配置项很多, 挑几个几个常用的配置依次介绍: location,proxy_set_header,rewrite,proxy_pass
代理目录匹配 location
- # 匹配所有根目录
- location /
- # 字符串匹配, 表示匹配所有 "/static" 开头的目录
- location /static
- # ~ 匹配符合表达式目录比如代理目录中存在 "static/(js|images)" 的目录
- location ~ /static/(js|images)/
- # ~* 加上 * 表示不区分大小写
- location ~ /static/(js|images)/
- # = 表示精确匹配, 只有 "/index" 路径才会被代理,"/index/test" 将不会被代理
- location = /index
当然还有 "!","^" 匹配, 用的比较少, 这里不做说明
设置代理请求头 proxy_set_header
- # 设置代理请求服务器请求头 host
- proxy_set_header Host $host
- # 设置代理请求的 ip 地址
- proxy_set_header X-Forwarded-Ip $remote_addr
- # 设置代理请求自定义数据
- proxy_set_header test test
这里还有很多数据, 不一一说明
请求代理服务器 proxy_pass
- # 从 "127.0.0.1" 这台服务器收发数据, 当然也可以直接写域名
- proxy_pass http://127.0.0.1:8080
- # 从服务端机器 data 目录收发数据
- proxy_pass http://127.0.0.1:81/data;
- # 动态配置数据,$scheme 表示用户请求是 http 还是 https,$host 表示客户端请求头 host,$args 表示客户端请求参数
- proxy_pass $scheme://$host/$request_uri/?$args
url 重定向规则 rewrite
包含 3 个参数:
rewrite 匹配规则 重定向规则 重定向类型;
用法示例:
- # /a.html 的时候, url 重定向路径 /b.html 中
- rewrite /a.html /b.html last;
- # break 与 last 的区别是, 当存在多条 rewrite 规则时 last 会继续往下匹配, break 不会继续往下匹配, 而是将匹配到的重定向路径当做最终路径
- rewrite /a.html /b.html break;
- # 当然重定向规则也是可以写正则表达式的 例如:/static/images/a.png => /local/images/a.png
- rewrite ^/static/images/(.*)$ /local/images/$1 break;
- # redirect 表示 302 重定向
- rewrite /a.html /b.html redirect;
- # permanent 表示 301 重定向
rewrite /a.html /b.html permanent;
301 重定向表示永久性重定向, 对于 SEO 相较 302 来说比较友好, 这里不做过多说明.
部分参考
nginx doc https://www.nginx.com/resources/admin-guide/reverse-proxy/
nginx rewrite 配置 https://xuexb.com/post/nginx-url-rewrite.html
来源: http://www.jianshu.com/p/d074495d08c2