小议Nginx 的代理服务
一:关于Nginx的代理
关于Nginx在本博的LNMP架构中已经谈到了Nginx,它是一个高性能的HTTP和反向代理服务器,不过Nginx由于对web的静态内容响应非常迅速,我们经常将其作为网络的前端做反向代理,实现web服务器的高性能,下面我们就来以一个Nginx实现反向代理的网络的架构拓扑图展开今天的知识点吧
二:Nginx实现反向代理的网络拓扑图
- 首先安装编译安装前台的代理服务器nginx及Apache服务器,请亲们参看本博得LNMP架构,这里我就不再赘述了
- Nginx 实现代理可以讲Web的静态页面与动态页面分离 实现Web的快速响应能力
- 我们知道Nginx对静态内容的响应速度是非常快的,为此我们将web的静态页面可以放置在前台的Nginx服务器中,
- 当用户请求的是动态内容时,Nginx提供代理服务将动态内容提交到后台的Apache服务器及Php,JSP应用程序服务器处理并响应
三:配置Nginx实现简单的代理服务
- server {
- listen 80;
- server_name www.a.com
- location / {
- proxy_pass http://172.16.10.3
- }
- }
- 定义nginx实现代理服务器的缓存
- http {
- proxy_cache_path /var/www/cache levels=1:2 keys_zone=mycache:20m
- max_size=2048m inactive=50m;
- proxy_temp_path /var/www/cache/tmp;
- server {
- listen 80;
- server_name www.ghc.com
- access_log /var/log/www.ghc.com/log/access.log;
- error_log /var/log/www.ghc.com/log/error.log debug;
- #set your default location
- location / {
- proxy_pass http://172.16.10.3/;
- proxy_cache mycache;
- proxy_cache_valid 200 302 50m;
- proxy_cache_valid 404 1m;
- }
- }
- }
四:Nginx实现负载均衡(并检测后端Real Server的检测状况)
- Nginx实现检测real server 需要安装配置第三方模块:ngx_http_healthcheck_module
- 并对nginx打补丁
- patch -p1 < /healthcheck_nginx_upstreams/nginx.patch
- 不过编译Nginx时建议使用如下编译选择
- # ./configure \
- --prefix=/usr \
- --sbin-path=/usr/sbin/nginx \
- --conf-path=/etc/nginx/nginx.conf \
- --error-log-path=/var/log/nginx/error.log \
- --http-log-path=/var/log/nginx/access.log \
- --pid-path=/var/run/nginx/nginx.pid \
- --lock-path=/var/lock/nginx.lock \
- --user=nginx \
- --group=nginx \
- --with-http_ssl_module \
- --with-http_flv_module \
- --with-http_stub_status_module \
- --with-http_gzip_static_module \
- --http-client-body-temp-path=/var/tmp/nginx/client/ \
- --http-proxy-temp-path=/var/tmp/nginx/proxy/ \
- --http-fastcgi-temp-path=/var/tmp/nginx/fcgi/ \
- --with-pcre \
- --add-module=/tmp/healthcheck_nginx_upstreams
- make && make install
配置Nginx实现负载均衡并检测real server 健康状态
- http {
- upstream cluster {
- server 172.16.10.3;
- server 172.16.10.100;
- healthcheck_enabled;
- healthcheck_delay 1000;
- healthcheck_timeout 1000;
- healthcheck_failcount 3;
- healthcheck_expected 'I am ok ';
- healthcheck_send "GET /.health HTTP/1.0";
- }
- server {
- listen 80;
- server_name localhost;
- location / {
- root html;
- index index.html index.htm;
- location / {
- proxy_pass http://cluster;
- proxy_set_header Host $http_host;
- proxy_connect_timeout 3;
- }
- location /stat {
- healthcheck_status;
- }
- }
- 注:healthcheck_enabled 启用健康检测功能
- healthcheck_send "GET /.health HTTP/1.0"中目前Nginx仅支持http/1.0的版本来检测,
- .health 文件为在real server端Nginx检测的文件,
- upstream选项实现负载均衡
- healthcheck_status:配置检测后端real server状态输出的信息
- 建议关闭:healthcheck_expectd “I am ok ’选项,如果打开等待的时间可能较长
五:测试
- real server 正常访问
real server的健康状况
- 注:由于172.16.11.11 中没有提供.health文件。所以会出现如上图信息,但是不影响我们的结果
- 注:从图中我们可以看出,当我们将其中一台正常的real server 172.16.10.3停止服务器时,Nginx侧立即检测到real server的状态信息
- 我们知道LVS和Nginx都可以提供负载均衡的功能,那么它们的区别有哪些呢,我们这里简单的总结几点
- LVS与Nginx实现负载均衡的区别:
- 1:LVS 工作在网络第4层实现负载均衡
- Nginx工作在网络第7层实现负载均衡
- 2:LVS的配置选项较少,一旦配置成功,不需要经常性的修改,大大减少了人为出错的概率
- 3:LVS的director 仅转发用户的请求数据包,real server 直接响应用户请求
- 但是Nginx如果是在前台实现代理负载均衡就需要直接响应用户。
- ngxin对网络的依赖较小,只要能够ping通nginx服务器,网页就能正常响应,
- 但是LVS需要director的转发,如果director不能ping通,real server就无法响应用户请求。
- 等等。生产环境中具体选用LVS实现负载均衡还是nginx负载均衡。根据实际情况而定吧
六: Nginx 实现代理服务时的URL-rewrite机制
- url 重定向的格式: rewrite regex replacement flag
- rewrite 关键字
- regex :表达式(重定向之前的位置)
- replacement:(重定向之后的位置)
- flag:标志位
- 在实现url地址重写时有4个标识Flag
- last: 匹配所以的rewrite 语句,第一个rewrite url语句满足时,继续匹配下一条,直至匹配完所有的rewrite 语句
- break:当第一条rewrite满足时就结束
- redirect:returns temporary redirect with code 302; it is used if the substituting line begins with http://
- permanent:eturns permanent redirect with code 301
- 简单的解说一下:(个人理解)
- 当第一条的flag是last, 那么在匹配的时候 ^/a/(.*png) 会与后面的两条也匹配一遍
- 如果第一条的flag是break 那么后面的两条就此结束,不再匹配,直接响应用户请求
- 第一条的flag是redirect regex将会被强制性的重定向到replacement
- 第一条的flag是permanent,那么regex 将会被永久的重定向到replacement
例如
- location / {
- proxy_pass http://172.16.10.3;
- rewrite ^/images/(.*)$ /a/$1 last;
- rewrite ^/a/(.*)$ /b/$1 last;
- rewrite ^/b/(.*)$ /c/$1 break;
- rewrite ^/images/(.*)$ /c/$1 last;
- rewrite ^/images/(.*)$ /c/$1 redirect;
- rewrite ^/images/(.*)$ /d/$1 permanent;
- }
- 结果验证如下:
- 在nginx代理服务中的url rewrite 时还可以使用
- if指令
- 语法: if (condition) { ... }
- 应用环境: server, location
- 条件:
- 1、变量名; false values are: empty string ("", or any string starting with "0";)
- 2、对于变量进行的比较表达式,可使用=或!=进行测试;
- 3、正则表达式的模式匹配:
- ~ 区分大小的模式匹配
- ~* 不区分字母大小写的模式匹配
- !~ 和 !~* 分别对上面的两种测试取反
- 4、测试文件是否存在-f或!-f
- 5、测试目录是否存在-d或!-d
- 6、测试目录、文件或链接文件的存在性-e或!-e
- 7、检查一个文件的执行权限-x或!-x
- 在正则表达式中,可以使用圆括号标记匹配到的字符串,并可以分别使用$1,$2,...,$9进行引用;
七:Nginx代理实现域名镜像
例如