【NGINX入门】3.Nginx的缓存服务器proxy_cache配置

【NGINX入门】3.Nginx的缓存服务器proxy_cache配置,第1张

本文介绍NGINX缓存机制,配置和参数说明。

如图所示,nginx缓存,可以在一定程度上,减少源服务器的处理请求压力。因为静态文件(比如css,js, 图片)中,很多都是不经常更新的。nginx使用proxy_cache将用户的请求缓存到本地一个目录。下一个相同请求可以直接调取缓存文件,就不用去请求服务器了。毕竟,IO密集型服务的处理是nginx的强项。

Nginx的缓存加速功能是由proxy_cache(用于反向代理和静态缓存)和fastcgi_cache(PHP动态缓存)两个功能模块完成。

Nginx缓存特点:

先上个例子:

因为我是在一台服务器上做试验,所以用了两个端口 80 和 90 进行模拟两台服务器之间的交互。

接下来讲一下配置项:

这里我设置了 图片 、 css 、 js 静态资源进行缓存。

当用户输入 http://wangxiaokai.vip 域名时,解析得到 ip:port 的访问地址。 port 默认为80。所以页面请求会被当前server截取到,进行请求处理。

当解析到上述文件名结尾的静态资源,会到缓存区获取静态资源。

如果获取到对应资源,则直接返回数据。

如果获取不到,则将请求转发给 proxy_pass 指向的地址进行处理。

这里直接处理 90 端口接受到的请求,到服务器本地目录 /mnt/blog 下抓取资源进行响应。

细心的读者应该发现,我在第二段例子里,留了个彩蛋 add_header wall "hey!guys!give me a star." 。

add_header 是用于在报头设置自定义的信息。

所以,如果缓存有效的话,那么静态资源返回的报头,一定会带上这个信息。

(1)Nginx系列教程(3)nginx缓存服务器上的静态文件

https://yq.aliyun.com/articles/752967

(2)proxy_cache

nginx 反向代理之 proxy_cache https://www.cnblogs.com/yyxianren/p/10832172.html

(3)Nginx使用upstream负载均衡和proxy_cache缓存实现反向代理

https://blog.51cto.com/13770206/2163952

Windows下的Memcache安装

1. 下载memcache的windows稳定版,解压放某个盘下面,比如在c:\memcached

2. 在终端(也即cmd命令界面)下输入 c:\memcached\memcached.exe -d install--安装memcached成为服务,这样才能正常运行,否则运行失败!

3. 再输入: c:\memcached\memcached.exe -d start--启动memcached的。

以后memcached将作为windows的一个服务每次开机时自动启动。这样服务器端已经安装完毕了。

Linux下的安装:

1.下载memcached和libevent,放到 /tmp 目录下

# cd /tmp

# wget http://www.danga.com/memcached/dist/memcached-1.2.0.tar.gz

# wget http://www.monkey.org/~provos/libevent-1.2.tar.gz

2.先安装libevent:

# tar zxvf libevent-1.2.tar.gz

# cd libevent-1.2

# ./configure –prefix=/usr

# make

# make install

3.测试libevent是否安装成功:

# ls -al /usr/lib | grep libevent

lrwxrwxrwx 1 root root 21 11?? 12 17:38 libevent-1.2.so.1 ->libevent-1.2.so.1.0.3

-rwxr-xr-x 1 root root 263546 11?? 12 17:38 libevent-1.2.so.1.0.3

-rw-r–r– 1 root root 454156 11?? 12 17:38 libevent.a

-rwxr-xr-x 1 root root 811 11?? 12 17:38 libevent.la

lrwxrwxrwx 1 root root 21 11?? 12 17:38 libevent.so ->libevent-1.2.so.1.0.3

4.安装memcached,同时需要安装中指定libevent的安装位置:

# cd /tmp

# tar zxvf memcached-1.2.0.tar.gz

# cd memcached-1.2.0

# ./configure –with-libevent=/usr

# make

# make install

如果中间出现报错,请仔细检查错误信息,按照错误信息来配置或者增加相应的库或者路径。

安装完成后会把memcached放到 /usr/local/bin/memcached ,

5.测试是否成功安装memcached:

# ls -al /usr/local/bin/mem*

-rwxr-xr-x 1 root root 137986 11?? 12 17:39 /usr/local/bin/memcached

-rwxr-xr-x 1 root root 140179 11?? 12 17:39 /usr/local/bin/memcached-debug

memcached的基本设置:

1.启动Memcache的服务器端:

# /usr/local/bin/memcached -d -m 10 -u root -l 192.168.0.200 -p 12000 -c 256 -P /tmp/memcached.pid

-d选项是启动一个守护进程,

-m是分配给Memcache使用的内存数量,单位是MB,这里是10MB,

-u是运行Memcache的用户,这里是root,

-l是监听的服务器IP地址,如果有多个地址的话,这里指定了服务器的IP地址192.168.0.200,

-p是设置Memcache监听的端口,这里设置了12000,最好是1024以上的端口,

-c选项是最大运行的并发连接数,默认是1024,这里设置了256,按照你服务器的负载量来设定,

-P是设置保存Memcache的pid文件,这里是保存在 /tmp/memcached.pid,

2.如果要结束Memcache进程,执行:

# kill `cat /tmp/memcached.pid`

也可以启动多个守护进程,不过端口不能重复。

3.重启apache,service httpd restart

java的客户端连接程序:

将java_memcached-release_1.6.zip解压后的目录中的java_memcached-release_2.0.jar文件复制到java项目的lib目录下。

package utils.cache

import java.util.Date

import com.danga.MemCached.MemCachedClient

import com.danga.MemCached.SockIOPool

/**

* 使用memcached的缓存实用类.

*/

public class MemCached

{

// 创建全局的唯一实例

protected static MemCachedClient mcc = new MemCachedClient()

protected static MemCached memCached = new MemCached()

// 设置与缓存服务器的连接池

static {

// 服务器列表和其权重

String[] servers = {"127.0.0.1:11211"}

Integer[] weights = {3}

// 获取socke连接池的实例对象

SockIOPool sockIOPool = SockIOPool.getInstance()

// 设置服务器信息

sockIOPool.setServers( servers )

sockIOPool.setWeights( weights )

// 设置初始连接数、最小和最大连接数以及最大处理时间

sockIOPool.setInitConn( 5 )

sockIOPool.setMinConn( 5 )

sockIOPool.setMaxConn( 250 )

sockIOPool.setMaxIdle( 1000 * 60 * 60 * 6 )

// 设置主线程的睡眠时间

sockIOPool.setMaintSleep( 30 )

// 设置TCP的参数,连接超时等

sockIOPool.setNagle( false )

sockIOPool.setSocketTO( 3000 )

sockIOPool.setSocketConnectTO( 0 )

//sockIOPool.setFailover(bFailover)

//sockIOPool.setAliveCheck(bAliveCheck)

// 初始化连接池

sockIOPool.initialize()

// 压缩设置,超过指定大小(单位为K)的数据都会被压缩

if (memCachedClient == null)

{

mcc = new MemCachedClient(sPoolName)

mcc.setCompressEnable(true)

mcc.setCompressThreshold(4096)

mcc.setPrimitiveAsString(true)

}

}

/*

<h3>基于Spring的配置,如下:</h3>

<pre>

<bean id="memCachedService" class="com.ms.memcached.MemCachedServiceImpl">

<constructor-arg index="0" value="${memcached.pool.name}" />

<constructor-arg index="1" value="${memcached.pool.servers}" />

<constructor-arg index="2" value="${memcached.pool.initConn}" />

<constructor-arg index="3" value="${memcached.pool.maxConn}" />

<constructor-arg index="4" value="${memcached.pool.minConn}" />

<constructor-arg index="5" value="${memcached.pool.socketTO}" />

<constructor-arg index="6" value="${memcached.pool.maintSleep}" />

<constructor-arg index="7" value="${memcached.pool.nagle}" />

<constructor-arg index="8" value="${memcached.pool.failover}" />

<constructor-arg index="9" value="${memcached.pool.aliveCheck}" />

</bean>

</pre>

<h3>利用com.MS.cache.properties来设置参数,如下:</h3>

<pre>

memcached.pool.name = MS

memcached.pool.servers = 192.168.9.132:12000,192.168.9.133:12000

memcached.pool.initConn = 128

memcached.pool.maxConn = 1024

memcached.pool.minConn = 20

memcached.pool.socketTO = 3000

memcached.pool.maintSleep = 30

memcached.pool.nagle = false

memcached.pool.failover = true

memcached.pool.aliveCheck = true

</pre>

*/

/**

* 保护型构造方法,不允许实例化!

*/

protected MemCached()

{

}

/**

* 获取唯一实例.

*/

public static MemCached getInstance()

{

return memCached

}

/**

* 添加一个指定的值到缓存中.

* @param key

* @param value

*/

//新增指定key的缓存内容,但不覆盖已存在的内容。

public boolean add(String key, Object value)

{

return mcc.add(key, value)

}

//expiry过期时间

public boolean add(String key, Object value, Date expiry)

{

return mcc.add(key, value, expiry)

}

//新增或覆盖指定Key的缓存内容

public boolean set(String key, Object value)

{

return mcc.set(key, value)

}

//lExpiry过期时间

public boolean set(String key, Object value, long lExpiry)

{

return mcc.set(key, value, new Date(lExpiry))

}

//根据指定的Key获取缓存内容

public boolean get(String key)

{

return mcc.get(key)

}

//根据指定Key更新缓存内容

public boolean replace(String key, Object value)

{

return mcc.replace(key, value)

}

//lExpiry 指定的时间

public boolean replace(String key, Object value, long lExpiry)

{

return mcc.replace(key, value, new Date(lExpiry))

}

//根据指定Key删除缓存内容

public boolean delete(String key, Object value)

{

return mcc.delete(key, value)

}

//根据指定Key在指定时间后删除缓存内容

public boolean delete(String key, Object value, long lExpiry)

{

return mcc.delete(key, value, new Date(lExpiry))

}

//检测Cache中当前Key是否存在

public boolean exists(String key)

{

return mcc.exists(key)

}

//根据指定一批Key批量获取缓存内容。

/*

* @param sKeys 指定的一批Key。

* @return Object[oValue]

*/

public Object[] getMultiArray(String[] sKeys) throws ServiceException

{

return memCachedClient.getMultiArray(sKeys)

}

/**

* 根据指定一批Key批量获取缓存内容。

*

* @param sKeys 指定的一批Key。

* @return Map<sKey, oValue>

*/

public Map<String, Object>getMulti(String[] sKeys) throws ServiceException

{

return memCachedClient.getMulti(sKeys)

}

public static void main(String[] args)

{

MemCached memCached= MemCached.getInstance()

memCached.add("hello", 234)

System.out.print("get value : " + memCached.get("hello"))

}

}

那么我们就可以通过简单的像main方法中操作的一样存入一个变量,然后再取出进行查看,我们可以看到先调用了add,然后再进行get,我们运行一次 后,234这个值已经被我们存入了memcached的缓存中的了,我们将main方法中红色的那一行注释掉后,我们再运行还是可以看到get到的 value也是234,即缓存中我们已经存在了数据了。

对基本的数据我们可以操作,对于普通的POJO而言,如果要进行存储的话,那么比如让其实现java.io.Serializable接口,因为 memcached是一个分布式的缓存服务器,多台服务器间进行数据共享需要将对象序列化的,所以必须实现该接口,否则会报错的。

Entity

/**

* 获取当前实体的缓存Id

*

* @return

*/

public String getCacheId()

{

return getCacheId(this.getClass(), sBreedId)

}

get

public Breed getBreedById(String sBreedId) throws ServiceException

{

Breed breed = (Breed)memCachedService.get(getCacheId(Breed.class, sBreedId))

if(breed == null)

{

breed = service.get("breed.getBreedById", sBreedId)

if(breed != null)

{

memCachedService.set(breed.getBreedId(), breed)

}

}

return breed

}

save

memCachedService.set(spider.getCacheId(), breed)

update

memCachedService.replace(spider.getCacheId(), breed)

remove

memCachedService.delete(getCacheId(Spider.class, IbreedId))

memCachedService.delete(breed.getCacheId())

listAll

public List listAll() throws ServiceException

{

List breeds = new ArrayList ()

List breedIds = (List)memCachedService.get(getKeyByMap("Breed", null))

if(ObjectUtils.isEmpty(breedIds))

{

breeds = service.list("breed.getAllBreed", null)

if (!ObjectUtils.isEmpty(breeds))

{

breedIds = new ArrayList()

for (Breed breed : breeds)

{

breedIds.add(breed.getBreedId())

}

memCachedService.set(getKeyByMap("Breed", null), breedIds)

}

}

else

{

for (String sBreedId : breedIds)

{

Breed breed = getBreedById(sBreedId)

if (breed != null)

{

breeds.add(breed)

}

}

}

return breeds

}


欢迎分享,转载请注明来源:夏雨云

原文地址:https://www.xiayuyun.com/zonghe/101138.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-03-09
下一篇2023-03-09

发表评论

登录后才能评论

评论列表(0条)

    保存