1. HTTP 正向代理

正向代理是客户端设置代理地址后,通过将代理服务器的 IP 作为源 IP 访问互联网应用服务的代理方式。通过对正向代理访问设置,可以实现限制客户端的访问行为、下载速度、访问记录统计、隐藏客户端信息等目的。
正向代理.png

2. HTTP 反向代理

反向代理:reverse proxy,指的是代理服务器来接受客户端的网络访问连接请求,然后代理服务器将请求有策略的转发给网络中实际工作的业务服务器,并将从业务服务器处理的结果,返回给网络上发起连接请求的客户端。
Nginx 除了可以在提供高性能的 web 服务外,还可以将 nginx 本身不能处理的请求通过某种预定义的协议转发至其它业务服务器处理,不同的协议就是 Nginx 服务器与其他业务服务器进行通信的一种规范。
Nginx 主要使用以下模块实现不同的反向代理功能:

  • ngx_http_proxy_module:将客户端的请求以 http 协议转发至指定服务器
  • ngx_http_upstream_module:用于定义 proxy_pass、fastcgi_pass、uwsgi_pass 等指令引用的后端服务器分组
  • ngx_stream_proxy_module:将客户端的请求以 tcp 协议转发至指定服务器
  • ngx_http_fastcgi_module:将客户端对 php 的请求以 fastcgi 协议转发至指定服务器
  • ngx_http_uwsgi_module:将客户端对 Python 的请求以 uwsgi 协议转发至指定服务器

逻辑架构图:
Nginx反向代理架构图.png

2.1 单个服务反向代理

ngx_http_proxy_module 模块官方文档

  • proxy_pass URL;

用于设置代理服务器的协议和地址和端口,协议可以指定 “HTTP” 或 “HTTPS”,地址可以指定为域名或 IP 地址,以及一个可选端口。一般只作用于 localtion 域中。

  1. location /web {
  2. index index.html;
  3. proxy_pass http://192.168.0.100:8000;
  4. proxy_pass http://192.168.0.100:8000/uri;
  5. }

注意:URL 后面有没有 / 符合区别很大,无 / 符号,则表示和后端业务服务器的访问路径一致;有 / 符号,则表示使用了 uri 对访问路径进行了重定向。

  • 无 / 符号时,访问时会将 location 后面的 url 附加到 proxy_pass 指定的 url 后面,即当用户请求为http://nginx/web/index.html 时,实际转发到业务服务器路径为 http://192.168.0.100:8080/web/index.html, 如果后端服务器根路径下没有 web 目录会报错。
  • 有 / 符号时,访问时会将 location 后面的 url 重定向到 proxy_pass 的 /uri 目录,即当用户请求为 http://nginx/web/index.html 时,实际转发到业务服务器路径为 http://192.168.0.100:8080/uri/index.html,后端服务器需要有对应的 uri 目录。这里的 uri 可以为空,即根路径。

另外,如果 location 定义 uri 时使用了正则表达式模式(包括~,~*,但不包括^~),则 proxy_pass 之后不能使用 uri,用户请求时传递的 uri 将直接附加至后端服务器之后。

  • proxy_hide_header FIELD;

用于在返回给客户端 http 响应时,隐藏后端服务器相应头部的信息,可以设置在 http,server 或 location域中。

  1. location /web {
  2. index index.html;
  3. proxy_pass http://192.168.0.100:8080/;
  4. proxy_hide_header ETag;
  5. }
  • proxy_pass_header FIELD;

默认 nginx 在响应报文中不传递后端服务器的首部字段,如 Date,Server,X-Pad,X-Accel等参数,如果要传递的话则要使用 proxy_pass_header 指令声明将后端服务器返回的值传递给客户端,FIELD 首部字段大小不敏感。

  1. location /web {
  2. index index.html;
  3. proxy_pass http://192.168.0.100:8080/;
  4. proxy_pass_header Server;
  5. proxy_pass_header Date;
  6. }

为了方便反向代理的配置,一般会把通用的代理配置写在proxy.conf文件中。使用时,通过主配置文件nginx.conf使用include指令加载即可。proxy.conf文件内容如下:

  1. cat proxy.conf
  2. proxy_buffering on; # 启用响应数据缓冲区
  3. proxy_buffers 8 8k; # 设置每个 HTTP 请求读取上游服务器响应数据缓冲区的大小为 64 KB
  4. proxy_buffer_size 8k; # 设置每个 HTTP 请求读取响应数据第一部分缓冲区的大小为 8 KB
  5. proxy_busy_buffers_size 16k; # 接收上游服务器返回响应数据时,同时用于向客户端发送响应的缓冲区的大小为 16KB
  6. proxy_limit_rate 0; # 不限制每个 HTTP 请求每秒读取上游服务器响应数据的流量
  7. proxy_request_buffering on; # 启用客户端 HTTP 请求读取缓冲区功能
  8. proxy_http_version 1.1; # 使用 HTTP 1.1 版本协议与上游服务器建立通信
  9. proxy_connect_timeout 5s; # 设置与上游服务器建立连接的超时时间为5s
  10. proxy_intercept_errors on; # 拦截上游服务器中响应码大于300的响应处理
  11. proxy_read_timeout 60s; # 从上游服务器获取响应数据的间隔超时时间为60s
  12. proxy_send_timeout 60s; # 向上游服务器发送请求的间隔超时时间为60s
  13. # 设置发送给上游服务器的头属性字段Host为客户端请求头头字段Host的值
  14. proxy_set_header Host $host:$server_port;
  15. # 设置发送给上游服务器的头属性字段 Referer 为客户端请求头头字段的值 Host
  16. proxy_set_header Referer $http_referer;
  17. # 设置发送给上游服务器的头属性字段 Cookie 为客户端请求头头字段的值 Host
  18. proxy_set_header Cookie $http_cookie;
  19. # 设置发送给上游服务器的头属性字段 X—Real—IP 为客户端的 IP
  20. proxy_set_header X-Real-IP $remote_addr;
  21. # 设置发送给上游服务器的头属性字段 X-Forwarded-For 为客户端请求头的 X-Forwarded-For 的值,如果没有该字段,则等于 $remote_addr
  22. proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  23. # 设置发送给上游服务器的头属性字段 X—Forwarded—Proto 为请求协议的值
  24. proxy_set_header X-Forwarded-Proto Sscheme;

nginx.conf的 http 指令域中引入该文件即可:

  1. http {
  2. include proxy.conf
  3. ...
  4. }

Nginx 的指令支持在指令域中对上级指令域指令的继承和修改,如果对proxy.conf有特殊配置需求的,可以在 server 指令域中添加同名指令。
反向代理配置示例:

  1. server {
  2. listen 8088;
  3. tcp_nodelay off; # 因启用缓冲区功能,所以关闭立即发送功能
  4. location / {
  5. proxy_force_ranges on; # 强制启用字节范围请求支持
  6. proxy_pass http://10.0.0.100:8082;
  7. }
  8. }

2.2 多服务反向代理

ngx_http_upstream_module 模块官方文档
http_upstream 模块可以自定义一组服务器,提供服务器组转发、权重分配、状态监测、调度算法等高级功能。配置在 http 域中。

  1. upstream name {
  2. server ..... ......
  3. }

3. WebSocket代理

  1. server {
  2. server_name stg1-wop.wpgjcs.com
  3. ssl on;
  4. listen 443;
  5. ssl_certificate /etc/nginx/stg1/certs/stg1-wop.wpgjcs.com.pem;
  6. ssl_certificate_key /etc/nginx/stg1/certs/stg1-wop.wpgjcs.com.key;
  7. ssl_session_timeout 10m;
  8. ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
  9. ssl_ciphers AES128-SHA:AES256-SHA:RC4-SHA:DES-CBC3-SHA:RC4-MD5;
  10. ssl_prefer_server_ciphers on;
  11. server_tokens off;
  12. charset utf-8;
  13. access_log /etc/nginx/logs/stg1/wop-access.log main;
  14. location /{
  15. proxy_set_header Host $host;
  16. proxy_set_header X-Real-IP $remote_addr;
  17. proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  18. proxy_set_header X-Forwarded-Proto $scheme;
  19. # WebSocket配置
  20. proxy_set_header Upgrade $http_upgrade;
  21. proxy_set_header Connection "Upgrade";
  22. proxy_read_timeout 600s;
  23. proxy_pass http://172.16.198.183:8181/;
  24. }
  25. }
  26. server {
  27. server_name stg1-wop.wpgjcs.com
  28. listen 80;
  29. rewrite ^(.*)$ https://$host$1 permanent;
  30. }

4. TCP/UDP 反向代理

Nginx 在 1.9.0 版本开始支持 tcp 模式的负载均衡,在 1.9.13 版本开始支持 udp 协议的负载,udp 主要用于 DNS 的域名解析,配置方式和指令和 http 代理类似,基于 ngx_stream_proxy_module 模块实现 tcp 代理,另外基于模块 ngx_stream_upstream_module 实现后端服务器分组转发、权重分配、状态监测、调度算法等高级功能。
如果编译安装,需要指定 --with-stream 选项才能支持 ngx_stream_proxy_module 模块。

  1. stream {
  2. include /home/posx/nginx/conf/TIDBconf/*.conf;
  3. resolver 172.16.0.100 valid=300s; # 配置域名解析服务器
  4. resolver_timeout 2s;
  5. upstream mysql-dev {
  6. # 定义调度算法
  7. least_conn;
  8. #hash $remote_addr consistent;
  9. # 定义服务器组
  10. server 172.16.174.134:3306 weight=1 max_fails=3 fail_timeout=10s;
  11. server dev-db.example.com:3306 weight=1 max_fails=3 fail_timeout=10s;
  12. }
  13. server {
  14. listen 12280;
  15. proxy_connect_timeout 5s; # 连接超时时间
  16. proxy_timeout 10s; # 后端转发超时时间
  17. proxy_pass mysql-dev; # 转发服务器组
  18. }
  19. }