Nginx让带www的域名跳转到根域名上和让不带www的根域名跳转到带www的域名上

在Nginx下有许多让带www域名跳转到不带www的根域名上或者让不带www跳转到www的域名上的方法

下面说一下我正在用的方法,希望对各位能有所帮助.

 

重定向非www域名到www上

单域名

server {
        server_name example.com;
        return 301 $scheme://www.example.com$request_uri;
}

全部域名

server {
        server_name "~^(?!www\.).*" ;
        return 301 $scheme://www.$host$request_uri;
}

 

重定向www域名到根域名上

单域名

server {
        server_name www.example.com;
        return 301 $scheme://example.com$request_uri;
}

全部域名

server {
         server_name "~^www\.(.*)$" ;
         return 301 $scheme://$1$request_uri ;
}

 

我们创建单独的 Server{} 块是Nginx官方推荐的最佳方法来实现跳转.

虽然WordPress下也有插件能在PHP级别上做到跳转,但是出于性能考虑,总是让Nginx来做Nginx可以做到的事.

Nginx报错sched_setaffinity() failed

最近升级了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就没有报错了.

WP-Rocket + Vanrish 4 使用的自定义PURGE规则 (一)

最近把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');

当发布或者更新文章的时候就会自动触发钩子来执行清理动作. 就像备注里所说的一样,这只是一个临时的解决方案,只能清理对应的文章页面.其他相关联的东西都没有修改.等我有空的时候研究一下相关联的内容,再来扩充这个,

Varnish4 强制所有缓存过期

如果你正在使用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

Centos 7上配置Munin MySQL插件.

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

 

20160730163646

在Centos 7上使用Fail2ban来保护SSH服务

使用Fail2ban来保护SSH服务,减轻暴力攻击对安全性的影响.

1.Fail2ban with FirewallD

1.从EPEL库内安装Fail2ban

yum install -y epel-release
yum install -y fail2ban fail2ban-systemd

2.关闭SeLinux(如果开启)

setenforce 0
sed -i "s/SELINUX=.*/SELINUX=disabled/" /etc/selinux/config

3.配置Fail2ban, 我们选择使用Centos 7默认防火墙 FirewallD.

创建 /etc/fail2ban/jail.d/sshd.local 文件,并写入

[sshd]
enabled = true
port = ssh
#action = firewallcmd-ipset
logpath = %(sshd_log)s
maxretry = 5
bantime = 86400

4.启用Fail2ban

systemctl enable fail2ban
systemctl start fail2ban

2.Fail2ban with iptables-services

1.从EPEL库内安装Fail2ban

yum install -y epel-release
yum install -y fail2ban fail2ban-systemd

2.关闭SeLinux(如果开启)

setenforce 0
sed -i "s/SELINUX=.*/SELINUX=disabled/" /etc/selinux/config

3.设置Fail2ban, 在这里我们使用 iptables-services

yum -y install iptables-services
systemctl mask firewalld.service
systemctl enable iptables.service
systemctl enable ip6tables.service
systemctl stop firewalld.service
systemctl start iptables.service
systemctl start ip6tables.service

4.创建 /etc/fail2ban/jail.d/sshd.local 文件,并写入

[ssh-iptables]
enabled  = true
filter   = sshd
action   = iptables[name=SSH, port=ssh, protocol=tcp]
logpath  = %(sshd_log)s
maxretry = 5
bantime = 86400

5.启用Fail2ban

systemctl enable fail2ban
systemctl start fail2ban