标签: 缓存

exsi单机加载panabit+ixcache+panalog(流控+缓存+日志)

由于工作原因,需要上流控缓存日志系统,找到了panabit,索性一台机器虚拟化哈。

闲置服务器 惠普G6 500G raid0 8G内存
购买网卡 Winyao WYI350T4 PCI-E X4服务器四口千兆网卡intel I350T4 460元

关于配置,服务器用了raid0,因为其实挂了就重新配置呗,带有实验的性质,所以无所谓了。生产环境还是推荐raid5或者raid1。网卡其实只用了3个口(服务器自带4个+网卡4个),另外几个只是备用的了。如果多条线路上的话,差不多正好够用。

网络状况
1、有电信、集团专线、教育网三个出口
2、流控为透明模式
3、缓存为牵引模式

存储状况
1、500G 服务器自带的硬盘,做了raid0阵列
2、由于缓存不够,用了openfiler做了iscsi的阵列。随便找了台垃圾机器装了两块1T的硬盘。

图1

1

具体esxi设置网络情况

1、管理端口组
设置了内网管理端口,等于三个虚拟化的系统,合并在一个物理端口上,连入内网,作为管理。
其中win2003为调试测试用。management network为esxi内网管理地址。
同时缓存是管理口,也为下载口。

图2

2

2、流量上行口接外网
流控透明模式的上行出口,接公网的口。
在公网上挂了win2003测试机,设置了esxi的公网访问口。

图3

3

3、流量下行口接内网
此物理接口接内网.

图4

4

4、电信、教育、集团专线三个出口
由于用的透明模式,没有改造原有网络,所以这里仅仅是预留,随时可以做nat转换,切换成出口。

图5

5

5、流控与缓存通信段
详细情况可以查询一下缓存的牵引模式。其实就是流控和缓存对接的口。

图6

6

6、为接入的openfiler做的单独的存储。
存储的IP为192.168.120.120
esxi相应的为192.168.120.119
实际上就是服务器和存储直接连一根网线,插在vmnic7的物理口上。

图7

7

panabit流控设置

数据接口设置
em1与em2为流量上行和下行接口
其余备用,电信、教育网、集团专线还没有设置成接外网,可以用的时候在调整。

图8

8

流控与缓存的接口设置,模拟wan,详见官方牵引模式文档。

图9

9

策略路由设置

图10

10

缓存牵引设置

图11

11

ixcache缓存设置

图12

12

简单搞了一下,熟悉了esxi的网络配置,这点还是实践出真知。
重要注意的一点,一定要在esxi里面设置虚拟交换机的网卡监听模式为混杂模式。不然的话目的地址不是该IP的包是会被丢弃,也就是说,网络怎么弄都是不通的。

让WordPress使用Redis缓存来进行加速

Redis是一个高级的key-value存储系统,类似memcached,所有内容都存在内存中,因此每秒钟可以超过10万次GET操作。

我下面提出的解决方案是在Redis中缓存所有输出的HTML 内容而无需再让WordPress重复执行页面脚本。这里使用Redis代替Varnish设置简单,而且可能更快。

安装 Redis

如果你使用的是 Debian 或者衍生的操作系统可使用如下命令安装 Redis:

apt-get install redis-server

或者阅读 安装指南

使用 Predis 作为 Redis 的 PHP 客户端

你需要一个客户端开发包以便 PHP 可以连接到 Redis 服务上。

这里我们推荐 Predis. 上传 predis.php 到 WordPress 的根目录。

前端缓存的PHP脚本

步骤1:在WordPress 的根目录创建新文件 index-with-redis.php ,内容如下:

<?php

// Change these two variables:

$seconds_of_caching = 60*60*24*7; // 7 days.

$ip_of_this_website = ‘204.62.14.112’;

/*

– This file is written by Jim Westergren, copyright all rights reserved.
– See more here: www.jimwestergren.com/wordpress-with-redis-as-a-frontend-cache/
– The code is free for everyone to use how they want but please mention my name and link to my article when writing about this.
– Change $ip_of_this_website to the IP of your website above.
– Add ?refresh=yes to the end of a URL to refresh it’s cache
– You can also enter the redis client via the command prompt with the command “redis-cli” and then remove all cache with the command “flushdb”.

*/

// Very necessary if you use Cloudfare:

if (isset($_SERVER[‘HTTP_CF_CONNECTING_IP’])) {
$_SERVER[‘REMOTE_ADDR’] = $_SERVER[‘HTTP_CF_CONNECTING_IP’];
}

// This is from WordPress:

define(‘WP_USE_THEMES’, true);

// Start the timer:

function getmicrotime($t) {
list($usec, $sec) = explode(” “,$t);
return ((float)$usec + (float)$sec);
}

$start = microtime();

// Initiate redis and the PHP client for redis:

include(“predis.php”);
$redis = new Predis\Client(”);

// few variables:

$current_page_url = “http://”.$_SERVER[‘HTTP_HOST’].$_SERVER[‘REQUEST_URI’];

$current_page_url = str_replace(‘?refresh=yes’, ”, $current_page_url);

$redis_key = md5($current_page_url);

// This first case is either manual refresh cache by adding ?refresh=yes after the URL or somebody posting a comment

if (isset($_GET[‘refresh’]) || substr($_SERVER[‘REQUEST_URI’], -12) == ‘?refresh=yes’ || ($_SERVER[‘HTTP_REFERER’] == $current_page_url && $_SERVER[‘REQUEST_URI’] != ‘/’ && $_SERVER[‘REMOTE_ADDR’] != $ip_of_this_website)) {
require(‘./wp-blog-header.php’);
$redis->del($redis_key);

// Second case: cache exist in redis, let’s display it

} else if ($redis->exists($redis_key)) {

$html_of_current_page = $redis->get($redis_key);

echo $html_of_current_page;

echo “<!– This is cache –>”;

// third: a normal visitor without cache. And do not cache a preview page from the wp-admin:

} else if ($_SERVER[‘REMOTE_ADDR’] != $ip_of_this_website && strstr($current_page_url, ‘preview=true’) == false) {
require(‘./wp-blog-header.php’);
$html_of_current_page = file_get_contents($current_page_url);
$redis->setex($redis_key, $seconds_of_caching, $html_of_current_page);
echo “<!– Cache has been set –>”;

// last case: the normal WordPress. Should only be called with file_get_contents:

} else {
require(‘./wp-blog-header.php’);
}

// Let’s display some page generation time (note: CloudFlare may strip out comments):

$end = microtime();
$t2 = (getmicrotime($end) – getmicrotime($start));
if ($_SERVER[‘REMOTE_ADDR’] != $ip_of_this_website) {
echo “<!– Cache system by Jim Westergren. Page generated in “.round($t2,5).” seconds. –>”;
}
?>

或者直接下载 index-with-redis.php

步骤2:将上述代码中的 IP 地址替换成你网站的 IP 地址

步骤3:在.htaccess 中将所有出现 index.php 的地方改为 index-with-redis.php ,如果你使用的是 Nginx 则修改 nginx.conf 中的 index.php 为 index-with-redis.php(并重载 Nginx : killall -s HUP nginx)。

性能测试

1.没有Redis 的情况下,平均首页执行1.614 秒,文章页0.174 秒(无任何缓存插件)

2.使用Redis 的情况下,平均页面执行时间0.00256秒

我已经在我的博客中使用了如上的方法进行加速很长时间了,一切运行良好。

其他建议

我的环境是Nginx + PHP-FPM + APC + Cloudflare + Redis. 安装在一个 nano VPS 中,无缓存插件。

请确认使用了gzip压缩,可加快访问速度。

访问 wp-admin

要访问 wp-admin 必须使用 /wp-admin/index.php 代替原来的 /wp-admin/.

原文:jimwestergren 编译:oschina

异步执行的Gravatar缓存

这篇文章挺不错的,纯技术学习,转载一下哈。

不少人用的是 Willin Kan 的缓存 Gravatar 头像之方法,我昨天在本地调试主题的时候加上了这段代码,但发现了一个比较严重的问题:评论列表要等很长的时间才能显示,甚至直接 30 秒超时。原因是原代码中这样一句(第 13 行):

copy($g, $e);

copy 函数起到了把 Gravatar 头像复制到本地的作用,此时 PHP 解释器只能等待复制完成才能继续运行,反而成为拖慢速度的隐患。

本文适用于以下情况:

使用国内服务器但想缓存 Gravatar 头像;
Gravatar 服务器出现问题时。
国外服务器由于访问 Gravatar 服务器很快,因此不会有明显的延迟感,但当以上情况时延迟就非常明显了。

该怎么解决这个问题呢?某个 Gravatar 头像第一次被显示时,实际上仍然是调用 Gravatar 服务器的资源,与此同时博客的服务器再从 Gravatar 服务器将头像下载下来。博客服务器下载头像的过程对用户访问是没有任何意义的,应该将 copy 过程放在另一个线程执行,评论列表输出不受影响,问题就解决了。

PHP 本身是不支持多线程的,我们可以将下载头像的代码写在一个单独的 PHP 文件中,然后由处理评论列表的函数发起一个到此文件的请求,并立即关闭连接,继续向下执行。被请求的文件进行下载工作就相当于异步执行了。

下面给出具体实行方法。

一、建立异步执行的 PHP 文件

在 WordPress 根目录或者其它文件夹新建 gravatar.php(也可以改成您喜欢的名字),内容如下:

if ( $_SERVER['REQUEST_METHOD'] != 'POST' ) {
    header( 'Allow: POST' );
    header( 'HTTP/1.1 405 Method Not Allowed' );
    header( 'Content-Type: text/plain' );
    exit;
}
$key = '123456'; // $key 为防止恶意提交的验证码
if ( !isset( $_POST['hash'], $_POST['s'], $_POST['key'] ) || $_POST['key'] != $key ) {
    header( 'HTTP/1.1 400 Bad Request' );
    header( 'Content-Type: text/plain' );
    exit;
}
$hash = $_POST['hash'];
if ( !ctype_alnum( $hash ) || strlen( $hash ) != 32 )
    return;
$s = strtoupper($_POST['s']);
if ( !ctype_digit( $s ) ) return;
$r = isset( $_POST['r'] ) ? $_POST['r'] : '';
$rating = array( '', 'G', 'PG', 'R', 'X' );
if ( !in_array( $r, $rating ) )
    return;
if ( defined( 'ABSPATH' ) )
    require_once( ABSPATH . 'wp-load.php' );
else
    require_once( './wp-load.php' ); // 要用相对路径指向 WordPress 根目录,如果放在主题目录下,则改为 ../../../wp-load.php
$d = get_bloginfo( 'wpurl' ) . '/wp-content/avatar/default.png'; // 缺省头像的位置
$gravatarpath = "http://www.gravatar.com/avatar/";
$gravatarpath .= $hash;
$gravatarpath .= '?s=' . $s;
$gravatarpath .= '&d=' . urlencode( $d );
if ( !empty( $r ) )
    $gravatarpath .= '&r=' . $r;
$cachepath = ABSPATH . 'wp-content/avatar/' . $hash; // 缓存头像保存的位置
copy( $gravatarpath, $cachepath );
if ( filesize( $cachepath ) < 500) copy( $d, $cachepath );

几点说明:

第 8 行中 $key 为防止恶意提交的验证码,请改成不容易破解的字符组合,也不要告诉他人;
如果文件不是放在根目录,需要修改第 24 行的相对路径,距离根目录多少层就打入多少 ../,主题目录为 /wp-content/themes/theme,共有 3 层则为 ../../../wp-load.php;
没有为缓存的头像指定扩展名,因为头像可能有多种格式。实际上也不需要扩展名。

二、建立 Gravatar 头像存放的文件夹

根据刚才设定的缓存头像保存位置新建文件夹,例如代码中将 Gravatar 头像存放在 wp-content/avatar 文件夹下,因为我认为 wp-content 文件夹是用来存放用户生成内容的。

请将此文件夹的权限(chmod)设定为 755。

将无 Gravatar 头像时显示的缺省头像放在新建的文件夹中,文件名要与上面代码中「缺省头像位置」一行一致。

三、写入 functions.php

打开主题目录下的 functions.php,在 之间插入以下代码,如果你已经用了 Willin Kan 的代码,请替换:

function my_avatar( $email, $size = '40', $default = '', $alt = false ) {
    $alt = ( false === $alt ) ? '' : esc_attr( $alt );
    $hash = md5( strtolower( $email ) );
    $wpurl = get_bloginfo( 'wpurl' );
    $out = $wpurl . '/wp-content/avatar/' . $hash; // 缓存头像的 URL
    $cachepath = ABSPATH . 'wp-content/avatar/' . $hash; // 缓存头像位于硬盘的位置
    $t = 1209600; // 设定 14 天, 单位: 秒
    $default = $wpurl . '/wp-content/avatar/default.png'; // 缺省头像的位置
    if ( !is_file( $cachepath ) || ( time() - filemtime( $cachepath ) ) > $t ){ // 当头像不存在或文件超过 14 天才更新
        $rating = get_option( 'avatar_rating' );
        $gravatarpath = "http://www.gravatar.com/avatar/$hash?s=$size&d=$default&r=$rating";
        $key = '123456'; // $key 为刚刚用于异步下载的 PHP 文件中设定的验证码
        $fp = fsockopen( $_SERVER['HTTP_HOST'], 80, &$errno, &$errstr, 5 ); // 建立 Socket 连接
        if ( $fp ) {
            $encoded = "hash={$hash}&s={$size}&r={$rating}&key=" . urlencode( $key );
            fputs( $fp, "POST ".get_bloginfo('wpurl')."/wp-content/themes/beam/gravatar.php HTTP/1.0\n" ); // 用于异步下载的 PHP 文件 URL
            fputs( $fp, "Host: ".$_SERVER['HTTP_HOST']."\n" );
            fputs( $fp, "Content-type: application/x-www-form-urlencoded\n" );
            fputs( $fp, "Content-length: " . strlen($encoded)."\n" );
            fputs( $fp, "Connection: close\n\n" );
            fputs( $fp, "$encoded\n" );
            fclose( $fp );
        }
        $out = esc_attr( $gravatarpath );
    }
    $avatar = "{$alt}";
    return apply_filters( 'my_avatar', $avatar, $email, $size, $default, $alt );
}

几点说明:

请将 $key 改为与第一步中指定的验证码一致,否则程序不能工作;
该函数调用方式与 WordPress 自带 get_avatar 已不相同;
get_avatar 语法:

get_avatar( $id_or_email, $size = '', $default = '' , $alt = '' );

my_avatar 语法:

my_avatar( $comment->comment_author_email, $size = '', $default = '' , $alt = '' );

您也可以将 WordPress 自带 get_avatar 复制并改造以保持原有功能;

按照以上变更的调用方式,将所有主题模板中出现的 get_avatar() 修改为 my_avatar(),「大概是 functions.php,comments.php,sidebar.php,comments-ajax.php 会有头像的地方有 get_avatar() 函数。」

四、测试

如果把文件放在与本文给出的位置不一样的地方,要修改的地方会比较多,最好在本地测试完成后上传到服务器。

转自http://beamnote.com/2010/asynchronous-implementation-of-the-gravatar-cache.html

用php更改非php输出内容

前几天有个需求,就是将页面输出的内容进行过滤… 进行域名更换…
比如本来将输出的www.csdn.net/image/上面的图片内容,现在迁移到了cdn上面,域名更改为cdn.csdn.net/image/
再不更改模版的基础上,直接将输出进行修正…

实现过程
1.将所有输出放到output buffer里面
2.在php脚本结束后对output buffer进行修改过滤,再输出.

so测试如下:
原输出假设是如下:







那么在输出html前,加入到php执行中如下代码即可进行html内容的替换

  

则输出变成







重点在于
1.ob_xxx函数 output buffer控制
2.register_shutdown_function函数 注册一个脚本结束时运行的函数..

注意:
1.register_shutdown_function的这个输出必须是最后一个register的…
2.如果流程中有output buffer控制函数,需要具体情况具体分析,进行使用.

转自http://blog.csdn.net/sunvince/article/details/6312971

[转]部署nginx反向代理及缓存

#tar xvf prce-8.00.tar.gz

#cd prce-8.00

#./configure

#make && make install

#useradd -s /sbin/nologin www

#cd ../

#tar –xvf ngx_cache_purge-1.2.tar.gz

#tar nginx-0.8.53.tar.gz

#cd nginx-0.8.53

#./configure –user=www –group=www –add-module=../ngx_cache_purge-1.2 –prefix=/usr/local/nginx –with-http_stub_status_module –with-http_ssl_module

#make && make install

第四,修改并配置nginx

#cd /usr/local/nginx/conf

#vim nginx.conf

#nginx 运行的用户 user nobody;

#开启的进程数

worker_processes 1;

#定义错误日志的路径及其日志级别

error_log /usr/local/nginx/logs/error.log crit;

#nginx 的进程

pid logs/nginx.pid;

#specifiles the value for maximum file descriptors that can be opened by this process

#文件句柄数,和系统单进程打开的文件数相同,不必理会进程个数

worker_rlimit_nofile 65535;

events {

use epoll;

worker_connections 1024; #定义的是单个进程的连接数,该值受系统进程打开文件数限制,需要修改打开的文件句柄数,但是max_client = worker_proxesses X work_connextions,

}

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” ‘

‘”request_method $scheme://$host$request_uri $server_protocol” $status $body_bytes_sent’

‘”$http_user_agent” “$http_x_forwarded_for”‘;

# 指定服务器名称哈希的大小,hash bucket size 等于一路处理器缓存大小,与server_names_hash_max_size 共同控制保存服务器名的HASH表

server_names_hash_bucket_size 128;

# 以下两项是设定客户端请求Header头缓存去的大小,4 为个数。128k 为大小。申请4个128k。当http 的uri太长或者request header 过大时会报414 Request URI too large 或者400 bad request

client_header_buffer_size 32k;

large_client_header_buffers 4 128k;

#HTTP请求的BODY 最大限制,若超出此值,报413 Request Entity Too Lager

client_max_body_size 8m;

#缓冲去代理用户请求的最大字节数,可以理解为先保存本地,然后在传给用户

client_body_buffer_size 32k;

#不允许客户端主动关闭连接,如果该项为设置在nginx的日志中可能出现499 错误

proxy_ignore_client_abort on;

#nginx 和后端服务器连接超时时间 发起握手等候响应时间

proxy_connect_timeout 5;

#连接成功后等候后端服务器响应时间,其实已经进入后端的排队等候处理

proxy_read_timeout 60;

#后端服务器数据回传时间,就是在规定的时间内后端服务器必须传完所有的数据

proxy_send_timeout 5;

#代理请求缓存去,该缓存去间保存用户的头信息,以供nginx进行规则处理一般只要保能保存下头信息即可

proxy_buffer_size 32k;

#告诉nginx保存单个用的几个buffer 最大用多少空间

proxy_buffers 4 64k;

#高负载下缓冲大小(proxy_buffers*2)

proxy_busy_buffers_size 128k;,

#设置缓存文件夹大小,如果大于该值,将从upstream 服务器传递请求,而不缓冲到磁盘上

proxy_temp_file_write_size 1024m;

#这个将为打开文件指定缓存,默认是没有启用的,max指定缓存数量,建议和打开文件数一致,inactive是指经过多长时间文件没被请求后删除缓存。

open_file_cache max=102400 inactive=20s;

#这个是指多长时间检查一次缓存的有效信息。

open_file_cache_valid 30s;

#open_file_cache指令中的inactive参数时间内文件的最少使用次数,如果超过这个数字,文件描述符一直是在缓存中打开的,如上例,如果有一个文件在inactive时间内一次没被使用,它将被移除。

open_file_cache_min_uses 1;

#shutdown error display nginx version

# 关闭错误时的nginx 的版本显示

server_tokens off;

#open os function sendfile

# 打开高效的文件传输模式

sendfile on;

#tcp_nopush on;

tcp_nopush on; # 打开linux TCP_CORK,只有sendfile 打开时,该项才有效,用来发送系统HTTP response headers 设置选项的目的是告诉TCP协议不要仅仅为清空发送的缓存而发送报文段。通常三个设置TCPNOPUSH 插口选项。当请求长度超过报文段最大长度时,协议就好可能发出满长度的报文段,这样可以减少报文段的数量,减少的程度取决于每次发送的数量

keepalive_timeout 60;

tcp_nodelay on; #打开TCP_NODELAY 在包含了keepalived 才有效,上面的四项有效的提高了文件传输性能,用sendfile() 函数来转移大量的数据,协议会需要预先解决数据包包头部分,正常情况下包头很小,而且套接字上设置了TCP_NODELAY 。有包头的包将被立即传输,在一些情况下,因为包成功的被对方收到后需要请求对方确认,这样,大量的数据传输就会被延迟而且产生大量不必要的网络流量交换,但是在socket上是指了TCP_CORK ,就像个管道塞住塞子把带有包头的包填满数据,所有的数据根据大小进行填充,自动通过数据包发送出去,但是在数据传送完成是,需要把塞子打开

#开启gzip 的设置

#gzip on;

gzip on;

#设置允许压缩的页面的最小字节数,页面字节数从Header 头中的Content-Length中获取建议设置成大于1k的字节数,小于1k可能越压越大

gzip_min_length 1k;

#设置以16k为单位4倍申请内存做压缩结果缓存,默认值是申请跟原始数据相同大小的内存空间存储gzip压缩结果

gzip_buffers 4 16k;

#默认1.1 ,大部分浏览器支持gzip 压缩

gzip_http_version 1.1;

#设置压缩级别 压缩比率1-9,压缩比率越大,越消耗系统资源

gzip_comp_level 2;

#设置压缩列席

gzip_types text/plain application/x-javascript text/css application/xml;

#设置前端的缓存服务,如squid缓存经过nginx压缩的数据,该选项在做反向代理是设定压缩,后面参数为验证的header头信息,在做相应的压缩处理,

gzip_vary on;

#proxy_cache

# 该处设置的是缓存的目录及其设置的大小

proxy_cache_path /usr/local/nginx/proxy_temp levels=1:2 keys_zone=cache_one:200m inactive=1d max_size=30g;

#设置负载池

upstream backend_server {

server 192.168.2.194:80 ;

# 注weight设置的权重 max_fails 设置的是健康监测失败次数,timeout 设置超时时间 当然此处主要是设置nginx的反向代理及其缓存,对于nginx 的负载均衡,在以后的文章中再详细介绍

# server 192.168.2.107:80 weight=1 max_fails=2 fail_timeout=30s;

}

server {

#注:监听的端口号

listen 80;

#server_name localhost;

#设置监听的主机名

server_name freehat.blog.51cto.com;

if ($host !~ ‘freehat.blog.51cto.com’) {

return 403;

}

#charset koi8-r;

#access_log logs/host.access.log main;

location / {

root html;

index index.html index.htm;

}

#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;

}

#设置扩展名以gif .jpg .css 等结尾的静态文件缓存

location ~.*\.(gif|jpg|jpeg|png|bmp|sqf|js|css)$

{

#设置防盗链

valid_referers none blocked freehat.blog.51cto.com;

if ($invalid_referer) {

return 404

#如果后端的服务器返回502 504 执行超时等错误,自动将请求转发到upstream 负责均衡池中的另外一台服务器,实现故障转移

proxy_next_upstream http_502 http_504 error timeout invalid_header;

#进行缓存,使用web缓存去cache_one

proxy_cache cache_one;

#以域名,URI,参数组合成web缓存的Key值,Nginx根据Key值哈希,储存缓存内容到二级缓存目录内

#对不同的HTTP 状态码设置不同的缓存时间

proxy_cache_valid 200 304 12h;

proxy_cache_valid any 1m;

proxy_set_header Host $host;

proxy_set_header X-Real-IP $remote_addr;

#设定proxy_set_header Accept-Encoding 或者是后台服务器关闭gzip,该台机器才不会缓存被压缩的文件,造成乱码

proxy_set_header Accept-Encoding “none”;

# proxy_set_header Accept-Encoding “”; 同上面一项相同

#设置proxy_cache 支持后台设定的expires , 即使支持HTTP头信息定义的缓存规则

proxy_ignore_headers “Cache-Control” “Expires”;

if ( !-e $request_filename )

{

proxy_pass http://backend_server;

}注: 该项是如果client 请求的文件在cache 中保存,nginx 直接从cache中把对应的文件返还给client ,不会在去后端的Server 去取对应的文件

expires 1h; 设置过去的时间

}

#set don’t php jsp cgi in cache 设置php jsp cgi 不保存在cache中

location ~.*\.(php|jsp|cgi)?$

{

proxy_set_header Host $host;

proxy_set_header X-Forwarded-For $remote_addr;

proxy_pass http://backend_server;

}

#set js and css cache expire time 设置js|css 在浏览器中过期的时间

location ~ .*\.(js|css)

{

expires 1h;

}

#clean all cache 设置清除所有的cache

location ~/purge(/.*)

{

allow 127.0.0.1;

allow 192.168.2.0/24;

deny all;

proxy_cache_purge cache_one $host$1$is_args$args;

}

}

}

第五,启动机及其关闭nginx的命令

1 启动之前检查nginx的主配置文件是否有错误

# /usr/local/nginx/sbin/nginx -t

2 启动nginx的方式

# /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf

3 关闭nginx 的方式

# /usr/local/nginx/sbin/nginx -s stop

4 平滑启动nginx

#kill -HUP `cat /usr/local/nginx/logs/nginx.pid`

浅谈Nginx服务器反向代理的一些应用

Nginx作为反向代理的简单应用
对于Nginx的反向代理主要在四个方面:
1、URL重写 URL rewirte
2、反向代理 reverse proxy 并启用缓存功能
3、负载均衡
4、安装第三方模块,实现健康状态检测。

关于一些Nginx的应用,可以在Nginx的官方网站上看到,内容介绍的也相当的详细。这里只浅谈一些我对于Nginx服务器学习到和一些认识。网站地址: http://wiki.nginx.org/Modules

一、URL重写 URL rewirte

要想使Nginx有rewirte功能,要在编译Nginx时要用到–with-http_rewirte_module这个模块,这个功能在编译的时候也是默认打开,如果不想使用这个功能就用–without-http_rewirte_module
这个功能也支持URI重写。

在这个功能中有 if(URL重写在什么的条件下) set rewirte等相关的应用,有兴趣的可到其官方网站到看。
下面来说一下rewirte 和 if 的使用。
1、rewirte
这是个模式匹配如下:
rewrite regex replacement flag
来简单的解释一下这句的意思:rewirte 是关键字,regex是匹配的模式,replacement 是把匹配到的替换成什么,flag是标志位。
例如:将htt://www.zhou123.com/attatch.php?value=111223 改写为http://www.zhou123.com/111223/attatch
就可如下所示的形式:

rewirte ^/(attatch)\.php\?value=(.*)$ /$2/$1 last;

下面来说一下标志位:
last: 当前的内容已经完成了,可以继续以后的语句(如果有多条语句时)
break: (当重写的语句执行完成后就直接跳出去支行后面的语句)
redirect: 重定向到一个完整的URL中去如:http://。用302来表示,这个是临时性的。
permanent: 永久重定向 用301表示;
下面来举个小例子:
如用户访问:www.zhou123.com/forum/ 重写为www.zhou123.com/bbs/

rwirte ^/forum/?$ /bbs/ permanent;

编辑nginx的配置文件来测试一下:
vim /etc/nginx/nginx.conf
定位到 server 这行在这个server加入如上内容即可:

location / {
root html;
rwirte ^/forum/?$ /bbs/ permanent; #####这行是新加的内容。
index index.html;
}

在浏览器中输入:http://www..zhou123.com/forum/就会把地址改成www.zhou123.com/bbs/。
rewirte比较简单这里就不测试了。

2、 关于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….

3、实现域名跳转:
要在配置文件中修改成如下所示的内容:
server
{
listen 80;
server_name jump.magedu.com;
index index.html index.php;
root /www/htdocs;
rewrite ^/ http://www.magedu.com/;
}
这样就可以把jump.magedu.com 改成http://www.magedu.com/这个域名了。
4、实现域名镜像
server
{
listen 80;
server_name mirror.magedu.com;
index index.html index.php;
root /www/htdocs;
rewrite ^/(.*)$ http://www.magedu.com/$1 last;
}
对于Nginx的URL重写就简单的介绍到这。

二、下面来谈谈Nginx的反向代理功能:

1、proxy
这个模块在Nginx编译时也是默认开启的。
用法:proxy_pass URL地址。
就说通过Nginx要反向代理到什么地方去,后面的URL就是要代理的后台服务器的地址 。
下面用一个事例来说明一下:
在Nginx服务器的ip为:192.168.35.1/24
后台的服务器ip是: 172.16.35.3/16 安装了apachen服务器,提供网页。
在nginx的配置文件中只要加入如下所示的内容即可:
location / {
#root html;
#index index.html;
proxy_pass http://172.16.35.3; ## 添加这条内容即可。
}

在后台的apache服务器的网页内容:
# echo “172.16.35.3” > /var/www/html/index.html
在浏览器中输入:http://192.168.35.1就会如下图所示的结果:

此时的Nginx的反向代理并没有什么实际的意义,只是在用户和服务器之间多加了一台服务器而已。要为Nginx添加缓存功能此时才能把Nginx的优势发挥出来。

2、为反向代理启用缓存功能:
在配置文件中加入如下所示的内容:

http {
proxy_cache_path /data/nginx/cache levels=1:2 keys_zone=STATIC:10m inactive=24h max_size=1g;
server {
location / {
proxy_pass http://172.16.35.3;
proxy_set_header Host $host;
proxy_cache STATIC;
proxy_cache_valid 200 1d;
proxy_cache_use_stale error timeout invalid_header updating http_500 http_502 http_503 http_504;
}
}
}
下面要实现的环境与上面所提到的例子的环境一样。
在Nginx服务器的ip为:192.168.35.1/24
后台的服务器ip是: 172.16.35.3/16 apache服务
添加完成后来进行一下压力测试:
在另外的一台服务器上用命令:
ab -c 100 -n 10000 http://192.168.35.1/index.html ###通过nginx服务器来访问apache服务器。
在结果中找到如下一行:
Requests per second: 7354.40 [#/sec] (mean) ####### 7354表示每秒接受请求的个数

ab -c 100 -n 10000 http://172.16.35.3/index.html ###来访问apache服务器。
同样在结果中找到如下一行:
Requests per second: 1489.96 [#/sec] (mean)
从两个结果就可以清晰的看到Nginx的反向代理加上缓存功能是多么的强大。几乎是apache服务器的10倍。

三、反向代理多台服务器实现负载均衡:

再添加一台后台的服务器:ip:172.16.35.2/16 也提供apache服务器。
这时的实验环境是:三台虚拟机了

nginx:192.168.35.1/24
两台apache服务器ip分别为:
172.16.35.2/16
172.16.35.3/16
要保证三台服务器之间的网络能正常通信哟!!!

新加入的服务器网页内容为:“172.16.35.2”
# echo “

172.16.35.2

” > /var/www/html/index.html

在nginx的配置文件中加入如下所示的内容:

http {

proxy_cache_path /data/nginx/cache levels=1:2 keys_zone=STATIC:10m inactive=24h max_size=1g;
upstream myload {
server 172.16.35.2;
server 172.16.35.3 weight=2;
#################### 定义这两个后台服务器并加上了权重。
}

server {
listen 80;
server_name localhost;
location / {
proxy_pass http://myload; #### 这个名称一定要与前面定义的相同。
}

在浏览器中输入:http://192.168.35.1如图所示的结果:

经过刷新网页的内容在如此图所示的结果来回切换。这是为了显示结果所以为两个服务器设置了不同的网页。

四、安装配置第三方模块,实现upstream中对后端http

server的健康状态检测:
说明:这需要为nginx打补丁才能应用,所要重新源码编译nginx。

模块下载地址:https://github.com/cep21/healthcheck_nginx_upstreams;模块名称:ngx_http_healthcheck_module

安装配置方法:
1、首先解压healcheck模块到某路径下,这里假设为/tmp/healthcheck_nginx_upstreams

2、对nginx打补丁

首先解压nginx,并进入nginx源码目录:
# tar xf nginx-1.0.11.tar.gz
# cd nginx-1.0.11
# patch -p1 < /tmp/healthcheck_nginx_upstreams/nginx.patch 而后编译nginx,在执行configure时添加类似下面的选项: --add-module=/tmp/healthcheck_nginx_upstreams 所以,这里就使用如下命令: # ./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 ngx_http_healthcheck_module模块的使用方法: 1、此模块支持的指令有: healthcheck_enabled 启用此模块 healthcheck_delay 对同一台后端服务器两次检测之间的时间间隔,单位毫秒,默认为1000; healthcheck_timeout 进行一次健康检测的超时时间,单位为毫秒,默认值2000; healthcheck_failcount 对一台后端服务器检测成功或失败多少次之后方才确定其为成功或失败,并实现启用或禁用此服务器; healthcheck_send 为了检测后端服务器的健康状态所发送的检测请求;如:healthcheck_send "GET /health HTTP/1.0" 'Host: www.zhou123.com'; healthcheck_expected 期望从后端服务器收到的响应内容;如果未设置,则表示从后端服务器收到200状态码即为正确; healthcheck_buffer 健康状态检查所使用的buffer空间大小; healthcheck_status 通过类似stub_status的方式输出检测信息,使用方法如下: location /stat { healthcheck_status; } 一个例子: 在配置文件中写上如下内容: http { ... ... proxy_cache_path /data/nginx/cache levels=1:2 keys_zone=STATIC:10m inactive=24h max_size=1g; upstream myload { server 172.16.35.2; server 172.16.35.3 weight=2; healthcheck_enabled; healthcheck_delay 1000; healthcheck_timeout 1000; healthcheck_failcount 2; healthcheck_send "GET /.health.html HTTP/1.0"; ## 这个是检测网页,这个网页的内容不作要求。只要这个网页存在即可。 } server { listen 80; server_name localhost; location / { proxy_pass http://myload; } location /stat { healthcheck_status; } ##############这个可以查看状态; 在浏览器中输入:http://192.168.35.1/stat 下图是测试的结果:

上图是两个服务器都正常的情况的结果。

当有一个服务器挂了就会显示如下的结果:

OK! 这些关于Nginx服务器反向代理的应用,就先说到这吧。
有想了解的更多的最好在nginx的官方网站阅读nginx的文档。其文档是相当的详细,唯一缺点就这个是用英语写的,看的好不辛苦啊!英语不好,也是个大问题啊!要努力学习这个又爱又恨的英语。

本文出自 “linux学习” 博客,请务必保留此出处http://zhou123.blog.51cto.com/4355617/840837