Nginx反向代理以及缓存

    • 链接
    • 关于缓存
    • 环境说明
    • 环境搭建
    • 测试
    • upstream
    • keepalive
    • 健康检查
    • 参考资料

1 链接

个人博客: alex-my.xyz

CSDN: blog.csdn.net/alex_my

2 关于缓存

  • 这里使用proxy_cache来实现缓存。
  • 关于fastcgi_cache请看:
  • proxy_cache配置和fastcgi_cache配置差不多, 所以本文并没有写。
  • 使用proxy_cache后,符合条件的请求,将会直接从反向代理服务器中获取数据,不会向源服务器进行请求。
  • 可以在反向代理服务器中使用proxy_cache, 在源服务器中使用fastcgi_cache。

3 环境说明

4 环境搭建

  • 以下均在mac环境下。
  • nginx配置
    • nginx配置目录: /usr/local/etc/nginx
    • nginx.conf
      worker_processes  2;
      error_log   /usr/local/var/logs/nginx/error.log debug;
      pid        /usr/local/var/run/nginx.pid;
      worker_rlimit_nofile 1024;
      
      events {
          worker_connections  1024;
      }
      
      http {
          include       mime.types;
          default_type  application/octet-stream;
      
          log_format main '$remote_addr - $remote_user [$time_local] '
              '"$request" $status $body_bytes_sent '
              '"$http_referer" "$http_user_agent" '
              '"$http_x_forwarded_for" $host $request_time $upstream_response_time $scheme '
              '$cookie_evalogin';
      
          access_log  /usr/local/var/logs/nginx/access.log  main;
      
          sendfile        on;
          keepalive_timeout  65;
          port_in_redirect off;
      
          # 导入各个网站的详细配置
          include /usr/local/etc/nginx/sites-enabled/*.conf;
      }                                                              
    • 通过nginx.conf最后一行导入各个服务器详细配置
    • sites-enabled/test_server_a.conf
      server {
          listen  8010;
          server_name   127.0.0.1;
      
          root /Users/alex/WWW/test_proxy_1.com;
          error_page 404  /404.html;
      
          location /{
                 index index.html index.htm index.php;
                 if (-e $request_filename) {
                         break;
                 }
                 if (!-e $request_filename) {
                         rewrite ^/(.*)$ /index.php/$1 last;
                         break;
                 }
          }
      
          location ~ .+\.php($|/) {
             root           /Users/alex/WWW/test_proxy_1.com;
             fastcgi_index index.php;
             fastcgi_split_path_info ^(.+\.php)(.*)$;
             fastcgi_param   SCRIPT_FILENAME $document_root$fastcgi_script_name;
             fastcgi_param   PATH_INFO               $fastcgi_path_info;
             fastcgi_param   PATH_TRANSLATED $document_root$fastcgi_path_info;
             fastcgi_pass   127.0.0.1:9000;
             include        fastcgi_params;
          }
          access_log  /Users/alex/WWW/logs/test_proxy_1/access.log;
          error_log  /Users/alex/WWW/logs/test_proxy_1/error.log;
      }
    • sites-enabled/test_server_b.conf
      server {
          listen  8020;
          server_name   127.0.0.1;
          root /Users/alex/WWW/test_proxy_2.com;
          error_page 404  /404.html;
      
          location /{
                 index index.html index.htm index.php;
                 if (-e $request_filename) {
                         break;
                 }
                 if (!-e $request_filename) {
                         rewrite ^/(.*)$ /index.php/$1 last;
                         break;
                 }
          }
      
          location ~ .+\.php($|/) {
             root           /Users/alex/WWW/test_proxy_2.com;
             fastcgi_index index.php;
             fastcgi_split_path_info ^(.+\.php)(.*)$;
             fastcgi_param   SCRIPT_FILENAME $document_root$fastcgi_script_name;
             fastcgi_param   PATH_INFO               $fastcgi_path_info;
             fastcgi_param   PATH_TRANSLATED $document_root$fastcgi_path_info;
             fastcgi_pass   127.0.0.1:9000;
             include        fastcgi_params;
          }
          access_log  /Users/alex/WWW/logs/test_proxy_2/access.log;
          error_log  /Users/alex/WWW/logs/test_proxy_2/error.log;
      }
    • 以上搭建了两个服务器做为源服务器,这两个服务器是对用户隐藏的。
    • test_proxy.conf
      upstream test_proxy {
          server 127.0.0.1:8010;
          server 127.0.0.1:8020;
      }
      
      server {
          listen       8080;
          server_name  localhost;
      
          location / {
              index index.php;
              proxy_pass   http://test_proxy; 
      
              proxy_redirect             off;
              #后端的Web服务器可以通过X-Forwarded-For获取用户真实IP
              proxy_set_header           Host $host;
              proxy_set_header           X-Real-IP $remote_addr;
              proxy_set_header           X-Forwarded-For $proxy_add_x_forwarded_for;
              client_max_body_size       10m;
              client_body_buffer_size    128k;
              proxy_connect_timeout      300;
              proxy_send_timeout         300;
              proxy_read_timeout         300;
              proxy_buffer_size          4k;
              proxy_buffers              4 32k;
              proxy_busy_buffers_size    64k;
              proxy_temp_file_write_size 64k;
        }
      }
    • 以上搭建了一个反向代理服务器,是对客户端公开的。
    • upstream里面可以是ip地址,也可以是域名。
    • 客户端通过访问该反向代理服务器,反向代理服务器向源服务器获取信息。
  • 按照配置文件,在相应的位置创建日志文件夹,网站文件夹。
  • 为了测试方便,网站只含有一个文件 index.php
    <?php
    function print_message($flag, $message)
    {
        echo date('Y-m-d H:i:s')."\t {$flag} \t {$message} <br>";
    }
    
    // 127.0.0.1:8010 打开这个
    print_message("NAME", "A is here");
    // 127.0.0.1:8020 打开这个
    // print_message("NAME", "B is here");
    
    print_message("GET", json_encode($_GET));
    
    print_message("POST", json_encode($_POST));

5 测试

  • 运行 nginx -s reload 重载配置。
  • 浏览器中输入对外公开的反向代理服务器的地址127.0.0.1:8080
  • 浏览器会通过轮询源服务器轮流显示A is here, B is here

6 upstream

  • 在前面的示例中,使用了该功能实现轮询源服务器的功能, 也是默认的负载均衡配置。

    upstream test_proxy {
        server 127.0.0.1:8010;
        server 127.0.0.1:8020;
    }
    
    server {
        listen 80;
        location / {
            proxy_pass http://test_proxy;
        }
    }
  • 除了轮询外,upstream还有其它的分配策略。
  • weight
    • 允许指定轮询权重,特别是当源服务器性能不同的情况下适用, 权重越高,被访问的比率也越大。
    upstream test_proxy {
        server 127.0.0.1:8010 weight=5;
        server 127.0.0.1:8020 weight=1;
    }
  • ip_hash
    • 根据请求的ip地址的hash结果进行分配,这样,每个访客会访问同一个源服务器,解决session问题。
    • 不过,实际上当用户切换ip或者改变源服务器数量时,都可能使得用户访问的源服务器不同。解决session的问题需要用另外的方法。
    upstream test_proxy {
        ip_hash;
        server 127.0.0.1:8010;
        server 127.0.0.1:8020;
        server 127.0.0.1:8030;
    }
  • least_conn
    • 把请求放给连接数较少的源服务器,通过比较每个源服务器的conns/weight,来选取值最小的源服务器。
    upstream test_proxy {
        least_conn;
        server 127.0.0.1;
        server 10.12.47.20;
        server 10.12.47.21;
        server 10.12.47.22 down;
        server 10.12.47.22 backup;
    }
  • down: 表示该服务器不参与负载。
  • backup: 当其它服务器繁忙或者都失效的时候,就会启用这台服务器,平常不参与负载。

7 keepalive

8 健康检查

  • 反向代理将会对源服务器进行健康检查,如果源服务器返回connect refusetime outinvalid_header,如果次数累计到max_fails,那么会认为源服务器已经挂掉,将会在fail_timeout分钟内或者全部节点够挂掉之前不会再去连接。
  • 如果在配置中有设置了proxy_next_upstream,那么可以对500,502,503,504,429也会叠加max_fails
  • 即使在proxy_next_upstream中配置了403, 404, 即使触发了也不会叠加max_fails
  • fail_timeout后或者全部节点包括备用节点都挂了,那么会将失效的节点置为有效。
  • max_fails默认为1,设置为0表示不检查。
  • fail_timeout默认为10秒。
  • 示例
upstream test_proxy {
    server 10.12.47.20 weight=5;
    server 10.12.47.21:8080 max_fails=3 fail_timeout=30s;
    server backup.alex-my.xyz  backup;
}

server {
        listen 80;
        location / {
            proxy_pass http://test_proxy;
            proxy_next_upstream http_500 http_502 http_503 http_504 http_429 error timeout invalid_header;
        }
    }
  • 当为写请求的时候,请慎用proxy_next_upstream, 向源服务器1请求超时,会将请求分配的下一个源服务器2。这样就会触发多次处理,比如充值多次。
  • fail_timeout需要设置适当的值,当一个请求在源服务器上需要大量时间完成时,如果超过了fail_timeout,那么反向代理服务器就会请求下一个源服务器,如此反复,源服务器就容易出事了。

9 参考资料

时间: 2025-01-01 18:01:46

Nginx反向代理以及缓存的相关文章

Nginx 反向代理可以缓存 HTTP POST 请求页面吗?

Nginx 反向代理可以缓存 HTTP POST 请求页面吗?  2017-09-05 景峯 Netkiller 本文节选自<Netkiller Web 手札> 作者:netkiller 网站:http://www.netkiller.cn 答案是可以!  因为nginx 使用 url 作为缓存的key ( Nginx 将url地址 md5后作为缓存的 key ),所以默认情况下 Nginx 只能处理 HTTP GET 缓存. 对于 HTTP POST 请求,提交数据放在HTTP Head 头

Nginx 反向代理、负载均衡、页面缓存、URL重写以及读写分离

1.环境准备 前端Nginx:10.160.65.44 后端WEB服务器两台:10.160.65.49/10.160.65.50 2.安装Nginx: 下载nginx-1.9.15.tar.gz,放置在目录/usr/local/src目录下面,解压. ./configure make & make install 在/usr/local/目录下生成了nginx目录 configure的时候可以带很多参数,参数的详细解释如下: –prefix= 指向安装目录 –sbin-path 指向(执行)程序

nginx反向代理缓存配置步骤详解

这里给出示例,并详解. http { [...] [...]   proxy_cache_path  /data/nginx/cache/one  levels=1:2   keys_zone=one:10m max_size=10g; proxy_cache_key  "$host$request_uri";   server {     server_name www.centos.bz centos.bz;     root /home/www.centos.bz/web;   

使用Nginx反向代理实现简单的负载均衡

Nginx反向代理的原理优点: 反向代理可以简单的理解为:代理服务器来接收internet上的服务器请求,然后将请求转发给内部的服务器上,然后将结果返回给internet上请求的客户端,所以代理服务器对外表现出来的只是一台服务器.反向代理服务器也称为Web服务器加速,针对web服务器提供加速功能.他作为代理服务器,并不针对浏览器用户,而是针对一台或者多台特定的web服务器.可以缓存web的页面,降低web服务器的访问量,从而来降低web服务器的负载,实施反向代理,只要将反向代理设备放置在一台或多

Nginx反向代理,负载均衡,redis session共享,keepalived高可用

相关知识自行搜索,直接上干货... 使用的资源: nginx主服务器一台,nginx备服务器一台,使用keepalived进行宕机切换. tomcat服务器两台,由nginx进行反向代理和负载均衡,此处可搭建服务器集群. redis服务器一台,用于session的分离共享. nginx主服务器:192.168.50.133 nginx备服务器:192.168.50.135 tomcat项目服务器1:192.168.50.137 tomcat项目服务器2:192.168.50.139 redis服

Tomcat安装+Nginx反向代理Tomcat+Apache使用mod_jk+mod_proxy反向代理和负载均衡【图解】

一.Tomcat简介 Tomcat是Apache软件基金会(Apache Software Foundation)的Jakarta 项目中的一个核心项目由Apache.Sun 和其他一些公司及个人共同开发而成.由于有了Sun 的参与和支持最新的Servlet 和JSP 规范总是能在Tomcat 中得到体现Tomcat 5 支持最新的Servlet 2.4 和JSP 2.0 规范.因为Tomcat 技术先进.性能稳定而且免费因而深受Java 爱好者的喜爱并得到了部分软件开发商的认可成为目前比较流行

Nginx反向代理+DNS轮询+IIS7.5 千万PV 百万IP 双线 网站架构案例_nginx

Nginx  ("engine x") 是一个高性能的 HTTP 和反向代理服务器,也是一个 IMAP/POP3/SMTP 代理服务器. Nginx 是由 Igor Sysoev 为俄罗斯访问量第二的 Rambler.ru 站点开发的,它已经在该站点运行超过两年半了.Igor 将源代码以类BSD许可证的形式发布. Nginx 的中文维基:http://wiki.codemongers.com/NginxChs 在高并发连接的情况下,Nginx是Apache服务器不错的替代品.Nginx

配置nginx反向代理用做内网域名转发

情景 由于公司内网有多台服务器的http服务要映射到公司外网静态IP,如果用路由的端口映射来做,就只能一台内网服务器的80端口映射到外网80端口,其他服务器的80端口只能映射到外网的非80端口.非80端口的映射在访问的时候要域名加上端口,比较麻烦.并且公司入口路由最多只能做20个端口映射.肯定以后不够用. 然后k兄就提议可以在内网搭建个nginx反向代理服务器,将nginx反向代理服务器的80映射到外网IP的80,这样指向到公司外网IP的域名的HTTP请求就会发送到nginx反向代理服务器,利用

详解Nginx反向代理和负载均衡部署指南_nginx

Nginx反向代理和负载均衡部署指南,具体如下: 1.  安装 1) 从Nginx官网下载页面(http://nginx.org/en/download.html)下载Nginx最新版本(目前是1.5.13版本)安装包: 2)  解压后复制到部署目录.  2.  启动和停止Nginx Nginx目前只支持命令行操作,操作前先进入Dos命令环境,并进入Nginx部署目录. 1) 启动Nginx:start nginx 2)  停止Nginx:nginx -s stop 3)修改配置后重启:ngin