# 七.代理服务
前言
nginx是一个高性能的反向代理服务器,ngin 在应用程序中的作用
- 解决跨域
- 请求过滤
- 配置 gzip
- 负载均衡
- 静态资源服务器
# 1.正向代理与反向代理
代理
是在服务器和客户端之间假设的一层服务器,代理
将接收客户端的请求并将它转发给服务器,然后将服务端的响应转发给客户端。
# 正向代理
正向代理,意思是一个位于客户端和原始服务器之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),然后代理向原始服务器转交请求并将获得的内容返归给客户端。
正向代理是为我们服务的,即为客户端服务的,客户端可以根据正向代理访问到她本身无法访问到的服务器资源。
正向代理对我们是透明的,对服务端是非透明的,即服务端并不知道自己收到的是来自代理的访问还是来自真实客户端的访问。
location / {
proxy_pass http://$http_host$request_uri;
}
2
3
# 反向代理
反向代理是指以代理服务器来接受 internet 上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给 internet 上请求连接客户端,此时代理服务器对外表现为一个反向代理服务器。
反向代理是为服务端服务的,反向代理可以帮助服务器接受来自客户端的请求,帮助服务器做请求转发,负载均衡等。
反向代理对服务端是透明的,对我们是非透明的,即我们并不知道自己访问的是代理服务器,而服务器知道反向代理在为他服务。
resolver 8.8.8.8;
location ~ ^/api {
proxy_pass http://127.0.0.1:3000;
}
2
3
4
# 2.基本配置
# 配置结构
- main:nginx 的全局配置,对全局生效
- events:配置影响 nginx 服务器或与用户的网路连接。
- http:可以嵌套多个 server,配置代理,缓存,日志定义等大多数功能和第三方模块的配置。
- location:配置虚拟主机的相关参数,一个 http 可以有多个 server
- upstream:配置后端服务器具体地址,负载均衡配置不可或缺的部分。
# 请求跨域
前端 server 的域名为:
fe.server.com
后端服务的域名为:
dev.server.com
现在我在
fe.server.com
对dev.server.com
发起请求一定会出现跨域现在我们只需要启动一个 nginx 服务器,将
server_name
设置为fe.server.com
,然后设置相应的 location 以拦截前端需要跨域的请求,最后将请求代理回dev.server.com
server { listen 80; server_name fe.server.com; location / { proxy_pass dev.server.com } }
1
2
3
4
5
6
7
这样可以完美绕过浏览器的同源策略:fe.server.com
访问nginx
的fe.server.com
属于同源访问,而nginx
对服务端转发的请求不会触发浏览器的同源策略。
# 请求过滤
根据状态码过滤
error_page 500 501 502 503 504 506 /50x.html;
location = /50x.html {
root /root/static/html;
}
2
3
4
根据 URL 名称过滤,精准匹配 URL,不匹配的 URL 全部重定向到主页
# 配置 gzip
GZIP 是规定的三种标准 http 压缩格式之一,目前绝大多数的网站都在使用 GZIP 传输 HTML、CSS、JavaScript 等资源文件。
对于文本文件,GZIP 的效果非常明显,卡其后传输所需的流量大约会将至 1/4~1/3
并不是每个浏览器都支持 gzip 的,如何知道客户端是否支持 gzip 呢,请求头中 Accept-Encoding 来标识对压缩的支持。
启用 gzip 同时需要客户端和服务端的支持,如果客户端支持 gzip 的解析,那么指定要服务端能够返回 gzip 的文件就可以启用 gzip 了,我们可以通过 nginx 的配置来让服务端支持 gzip.下面的 response 中 content-encoding:gzip,指服务端开启了 gzip 的压缩方式。
# gzip
- 开启或者关闭 gzip 模块
- 默认值为 off
- 可以配置 on/off
# gzip_http_version
- 启用 gzip 所需的 http 最低版本
- 默认值为 http/1.1
这里为什么默认版本不是 1.0 呢
http 运行在 tcp 连接之上,自然也有着 tcp 一样的三次握手,慢启动等特性。
启用持久连接情况下,服务器发出响应后让 tcp 连接继续打开着,同一对客户/服务器之间的后续请求和响应可以通过这个连接发送请求。