nginx反向代理

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了nginx反向代理相关的知识,希望对你有一定的参考价值。

nginx反向代理、负载均衡、缓存、URL重写及读写分离

Nginx配置文件


server {

   listen 80;

   server_name   www.mylinux.com;

   location / {

      后端服务器:

   }


反向代理:

proxy_pass

Nginx通过proxy模块实现反向代理,在作为web反向代理服务器时,nginx负责接收客户端请求,并能够根据URI,客户端参数或其他的处理逻辑将用户请求调度至上游服务器上(upstream server),nginx在实现反向代理功能时的最重要指令为proxy_pass,她能够将,location定义为某URI代理至指定的上游服务器(组)上,如下面所示列中,localtion的/forum将被替换为上游服务器上的/bbs

location /forum/ {

   proxy_pass     http://172.16.100.11:8080/bbs/;


http://www/mylinux.com/forum

          -->http://172.16.100.11:8080/bbs/;


-----------------------------------------------------

不过,这种处理机制中有两个例外,一个是如果location的URI是通过模式匹配定义的,其URI将直接被传递至上游服务器,而不能为其指定转换的另一个URI,列如下面

location ~* ^/forum {

   proxy_pass     http://172.16.100.11:8080/;

http://www/mylinux.com/forum

          -->http://172.16.100.11:8080/forum/;


-----------------------------------------------------

第二个列外是,如果在location中使用URL重定向,那么nginx将使用重定向后的URI处理请求,而不再考虑上游服务器定义URI,如下面所示的列子中,传送给上游服务器的URI为index.php?page=<match>,而不是/index.

location / {

   rewrite  / (.*)$ /index.php?page=$1 break;

   proxy_pass     http://localhost:8080/index;

--------------------------------------------------

实验:

在192.168.1.11上转上web服务 作为后端服务器;

通过192.168.1.10上的nginx代理;

192.168.1.11:

[[email protected] ~]# yum -y install httpd

[[email protected] ~]# mkdir /var/www/html/bbs

[[email protected] ~]# vim /var/www/html/bbs/index.html

[[email protected] ~]# service httpd start

192.168.1.10:

         location  /forum/ {

             proxy_pass    http://192.168.1.11/bbs/;

          }

----------------------------------------------------

实验2:

192.168.1.11:

[[email protected] html]# mv bbs forum


192.168.1.10:

         location ~* ^/forum {

             proxy_pass    http://192.168.1.11;

          }

[[email protected] ~]# service httpd restart


----------------------------------------------------

让后台的http服务器日志信息记录客户端访问ip而不是nginx的ip

192.168.1.10:

         location ~* ^/forum {

             proxy_pass    http://192.168.1.11;

             proxy_set_header X-Real-IP $remote_addr;

          }

192.168.1.11:

[[email protected] ~]# vim /etc/httpd/conf/httpd.conf 

LogFormat "%{X-Real-IP}i %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined

#LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined

h%代表客户端ip地址。替换成X-Real-IP}i   i表示引用这个值

---------------------------------------------------

把整个网页全部转向后端:

192.168.1.10:

 location /  {

             proxy_pass    http://192.168.1.11/;

             proxy_set_header X-Real-IP $remote_addr;

          }

192.168.1.11:

[[email protected] ~]# vim /etc/httpd/conf/httpd.conf 

LogFormat "%{X-Real-IP}i %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined

#LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined


--------------------------------------------------------------

nginx实现负载均匀,以及后台健康状态检查:

upstream:定义一个组 实现负载均匀:

192.168.1.11 http

192.168.1.12 http

192.168.1.10 nginx

一.192.168.1.10: 定义upstream,必须在server以外,weight=权重

#gzip  on;

    upstream websrvs {

    ip_hash;将同一个客户端请求始终定义到同一台服务器(此时权重就没多大意义了)

    server 192.168.1.11 weight=1 max_fails=2 fail_timeout=2;  max_fails最多检查几次 

    server 192.168.1.12 weight=1 max-fails=2 fail_timeout=2;  fail_timeout几秒后检查超时,直接切换

    #server 127.0.0.1:8080 backup;错误页面(在ip_hash模式下不允许使用此项)


}


    server {

二.反向代理不再是某一个主机,而是定义的upstream组

    location /  {


            proxy_pass    http://websrvs/;

            proxy_set_header X-Real-IP $remote_addr;

        }


############################################

在server以外重新定义一个server用作错误页面。

upstream

#server 127.0.0.1:8080 backup;错误页面(在ip_hash模式下不允许使用此项)


    server {

            listen          8080;

            server_name     localhost;

            root            /web/errorpages;

            index           index.html;

           }


[[email protected] ~]# mkdir /web/errorpages

[[email protected] ~]# vim /web/errorpages/index.html 

-------------------------------------------

nginx: 三种负载均衡算法

   round-robin 加权循环调度算法(默认)

   ip_hash 同一个客户端请求始终定义到一台服务器

   least_conn  挑选当前连接数最少的服务器来响应


-------------------------------------------------------

[[email protected] ~]# netstat -ant |awk ‘/:80\>/{S[$NF]++}END{for(A in S){print A,S[A]}}‘

LISTEN 1

------------------------------------------------------------------

nginx使用缓存

 cache:共享内存(存储键和缓存对象元数据)

        磁盘空间:存储数据


proxy_cache_path:不能定义在server{}上下文中:


缓存目录的子目录级别

proxy_cache_path /nginx/cache/first levels=1:2:1 keys_zone=first:20m max_size=1g;

cache_manager: LRU 清除缓存


/nginx/cache/first 缓存目录

levels:定义有三级缓存,名称长度:1级缓存目录1个字符,2级缓存目录2个字符,3级缓存目录1个字符,最多只能有3级,每一级目录字符最多只能有2个

keys_zone 给共享内存命名,用来存储键的区域,定义内存区域有多大,可以定义多个共享内存。

max_size 最大使用多少空间来存储缓存对象(/nginx/cache/first)

实验:

     location /  {


            proxy_pass    http://websrvs/;

            proxy_set_header X-Real-IP $remote_addr;

            proxy_cache first;定义使用缓存

            proxy_cache_valid 200  10m; 定义返回值为200的网页缓存10分钟    

    }


。。。。。



proxy_cache_path /nginx/cache/first levels=1:2 keys_zone=first:20m max_size=1g;

add_header X-Cache "$upstream_cache_status from $server_addr";显示缓存是否命中

[[email protected] nginx]# mkdir -pv /nginx/cache/first

[[email protected] nginx]# service nginx reload

-------------------------------------------

proxy_cache_valid any 1m     指定某些页面缓存的时间,any 1m表示多有都缓存1分钟

                  404  1h

----------------------------------------------------------------------------------------


另外三种缓存:

  open_log_cache 日志文件的缓存,可以先把日志保存在内存 之后在同步到磁盘,降低磁盘IO

  open_file_cache  将打开的文件直接缓存到内存中。

  fastcgi_cache  fastcgi的缓存,慎用。


---------------------------------------

51:30


本文出自 “运维成长路” 博客,谢绝转载!

以上是关于nginx反向代理的主要内容,如果未能解决你的问题,请参考以下文章

用nginx反向代理的问题?(详内)

Nginx简单粗暴的反向代理教程

nginx反向代理数据传输能提高数据响应么?

Nginx 最全操作——nginx反向代理(5)

Nginx 如何设置反向代理

nginx反向代理三种模式