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