nginx的反向代理和负载均衡

一、正向代理

正向代理,意思是一个位于客户端和原始服务器(origin server)之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),然后代理向原始服务器转交请求并将获得的内容返回给客户端。客户端才能使用正向代理。

使用正向代理服务器的作用:

1.1 访问本无法访问的服务器B。FQ、VPN技术的应用

1.2 加速访问服务器。代理服务器高带宽,可以加速访问服务器B

1.3 缓存

1.4 客户端访问权限

1.5 隐藏访问者的行踪

二、反向代理

  客户端是无感知代理的存在的,反向代理对外都是透明的,访问者者并不知道自己访问的是一个代理。因为客户端不需要任何配置就可以访问。

  反向代理(Reverse Proxy)实际运行方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个服务器。

反向代理的作用:

1.1 保证内网的安全,隐藏原始服务器

1.2 负载均衡。反向代理多个服务器

2.1 反向代理的配置

user  nginx; #使用者名称
worker_processes  1; #进程数,一般设置和cup内核数一样

#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#pid        logs/nginx.pid;


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"';

    #access_log  logs/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;

    #gzip  on;

    server {
        listen       80;
        server_name  www.myvick.cn; #域名

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        #error_page  404              /404.html;

        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }

        # proxy the PHP scripts to Apache listening on 127.0.0.1:80
        #
        #location ~ \.php$ {
        #    proxy_pass   http://127.0.0.1;
        #}

        # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
        #
        location ~ \.php$ {
            root           html;
            fastcgi_pass   127.0.0.1:9000;
            fastcgi_index  index.php;
            fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
            include        fastcgi_params;
        }
        location / {
       index index.html index.php #默认访问的文件
          root /usr/local/nginx/html #访问文件的目录
           #设置主机头和客户端真实地址,以便服务器获取客户端真实IP

             proxy_set_header Host $host;  #默认情况下反向代理是不会转发请求中的Host头部的。如果需要转发,那么必须加上配置
             proxy_set_header X-Real-IP $remote_addr; #获取web服务器端获得用户的真实ip
             proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; #配置后,web服务器端通过request.getAttribute("X-Forwarded-For")
                                             #获得的将会是客户端ip和第一台nginx的ip
             proxy_method               POST #那么客户端发来的GET请求在转发时方法名也会改为POST
           client_max_body_size       10m; #允许客户端请求的最大单文件字节数
           client_body_buffer_size    128k; #缓冲区代理缓冲用户端请求的最大字节数
            proxy_connect_timeout      300; #nginx跟后端服务器连接超时时间(代理连接超时)
            proxy_send_timeout         300; #后端服务器数据回传时间(代理发送超时)
            proxy_read_timeout         300; #连接成功后,后端服务器响应时间(代理接收超时)
            proxy_buffer_size          4k; #设置代理服务器(nginx)保存用户头信息的缓冲区大小
            proxy_buffers              4 32k; #proxy_buffers缓冲区,网页平均在32k以下的话,这样设置
            proxy_busy_buffers_size    64k; #高负荷下缓冲大小(proxy_buffers*2)
            proxy_temp_file_write_size 64k; #设定缓存文件夹大小,大于这个值,将从upstream服务器传

             #禁用缓存

             proxy_buffering off;

             #设置反向代理的地址

             proxy_pass http://192.168.1.1;       

      ··}
        # deny access to .htaccess files, if Apache's document root
        # concurs with nginx's one
        #
        #location ~ /\.ht {
        #    deny  all;
        #}
    }


    # another virtual host using mix of IP-, name-, and port-based configuration
    #
    #server {
    #    listen       8000;
    #    listen       somename:8080;
    #    server_name  somename  alias  another.alias;

    #    location / {
    #        root   html;
    #        index  index.html index.htm;
    #    }
    #}


    # HTTPS server
    #
    #server {
    #    listen       443 ssl;
    #    server_name  localhost;

    #    ssl_certificate      cert.pem;
    #    ssl_certificate_key  cert.key;

    #    ssl_session_cache    shared:SSL:1m;
    #    ssl_session_timeout  5m;

    #    ssl_ciphers  HIGH:!aNULL:!MD5;
    #    ssl_prefer_server_ciphers  on;

    #    location / {
    #        root   html;
    #        index  index.html index.htm;
    #    }
    #}

}

 

3.负载均衡

  nginx 的 upstream默认是以轮询的方式实现负载均衡,这种方式中,每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。

另外一种方式是ip_hash:每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。 

upstream myvic{
             #ip_hash;
             server 192.168.1.251 weight=1 fail_timeout=20s;
             server 192.168.1.252 weight=2 fail_timeout=20s;;
             server 192.168.1.247 weight=3 fail_timeout=20s;;#可以给服务器加权重
        }
server {

        listen       80;
        server_name  www.myvick.cn;
        location / {
             #反向代理的地址
             proxy_pass http://myvic;     
        }
}

 

 第二种配置:ip_hash轮询方法,不可给服务器加权重

 

upstream myvic {
       server 192.168.196.130 fail_timeout=20s;
       server 192.168.196.132 fail_timeout=20s;
     ip_hash;
 }
 server {
         listen 80;
         server_name www.myvick.cn;
      index index.html index.htm index.php;
      location / {
              proxy_pass http://myvic;
          proxy_next_upstream http_500 http_502 http_503 error timeout invalid_header; #当其中一台返回错误码404,500...等错误时,
                    #可以分配到下一台服务器程序继续处理,提高平台访问成功率,多可运用于前台程序负载,设置proxy_next_upstream
        
         proxy_next_upstream off;#关闭请求下一个服务器
         include proxy.conf; 
      }
} 方法二 nginx负载均衡基于ip_hash实现session粘帖

 

 

 

4.Nginx服务器的rewrite功能

 

地址转发后客户端浏览器地址栏中的地址显示是不变的,而地址重写后地址栏中的地址会变成正确的地址。
在一次地址转发过程中只会产生一次网络请求,而一次地址重写产生两次请求。
地址转发一般发生在同一站点项目内,而地址重写则没有限制。
地址转发到的页面可以不用全路径名表示,而地址重写到的页面必须使用完全的路径名表示。
地址转发过程中,可以将客户端请求的request范围内的属性传递给新的页面,但地址重写不可以。
地址转发的速度比地址重写的速度快。

 

 rewrite指令:通过正则表达式的匹配来改变URI,可以同时存在一个或多个指令,按照顺序依次对URI进行匹配

 redirect:将重写后的URI返回给客户端,状态码为302,指明是临时重定向URI,主要用在replacement变量不是以http或https开头的情况下。

三、透明代理

  透明代理的意思是客户端根本不需要知道有代理服务器的存在,它改编你的request fields(报文),并会传送真实IP。注意,加密的透明代理则是属于匿名代理,意思是不用设置使用代理了。

 

 

 参考文档:http://blief.blog.51cto.com/6170059/1739178

http://www.cnblogs.com/jacktang/p/3669115.html

posted @ 2017-10-22 11:02  myvic  阅读(2391)  评论(0编辑  收藏  举报