小议Nginx 的代理服务

 小议Nginx 的代理服务

一:关于Nginx的代理

    关于Nginx在本博的LNMP架构中已经谈到了Nginx,它是一个高性能的HTTP和反向代理服务器,不过Nginx由于对web的静态内容响应非常迅速,我们经常将其作为网络的前端做反向代理,实现web服务器的高性能,下面我们就来以一个Nginx实现反向代理的网络的架构拓扑图展开今天的知识点吧

二:Nginx实现反向代理的网络拓扑图

  
  
  
  
  1.  
  2.     
        
        
        
    1. 首先安装编译安装前台的代理服务器nginx及Apache服务器,请亲们参看本博得LNMP架构,这里我就不再赘述了 
  3. Nginx 实现代理可以讲Web的静态页面与动态页面分离 实现Web的快速响应能力 
  4. 我们知道Nginx对静态内容的响应速度是非常快的,为此我们将web的静态页面可以放置在前台的Nginx服务器中,
  5. 当用户请求的是动态内容时,Nginx提供代理服务将动态内容提交到后台的Apache服务器及Php,JSP应用程序服务器处理并响应 

三:配置Nginx实现简单的代理服务

  
  
  
  
  1. server { 
  2.     listen 80; 
  3.     server_name www.a.com 
  4.     location / { 
  5.         proxy_pass   http://172.16.10.3  
  6.     } 
  
  
  
  
  1. 定义nginx实现代理服务器的缓存 
  2. http { 
  3.   proxy_cache_path /var/www/cache levels=1:2  keys_zone=mycache:20m 
  4.   max_size=2048m inactive=50m
  5.   proxy_temp_path /var/www/cache/tmp; 
  6.   
  7.   server { 
  8.     listen 80; 
  9.     server_name www.ghc.com 
  10.     access_log /var/log/www.ghc.com/log/access.log; 
  11.     error_log /var/log/www.ghc.com/log/error.log debug; 
  12.     #set your default location 
  13.     location / { 
  14.       proxy_pass http://172.16.10.3/; 
  15.       proxy_cache mycache; 
  16.       proxy_cache_valid 200 302 50m; 
  17.       proxy_cache_valid 404 1m; 
  18.     } 
  19.   } 

四:Nginx实现负载均衡(并检测后端Real Server的检测状况)

  
  
  
  
  1. Nginx实现检测real server 需要安装配置第三方模块:ngx_http_healthcheck_module 
  2. 并对nginx打补丁 
  3.  patch -p1 < /healthcheck_nginx_upstreams/nginx.patch
  
  
  
  
  1. 不过编译Nginx时建议使用如下编译选择 
  2. # ./configure \ 
  3.   --prefix=/usr \ 
  4.   --sbin-path=/usr/sbin/nginx \ 
  5.   --conf-path=/etc/nginx/nginx.conf \ 
  6.   --error-log-path=/var/log/nginx/error.log \ 
  7.   --http-log-path=/var/log/nginx/access.log \ 
  8.   --pid-path=/var/run/nginx/nginx.pid  \ 
  9.   --lock-path=/var/lock/nginx.lock \ 
  10.   --user=nginx \ 
  11.   --group=nginx \ 
  12.   --with-http_ssl_module \ 
  13.   --with-http_flv_module \ 
  14.   --with-http_stub_status_module \ 
  15.   --with-http_gzip_static_module \ 
  16.   --http-client-body-temp-path=/var/tmp/nginx/client/ \ 
  17.   --http-proxy-temp-path=/var/tmp/nginx/proxy/ \ 
  18.   --http-fastcgi-temp-path=/var/tmp/nginx/fcgi/ \ 
  19.   --with-pcre \ 
  20.   --add-module=/tmp/healthcheck_nginx_upstreams 
  21. make && make install 

配置Nginx实现负载均衡并检测real server 健康状态

  
  
  
  
  1. http   { 
  2. upstream  cluster { 
  3.     server  172.16.10.3; 
  4.     server  172.16.10.100; 
  5. healthcheck_enabled; 
  6.     healthcheck_delay 1000; 
  7.     healthcheck_timeout 1000; 
  8.     healthcheck_failcount 3; 
  9.     healthcheck_expected 'I am ok '; 
  10.     healthcheck_send "GET /.health HTTP/1.0";    
  11.     } 
  12.     server { 
  13.         listen       80; 
  14.         server_name  localhost; 
  15.         location / { 
  16.             root   html; 
  17.             index  index.html index.htm; 
  18.          location / { 
  19.             proxy_pass  http://cluster; 
  20.  proxy_set_header Host $http_host; 
  21.             proxy_connect_timeout 3; 
  22.                 } 
  23.       location /stat { 
  24.       healthcheck_status; 
  25.     } 
  
  
  
  
  1. 注:healthcheck_enabled 启用健康检测功能 
  2. healthcheck_send "GET /.health HTTP/1.0"中目前Nginx仅支持http/1.0的版本来检测, 
  3. .health 文件为在real server端Nginx检测的文件, 
  4. upstream选项实现负载均衡 
  5. healthcheck_status:配置检测后端real server状态输出的信息

  
  
  
  
  1. 建议关闭:healthcheck_expectd “I am ok ’选项,如果打开等待的时间可能较长 

五:测试

  
  
  
  
  1. real server 正常访问 

real server的健康状况

  
  
  
  
  1. 注:由于172.16.11.11 中没有提供.health文件。所以会出现如上图信息,但是不影响我们的结果 

  
  
  
  
  1. 注:从图中我们可以看出,当我们将其中一台正常的real server 172.16.10.3停止服务器时,Nginx侧立即检测到real server的状态信息 

  
  
  
  
  1. 我们知道LVS和Nginx都可以提供负载均衡的功能,那么它们的区别有哪些呢,我们这里简单的总结几点 

  
  
  
  
  1. LVS与Nginx实现负载均衡的区别: 
  2. 1:LVS 工作在网络第4层实现负载均衡 
  3. Nginx工作在网络第7层实现负载均衡 
  4. 2:LVS的配置选项较少,一旦配置成功,不需要经常性的修改,大大减少了人为出错的概率 
  5. 3:LVS的director 仅转发用户的请求数据包,real server 直接响应用户请求 
  6. 但是Nginx如果是在前台实现代理负载均衡就需要直接响应用户。 
  7. ngxin对网络的依赖较小,只要能够ping通nginx服务器,网页就能正常响应,
  8. 但是LVS需要director的转发,如果director不能ping通,real server就无法响应用户请求。 
  9. 等等。生产环境中具体选用LVS实现负载均衡还是nginx负载均衡。根据实际情况而定吧 

六: Nginx 实现代理服务时的URL-rewrite机制

  
  
  
  
  1. url 重定向的格式: rewrite regex replacement flag 
  2. rewrite 关键字 
  3. regex :表达式(重定向之前的位置) 
  4. replacement:(重定向之后的位置) 
  5. flag:标志位 
  
  
  
  
  1. 在实现url地址重写时有4个标识Flag 
  2. last:  匹配所以的rewrite 语句,第一个rewrite url语句满足时,继续匹配下一条,直至匹配完所有的rewrite 语句 
  3. break:当第一条rewrite满足时就结束 
  4. redirect:returns temporary redirect with code 302; it is used if the substituting line begins with http:// 
  5. permanent:eturns permanent redirect with code 301 

  
  
  
  
  1. 简单的解说一下:(个人理解) 
  2. 当第一条的flag是last, 那么在匹配的时候 ^/a/(.*png) 会与后面的两条也匹配一遍 
  3. 如果第一条的flag是break 那么后面的两条就此结束,不再匹配,直接响应用户请求 
  4. 第一条的flag是redirect regex将会被强制性的重定向到replacement 
  5. 第一条的flag是permanent,那么regex 将会被永久的重定向到replacement 

例如

  
  
  
  
  1. location / { 
  2.                 proxy_pass      http://172.16.10.3; 
  3.                 rewrite ^/images/(.*)$  /a/$1 last; 
  4.                 rewrite ^/a/(.*)$  /b/$1 last; 
  5.                 rewrite ^/b/(.*)$  /c/$1 break; 
  6.                 rewrite ^/images/(.*)$  /c/$1 last; 
  7.                 rewrite ^/images/(.*)$  /c/$1 redirect; 
  8.                 rewrite ^/images/(.*)$  /d/$1 permanent; 
  9. }
  10. 结果验证如下:

 

  
  
  
  
  1. 在nginx代理服务中的url rewrite 时还可以使用 
  2. if指令 
  3. 语法: if (condition) { ... } 
  4. 应用环境: server, location 
  5. 条件: 
  6. 1、变量名; false values are: empty string ("", or any string starting with "0";) 
  7. 2、对于变量进行的比较表达式,可使用=或!=进行测试; 
  8. 3、正则表达式的模式匹配: 
  9. ~  区分大小的模式匹配 
  10. ~* 不区分字母大小写的模式匹配 
  11. !~ 和 !~* 分别对上面的两种测试取反 
  12. 4、测试文件是否存在-f或!-f 
  13. 5、测试目录是否存在-d或!-d 
  14. 6、测试目录、文件或链接文件的存在性-e或!-e 
  15. 7、检查一个文件的执行权限-x或!-x 
  16. 在正则表达式中,可以使用圆括号标记匹配到的字符串,并可以分别使用$1,$2,...,$9进行引用; 

七:Nginx代理实现域名镜像

例如

你可能感兴趣的:(nginx,代理)