如果你想要缓存后端服务器404状态的对象,在你当前的VCL文件的vcl_backend_response区域内增加
#Cache 404 for short peruid if time if ( beresp.status == 404 ) { set beresp.ttl = 120s; return (deliver); }
你可以修改120s成为任何你想要缓存的时间.
我缓存404对象120秒,来减轻后端服务器的压力.
It's dangerous to go alone! Take this.
如果你想要缓存后端服务器404状态的对象,在你当前的VCL文件的vcl_backend_response区域内增加
#Cache 404 for short peruid if time if ( beresp.status == 404 ) { set beresp.ttl = 120s; return (deliver); }
你可以修改120s成为任何你想要缓存的时间.
我缓存404对象120秒,来减轻后端服务器的压力.
各位朋友,大家好。
本站刚更新了固定链接的规则,之前的规则
/%yeay%/%month%/%postid%.html (例如 /2016/08/178.html)
更换为
/archives/%postid%.html (例如 /archives/178.html)
Nginx的301跳转已经设置好了,如果你还是遇到打开的页面出现404的问题,请尝试手工替换连接.
最近升级了VPS, 在启动Nginx之后发现nginx_error.log不为空出现sched_setaffinity() 的错误:
2016/08/14 15:47:39 [alert] 9443#0: sched_setaffinity() failed (22: Invalid argument)
Google之后发现,是worker_cpu_affinity指令设置错误导致的问题.
worker_cpu_affinity命令是设置Nginx进程与CPU进行绑定的.可以充分的利用多核/线程的性能
双核机器根据互联网上的说明设置如下,
worker_processes 2; worker_cpu_affinity 01 10;
根据测试,worker_cpu_affinity设置为01 10会出现报错.
正确设置
worker_processes 2; worker_cpu_affinity 00000001 00000010;
修改nginx.conf之后重启nginx就没有报错了.
最近把Blog的前端放到了阿里云香港B,为了更好的缓存和试验新的架构选用了很出名的Varnish来替换掉Nginx作为前端缓存服务器使用. 因为使用的是自定义的一个VCL文件,导致PURGE规则和Blog正在使用的缓存插件WP-Rocket不兼容,使用WP-Rocket插件内部自带的Varnish模块不能清理文章,清理缓存只对首页有效.
在查看了Varnish的日志之后发现,WP-Rocket发送的全局清理的参数类似于 http://example.com/*. 或者 http://example.com/page/.* 但是我的Varnish并没有配置支持Ban方法和支持正则表达式.为了能够清理文章页面,目前我在主题的function.php中加入了以下钩子作为一个临时的解决方案.
//这是一个临时解决方案. function purge_varnish($post_ID) { $url = get_permalink($post_ID); wp_remote_request( $url, array( 'method' => 'PURGE', 'blocking' => false, 'redirection' => 0 ) ); } add_action('save_post', 'purge_varnish');
当发布或者更新文章的时候就会自动触发钩子来执行清理动作. 就像备注里所说的一样,这只是一个临时的解决方案,只能清理对应的文章页面.其他相关联的东西都没有修改.等我有空的时候研究一下相关联的内容,再来扩充这个,
如果你正在使用Varnish 4, 使用Ban命令/参数可以使缓存强制过期
varnishadm命令行中使用ban命令
ban req.url ~ /foo ban req.http.host ~ example.com && obj.http.content-type ~ text ban.list
VCL文件中使用BAN参数
ban("req.url ~ /foo");
在VCL文件中增加BAN方法
sub vcl_recv { if (req.method == "BAN") { ban("req.http.host == " + req.http.host + " && req.url == " + req.url); # Throw a synthetic page so the request won't go to the backend. return(synth(200, "Ban added")); } }
请注意:
Ban只能清除已经在缓存中的对象,例如ban并不能阻止新的对象加入缓存或者正在被处理. 已缓存的对象满足ban将被标记为过时的(obsolete). 过时的对象会被自动回收和其他 obj.ttl==0 的对象一样.
更多内容请参考官方文档: http://book.varnish-software.com/4.0/chapters/Cache_Invalidation.html#banning
如果只修改这一项,重新编译的时候会报这样的错误:
MSVCRTD.lib(crtexew.obj) : error LNK2019: 无法解析的外部符号 _WinMain@16,该符号在函数 ___tmainCRTStartup 中被引用
需要在“高级”选项中添加“入口点”:mainCRTStartup
再次编译就OK了。
Munin自带的有MySQL插件,但是并不太好用,本文将介绍如何安装和配置第三方的Munin MySQL监控插件.
本文中所有操作都在Centos 7, MaraiDB 11.2下完成.
1.安装必要的Perl依赖
yum -y install perl-DBI perl-DBD-mysql perl-Module-Pluggable
2.下载,解压munin-mysql插件
wget https://github.com/kjellm/munin-mysql/archive/master.zip -O munin-mysql.zip
unzip munin-mysql.zip
cd munin-mysql-master
3.修改mysql.conf配置
修改 env.mysqlconnection DBI:mysql:mysql 为 env.mysqlconnection DBI:mysql:munin
修改env.mysqluser root 为 env.mysqluser munin
去掉env.mysqlpassword前面的#号,并把geheim修改成你将要使用监控MySQL账号的密码
4.编辑Makefile, 找到$(MUNIN_NODE) restart (大约45行),备注或者删除掉
5.安装, 在munin-mysql-master目录执行make install
6.配置MySQL,在phpmyadmin或者mysql -u root -p 下执行以下SQL
CREATE USER `munin` @`localhost` IDENTIFIED BY '0do8KxdWULQu'; #请自行把0do8KxdWULQu替换为你在mysql.conf里设置的密码
GRANT SUPER ON *.* TO `munin` @`localhost`;
GRANT PROCESS ON *.* TO `munin` @`localhost`;
CREATE DATABASE IF NOT EXISTS `munin`;
GRANT ALL PRIVILEGES ON `munin`.* TO 'munin'@'localhost';
FLUSH PRIVILEGES;
7.运行munin-run mysql,如果看到以下内容则安装成功.
multigraph mysql_bin_relay_log
Binlog_cache_disk_use.value 0
Binlog_cache_use.value 0
Binlog_stmt_cache_disk_use.value 0
Binlog_stmt_cache_use.value 0
ma_binlog_size.value 0
.....
7.重启munin-node,稍等片刻之后即可在Munin页面上看到MySQL的图表
systemctl restart munin-node
使用方法: 在项目中导入头文件
MYLIB::OrderedList<int> lists;
MYLIB::OrderedList<double> dlists;
P.S: 迭代器有点小问题
//
// Author: Kotarou.
// Email: t.k@07.gs
// FileName: OrderedList.h
// Last modify: 28/05/2015
//
#ifndef __ORDEREDLIST_H__
#define __ORDEREDLIST_H__
#include
namespace MYLIB
{
template
class OrderedList;
template
class ListNode
{
friend class OrderedList;
friend class OrderedList::iterator;
private:
T Element;
ListNode *prev;
ListNode *next;
public:
ListNode() : next(NULL), prev(NULL) {};
};
template
class OrderedList
{
private:
ListNode *head;
ListNode *tail;
public:
OrderedList() : head(NULL), tail(NULL) {};
~OrderedList()
{
// delete all elements
ListNode *temp = NULL;
while(head)
{
temp = head->next;
delete head;
head = temp;
}
};
// insertion sort
void insert(const T &Element)
{
ListNode *temp = new ListNode;
temp->Element = Element;
if(!head && !tail)
{
head = temp;
tail = temp;
}
else
{
//if the Element smaller than head, insert it before the head
if(temp->Element <= head->Element)
{
temp->next = head;
head->prev = temp;
head = temp;
return;
}
//if the Element greater than tail, insert it after the tail
if(temp->Element >= tail->Element)
{
temp->prev = tail;
tail->next = temp;
tail = temp;
return;
}
//find a position to insert
ListNode *cur = head;
while(cur)
{
if(temp->Element <= cur->Element)
{
temp->prev = cur->prev;
cur->prev->next = temp;
temp->next = cur;
cur->prev = temp;
break;
}
cur = cur->next;
}
}
};
class iterator
{
private:
ListNode *node;
bool done;
public:
iterator() : node(NULL), done(false) {};
iterator(ListNode *in) : node(in), done(false){};
T& operator*() // dereference
{
return node->Element;
};
const T& operator*() const
{
return node->Element;
};
iterator& operator++() // prefix
{
node = node->next;
return *this;
};
iterator operator++(int) // postfix
{
iterator temp = *this;
++(*this);
return temp;
};
iterator& operator--() // prefix
{
node = node->prev;
return *this;
};
iterator operator--(int) // postfix
{
iterator temp = *this;
--(*this);
return temp;
};
bool operator==(const iterator& x) const
{
return (node == x.node);
};
bool operator!=(const iterator &rv)
{
if((node == rv.node && node) && done)
return false;
if(node == rv.node && node)
done = true;
return ( node );
};
};
iterator begin()
{
return iterator(head);
};
iterator end()
{
return iterator(tail);
};
};
}
#endif
1.请确保Apache已经打开Mod_rewrite模块.
2.在网站根目录的.htaccess里加入以下内容
RewriteEngine on
RewriteBase /
RewriteCond %{SERVER_PORT} !^443$
RewriteRule ^.*$ https://%{SERVER_NAME}%{REQUEST_URI} [L,R]
3.无需重启服务器,.htaccess文件修改后实时生效.