热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Nginx+varnish构建高可用CDN节点集群

一、环境描述LinuxserverA(CentOSrelease5.8Final)实IP:192.168.4.97虚IP:192.168.4.96Li

一、        环境描述

Linux server A  (CentOS release 5.8 Final)  实IP:192.168.4.97  虚IP:192.168.4.96
Linux server B  (CentOS release 5.8 Final)  实IP:192.168.4.99  虚IP:192.168.4.98

域名环境(DNS轮询解析到虚IP):
server.osapub.com 192.168.4.96
server.osapub.com 192.168.4.98

二、        简单架构示意图

描述:前端两台NGINX做DNS轮询,通过虚IP漂移+HA监控脚本相结合,实现前端两台NGINX高可用,利用NGINX反向代理功能对后端varnish实现高可用集群。

三、软件环境搭建
3.1 编译安装nginx

#!/bin/bash####nginx 环境安装脚本,注意环境不同可能导致脚本运行出错,如果环境不同建议手工一条一条执行指令。

#创建工作目录
mkdir -p /dist/{dist,src}
cd /dist/dist

#下载安装包
wget http://bbs.osapub.com/down/google-perftools-1.8.3.tar.gz &> /dev/null
wget http://bbs.osapub.com/down/libunwind-0.99.tar.gz &> /dev/null
wget http://bbs.osapub.com/down/pcre-8.01.tar.gz &> /dev/null
wget http://bbs.osapub.com/down/nginx-1.0.5.tar.gz &> /dev/null

#------------------------------------------------------------------------
# 使用Google的开源TCMalloc库,忧化性能

cd /dist/src
tar zxf ../dist/libunwind-0.99.tar.gz
cd libunwind-0.99/

## 注意这里不能加其它 CFLAGS加速编译参数

CFLAGS=-fPIC ./configure
make clean
make CFLAGS=-fPIC
make CFLAGS=-fPIC install
if [ "$?" == "0" ]; then
        echo "libunwind-0.99安装成功." >> ./install_log.txt
else
        echo "libunwind-0.99安装失败." >> ./install_log.txt
        exit 1
fi

##----------------------------------------------------------
## 使用Google的开源TCMalloc库,提高MySQL在高并发情况下的性能

cd /dist/src
tar zxf ../dist/google-perftools-1.8.3.tar.gz
cd google-perftools-1.8.3/

CHOST="x86_64-pc-linux-gnu" CFLAGS="-march=nocona -O2 -pipe" CXXFLAGS="-march=nocona -O2 -pipe" \
./configure

make clean
make && make install
if [ "$?" == "0" ]; then
        echo "google-perftools-1.8.3安装成功." >> ./install_log.txt
else
        echo "google-perftools-1.8.3安装失败." >> ./install_log.txt
        exit 1
fi

echo "/usr/local/lib" > /etc/ld.so.conf.d/usr_local_lib.conf
/sbin/ldconfig

################ 安装nginx ##########################
#安装Nginx所需的pcre库

cd /dist/src
tar zxvf ../dist/pcre-8.01.tar.gz
cd pcre-8.01/

CHOST="x86_64-pc-linux-gnu" CFLAGS="-march=nocona -O2 -pipe" CXXFLAGS="-march=nocona -O2 -pipe" \
./configure
make && make install
if [ "$?" == "0" ]; then
        echo "pcre-8.01安装成功." >> ./install_log.txt
else
        echo "pcre-8.01安装失败." >> ./install_log.txt
        exit 1
fi
cd ../

## 安装Nginx
## 为优化性能,可以安装 google 的 tcmalloc ,之前己经安装过了
## 所以我们编译 Nginx 时,加上参数 --with-google_perftools_module
## 然后在启动nginx前需要设置环境变量 export LD_PRELOAD=/usr/local/lib/libtcmalloc.so
## 加上 -O2 参数也能优化一些性能
##
## 默认的Nginx编译选项里居然是用 debug模式的(-g参数),在 auto/cc/gcc 文件最底下,去掉那个 -g 参数
## 就是将  CFLAGS="$CFLAGS -g"  修改为   CFLAGS="$CFLAGS"   或者直接删除这一行

cd /dist/src
rm -rf nginx-1.0.5
tar zxf ../dist/nginx-1.0.5.tar.gz
cd nginx-1.0.5/

sed -i 's#CFLAGS="$CFLAGS -g"#CFLAGS="$CFLAGS "#' auto/cc/gcc

make clean

CHOST="x86_64-pc-linux-gnu" CFLAGS="-march=nocona -O2 -pipe" CXXFLAGS="-march=nocona -O2 -pipe" \
./configure --user=www --group=www \
--prefix=/usr/local/nginx \
--with-http_stub_status_module \
--with-google_perftools_module

make && make install
if [ "$?" == "0" ]; then
        echo "nginx-1.0.5安装成功." >> ./install_log.txt
else
        echo "nginx-1.0.5安装失败." >> ./install_log.txt
        exit 1
fi
cd ../

#创建Nginx日志目录
mkdir -p /data/logs
chmod +w /data/logs
chown -R www:www /data/logs

cd /usr/local/nginx/
mv conf conf_bak
ln -s /data/conf/nginx/ conf

echo 'export LD_PRELOAD=/usr/local/lib/libtcmalloc.so' > /root/nginx_start
echo 'ulimit -SHn 51200' >> /root/nginx_start
echo '/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf' >> /root/nginx_start

echo '/usr/local/nginx/sbin/nginx -t' > /root/nginx_reload
echo 'kill -HUP `cat /usr/local/nginx/logs/nginx.pid`' >> /root/nginx_reload

chmod 700 /root/nginx_*

3.2        编译安装varnish

#!/bin/bash#进入工作目录cd /dist/dist#下载安装包wget http://bbs.osapub.com/down/varnish-3.0.0.tar.gz &> /dev/nullcd /dist/srcrm -fr varnish-3.0.0export PKG_CONFIG_PATH=/usr/local/lib/pkgconfigtar zxvf ../dist/varnish-3.0.0.tar.gzcd varnish-3.0.0#编译参数可以根据自己需要定制./configure -prefix=/usr/local/varnish -enable-debugging-symbols -enable-developer-warnings -enable-dependency-trackingmake && make installif [ "$?" == "0" ]; then        echo "varnish-3.0.0安装成功." >> ./install_log.txtelse        echo "varnish-3.0.0安装失败." >> ./install_log.txt        exit 1fi#设置启动、重启脚本cat > /root/varnish_restart.sh < /root/varnish_start.sh <

三、        配置varnish一些参数说明:
Backend servers
Varnish有后端(或称为源)服务器的概念。后端服务器是指Varnish提供加速服务的那台,通常提供内容。
第一件要做的事情是告诉Varnish,哪里能找到要加速的内容。
vcl_recv
vcl_recv是在请求开始时调用的。完成该子程序后,请求就被接收并解析了。用于确定是否需要服务请求,怎么服务,如果可用,使用哪个后端。
在vcl_recv中,你也可以修改请求。通常你可以修改COOKIE,或添加/移除请求头信息。
注意在vcl_recv中,只可以使用请求对象req。


vcl_fetch
vcl_fetch是在文档从后端被成功接收后调用的。通常用于调整响应头信息,触发ESI处理,万一请求失败就换个后端服务器。
在vcl_fecth中,你还可以使用请求对象req。还有个后端响应对象beresp。Beresp包含了后端的HTTP头信息。

varnish 3.X 配置参考文档:http://anykoro.sinaapp.com/?p=261

编辑:/usr/local/varnish/vcl.conf ,文件不存在则创建。注意:Server A 与server B 配置一致!

配置详情如下:

###########后台代理服务器########backend server_osapub_com{        .host = "192.168.4.97";        .port = "82";}acl purge {        "localhost";                "127.0.0.1";}#############################################sub vcl_recv {     #################BAN##########################begin         if (req.request == "BAN") {                # Same ACL check as above:                if (!client.ip ~ purge) {                        error 405 "Not allowed.";                }                ban("req.http.host == " + req.http.host +                      "&& req.url == " + req.url);                error 200 "Ban added";        }     #################BAN##########################end         ###############配置域名##################################          if(req.http.host ~ "^server.osapub.com" ||req.http.host ~ ".osapub.com" ) {                #使用哪一组后台服务器                        set req.backend = server_osapub_com;                }                ##################################################        if (req.restarts == 0) {        if (req.http.x-forwarded-for) {           set req.http.X-Forwarded-For = req.http.X-Forwarded-For + ", " + client.ip;         }         else {            set req.http.X-Forwarded-For = client.ip;         }     }        if (req.http.Accept-Encoding) {        if (req.url ~ "\.(jpg|jpeg|png|gif|gz|tgz|bz2|tbz|mp3|ogg|swf)$") {            remove req.http.Accept-Encoding;        } elsif (req.http.Accept-Encoding ~ "gzip") {            set req.http.Accept-Encoding = "gzip";}          elsif (req.http.Accept-Encoding ~ "deflate") {            set req.http.Accept-Encoding = "deflate";}        else {         remove req.http.Accept-Encoding;      }    }     if (req.http.Cache-Control ~ "no-cache") {         return (pass);     }     if (req.request != "GET" &&       req.request != "HEAD" &&       req.request != "PUT" &&       req.request != "POST" &&       req.request != "TRACE" &&       req.request != "OPTIONS" &&       req.request != "DELETE") {         return (pipe);     }     if (req.request != "GET" && req.request != "HEAD") {                        return(pass);                }                        if (req.http.Authorization || req.http.COOKIE ||req.http.Authenticate) {                 return (pass);     }                 if (req.request == "GET" && req.url ~ "(?i)\.php($|\?)"){                return (pass);             }        if (req.url ~ "\.(css|jpg|jpeg|png|gif|gz|tgz|bz2|tbz|mp3|ogg|swf)$") {                unset req.http.COOKIE;        }                    return (lookup);}sub vcl_fetch {        set beresp.grace = 5m;        if (beresp.status == 404 || beresp.status == 503 || beresp.status == 500 || beresp.status == 502) {                set beresp.http.X-Cacheable = "NO: beresp.status";                set beresp.http.X-Cacheable-status = beresp.status;                return (hit_for_pass);        }        #决定哪些头不缓存    if (req.url ~ "\.(php|shtml|asp|aspx|jsp|js|ashx)$") {                return (hit_for_pass);         }        if (req.url ~ "\.(jpg|jpeg|png|gif|gz|tgz|bz2|tbz|mp3|ogg|swf)$") {                unset beresp.http.set-COOKIE;        }        if (beresp.ttl <= 0s) {                set beresp.http.X-Cacheable = "NO: !beresp.cacheable";                return (hit_for_pass);        }        else {                unset beresp.http.expires;        }        return (deliver);}sub vcl_deliver {if (resp.http.magicmarker) {     unset resp.http.magicmarker;     set resp.http.age = "0"; }# add cache hit dataif (obj.hits > 0) {   set resp.http.X-Cache = "HIT";   set resp.http.X-Cache-Hits = obj.hits;}else {     set resp.http.X-Cache = "MISS";}# hidden some sensitive http header returning to client, when the cache server received from backend server responseremove resp.http.X-Varnish;remove resp.http.Via;remove resp.http.Age;remove resp.http.X-Powered-By;remove resp.http.X-Drupal-Cache;return (deliver);}sub vcl_error { if (obj.status == 503 && req.restarts < 5) {   set obj.http.X-Restarts = req.restarts;   return (restart); }}sub vcl_hit {if (req.http.Cache-Control ~ "no-cache") {  if (! (req.http.Via || req.http.User-Agent ~ "bot|MSIE")) {      set obj.ttl = 0s;      return (restart);   }}  return(deliver);}

配置完成后执行:/root/varnish_start.sh 如果启动成功则表示配置无误!

四、        配置nginx编辑: /usr/local/nginx/conf/nginx.conf ,nginx 的配置方法请参考网上文档资料。
Server A(192.168.4.97) nginx配置如下:


?user  www www;worker_processes 16;error_log /logs/nginx/nginx_error.log crit;#Specifies the value for maximum file descriptors that can be opened by this process.worker_rlimit_nofile 65500;events{        use epoll;        worker_connections 65500;}http{        include       mime.types;        default_type  application/octet-stream;        server_names_hash_bucket_size 128;        client_header_buffer_size 64k;        large_client_header_buffers 4 64k;        client_max_body_size 10m;        server_tokens off;        expires       1h;        sendfile on;        tcp_nopush     on;        keepalive_timeout 60;        tcp_nodelay on;    fastcgi_connect_timeout 200;    fastcgi_send_timeout 300;    fastcgi_read_timeout 600;    fastcgi_buffer_size 128k;    fastcgi_buffers 4 64k;    fastcgi_busy_buffers_size 128k;    fastcgi_temp_file_write_size 128k;    fastcgi_temp_path /dev/shm;        gzip on;        gzip_min_length  2048;        gzip_buffers     4 16k;        gzip_http_version 1.1;        gzip_types  text/plain  text/css  application/xml application/x-Javascript ;        log_format  access  '$remote_addr - $remote_user [$time_local] "$request" '                          '$status $body_bytes_sent "$http_referer" '                          '"$http_user_agent" $http_x_forwarded_for';#################  include  ###################         upstream varnish_server {                server 127.0.0.1:81 weight=2 max_fails=3 fail_timeout=30s;                    server 192.168.4.99:81 weight=2 max_fails=3 fail_timeout=30s;                ip_hash;        }                server        {                listen       80;                server_name  192.168.4.96 192.168.4.98;                             index index.html index.htm index.php index.aspx;                location /                {                        proxy_set_header   Host             $host;                        proxy_set_header   X-Real-IP        $remote_addr;                        proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;                        proxy_connect_timeout 200;                        proxy_send_timeout 300;                        proxy_read_timeout 500;                        proxy_buffer_size 256k;                        proxy_buffers 4 128k;                        proxy_busy_buffers_size 256k;                        proxy_temp_file_write_size 256k;                        proxy_temp_path  /dev/shm;                        proxy_pass  http://varnish_server;                        expires off;                        access_log  /logs/nginx/192.168.4.96.log  access;                }        }                server        {              listen       82;              server_name  192.168.4.97;              index index.html index.htm index.php;              root  /data/web/awstats/www;              location ~ .*\.php$              {                   include fcgi.conf;                   fastcgi_pass  127.0.0.1:10080;                   fastcgi_index index.php;                   expires off;              }              access_log  /logs/nginx/awstats.osapub.com.log  access;        }               }

server B (192.168.4.99)配置如下:

?user  www www;worker_processes 16;error_log /logs/nginx/nginx_error.log crit;#Specifies the value for maximum file descriptors that can be opened by this process.worker_rlimit_nofile 65500;events{        use epoll;        worker_connections 65500;}http{        include       mime.types;        default_type  application/octet-stream;        server_names_hash_bucket_size 128;        client_header_buffer_size 64k;        large_client_header_buffers 4 64k;        client_max_body_size 10m;        server_tokens off;        expires       1h;        sendfile on;        tcp_nopush     on;        keepalive_timeout 60;        tcp_nodelay on;    fastcgi_connect_timeout 200;    fastcgi_send_timeout 300;    fastcgi_read_timeout 600;    fastcgi_buffer_size 128k;    fastcgi_buffers 4 64k;    fastcgi_busy_buffers_size 128k;    fastcgi_temp_file_write_size 128k;    fastcgi_temp_path /dev/shm;        gzip on;        gzip_min_length  2048;        gzip_buffers     4 16k;        gzip_http_version 1.1;        gzip_types  text/plain  text/css  application/xml application/x-Javascript ;        log_format  access  '$remote_addr - $remote_user [$time_local] "$request" '                          '$status $body_bytes_sent "$http_referer" '                          '"$http_user_agent" $http_x_forwarded_for';#################  include  ###################         upstream varnish_server {                server 127.0.0.1:81 weight=2 max_fails=3 fail_timeout=30s;                    server 192.168.4.97:81 weight=2 max_fails=3 fail_timeout=30s;                ip_hash;        }                server        {                listen       80;                server_name  192.168.4.96 192.168.4.98;                             index index.html index.htm index.php index.aspx;                location /                {                        proxy_set_header   Host             $host;                        proxy_set_header   X-Real-IP        $remote_addr;                        proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;                        proxy_connect_timeout 200;                        proxy_send_timeout 300;                        proxy_read_timeout 500;                        proxy_buffer_size 256k;                        proxy_buffers 4 128k;                        proxy_busy_buffers_size 256k;                        proxy_temp_file_write_size 256k;                        proxy_temp_path  /dev/shm;                        proxy_pass  http://varnish_server;                        expires off;                        access_log  /logs/nginx/192.168.4.98.log  access;                }        }                server        {              listen       82;              server_name  192.168.4.99;              index index.html index.htm index.php;              root  /data/web/awstats/www;              location ~ .*\.php$              {                   include fcgi.conf;                   fastcgi_pass  127.0.0.1:10080;                   fastcgi_index index.php;                   expires off;              }              access_log  /logs/nginx/awstats.osapub.com.log  access;        }               }

启动nginx:
/root/nginx_start
启动正常会监听80,82端口!
五、        运行nginx ha脚本

server A 的脚本下载地址:http://bbs.osapub.com/down/server_a_ha.tar.gz
解压力后得到三个脚本:
nginx_watchdog.sh
nginxha.sh
nginx_ha1.sh

server B 的脚本下载地址:http://bbs.osapub.com/down/server_b_ha.tar.gz
解压力后得到三个脚本:
nginx_watchdog.sh
nginxha.sh
nginx_ha2.sh

注意:脚本建议放到:/data/sh/ha 目录下,否则需要修改nginxha.sh  里面的程序路径.

六、        测试1,测试之前先把nginx 负载去掉,可以在前面加#号暂时注释,只保留本机解析,确保测试结果准确。


2,修改本机host文件
添加:192.168.4.99 server.osapub.com 到末尾,保存后访问。

3,正常结果显示如下:

原文地址:http://www.wushiqin.com/post-22.html



推荐阅读
  • centos6.8 下nginx1.10 安装 ... [详细]
  • 其实之前也有下载过完整的android源码,但是从来没有对这个做过一些总结,在加上最近需要经常去看,索性就在从新下载,编译一下,其实这些东西官网上面都有。http:sou ... [详细]
  • linux下编译安装lnmp
    2019独角兽企业重金招聘Python工程师标准#######################安装依赖#####################安装必要的包:y ... [详细]
  • 本文介绍了在mac环境下使用nginx配置nodejs代理服务器的步骤,包括安装nginx、创建目录和文件、配置代理的域名和日志记录等。 ... [详细]
  • 本文介绍了在CentOS上安装Python2.7.2的详细步骤,包括下载、解压、编译和安装等操作。同时提供了一些注意事项,以及测试安装是否成功的方法。 ... [详细]
  • 树莓派语音控制的配置方法和步骤
    本文介绍了在树莓派上实现语音控制的配置方法和步骤。首先感谢博主Eoman的帮助,文章参考了他的内容。树莓派的配置需要通过sudo raspi-config进行,然后使用Eoman的控制方法,即安装wiringPi库并编写控制引脚的脚本。具体的安装步骤和脚本编写方法在文章中详细介绍。 ... [详细]
  • ZABBIX 3.0 配置监控NGINX性能【OK】
    1.在agent端查看配置:nginx-V查看编辑时是否加入状态监控模块:--with-http_stub_status_module--with-http_gzip_stat ... [详细]
  • 对于一般的扩展包,我们一般直接pipinstallxxx即可安装,但是unrar直接安装后,发现并不能通过Python程序实现解压的功能& ... [详细]
  • MySQL5.6.40在CentOS764下安装过程 ... [详细]
  • 前言折腾了一段时间hadoop的部署管理,写下此系列博客记录一下。为了避免各位做部署这种重复性的劳动,我已经把部署的步骤写成脚本,各位只需要按着本文把脚本执行完,整个环境基本就部署 ... [详细]
  • 本文介绍了iOS数据库Sqlite的SQL语句分类和常见约束关键字。SQL语句分为DDL、DML和DQL三种类型,其中DDL语句用于定义、删除和修改数据表,关键字包括create、drop和alter。常见约束关键字包括if not exists、if exists、primary key、autoincrement、not null和default。此外,还介绍了常见的数据库数据类型,包括integer、text和real。 ... [详细]
  • Java中包装类的设计原因以及操作方法
    本文主要介绍了Java中设计包装类的原因以及操作方法。在Java中,除了对象类型,还有八大基本类型,为了将基本类型转换成对象,Java引入了包装类。文章通过介绍包装类的定义和实现,解答了为什么需要包装类的问题,并提供了简单易用的操作方法。通过本文的学习,读者可以更好地理解和应用Java中的包装类。 ... [详细]
  • RouterOS 5.16软路由安装图解教程
    本文介绍了如何安装RouterOS 5.16软路由系统,包括系统要求、安装步骤和登录方式。同时提供了详细的图解教程,方便读者进行操作。 ... [详细]
  • Android系统源码分析Zygote和SystemServer启动过程详解
    本文详细解析了Android系统源码中Zygote和SystemServer的启动过程。首先介绍了系统framework层启动的内容,帮助理解四大组件的启动和管理过程。接着介绍了AMS、PMS等系统服务的作用和调用方式。然后详细分析了Zygote的启动过程,解释了Zygote在Android启动过程中的决定作用。最后通过时序图展示了整个过程。 ... [详细]
  • Week04面向对象设计与继承学习总结及作业要求
    本文总结了Week04面向对象设计与继承的重要知识点,包括对象、类、封装性、静态属性、静态方法、重载、继承和多态等。同时,还介绍了私有构造函数在类外部无法被调用、static不能访问非静态属性以及该类实例可以共享类里的static属性等内容。此外,还提到了作业要求,包括讲述一个在网上商城购物或在班级博客进行学习的故事,并使用Markdown的加粗标记和语句块标记标注关键名词和动词。最后,还提到了参考资料中关于UML类图如何绘制的范例。 ... [详细]
author-avatar
mobiledu2502887107
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有