wordpress利用插件一键启用网站维护模式

在网站的建设运营过程中,我们也会遇到一些原因需求,对网站进行改版和升级,这时访问不了,会给用户带来很不好的体验,那么我们怎么解决这一问题,wordpress的有福了,只需要一个插件就可以轻松搞定。

是不是听着很不错,下面介绍这款插件的详细教程

1、插件名称 Maintenance Mode

在我们进入博客后台之后通过插件——已安装插件——安装插件的步骤,在搜索框中搜索 Maintenance Mode这个插件,找到对应的进行安装并启用,启用之后在设置中可以找到。

未分类

2、对插件进行设置

主要是对于插件功能的熟悉,勾选一键激活之后,模式选择是默认的,最重要的是文本编辑框了,里面编辑的内容就是你要展示 的内容,这个发挥你的想象,最后别忘了下面的保存选项

未分类

3、启用设置之后的效果图

我就做了这简单的页面,还算可以吧!就把你自己观点告诉用户。

未分类

4、站长工具查询状态码

我们通过访问这个网站,返回的是503,服务器错误,也就是进入维护中了。

未分类

WordPress配合Debian VPS 使用sendmail发邮件

WordPress自带了一些邮件功能,但是一直没能正常使用,折腾了一下,顺便做个记录。起初以为厂商禁了25端口,后面发现并没有。本文使用的是Debian系统,涉及iptables,DNS,sendmail,PHP等内容。

0. 开启相关端口 25

25端口为SMTP(Simple Mail Transfer Protocol,简单邮件传输协议)服务器所开放,主要用于发送邮件。如过不需要作为邮件服务器,建议关闭25端口,防止被恶意利用。有些服务器厂商会限制25端口,可以工单联系开通。Debian不会自动保存iptables改动,修改iptables端口的方法有很多,我使用的是修改iptables.up.rules的方法配合/etc/network/if-pre-up.d/iptables(内容如下)

#!/bin/bash
/sbin/iptables-restore < /etc/iptables.up.rules

平时修改iptables直接修改/etc/iptables.up.rules,可以自己使用代码生效,也可以重启自动生效。
/etc/iptables.up.rules里添加

-I INPUT -p tcp -m tcp --dport 25 -j ACCEPT

保存生效

> iptables-restore < /etc/iptables.up.rules

查看当前iptables规则

> iptables-save

1. 配置dns

需要到域名DNS管理那里设置DNS解析,如果是第三方服务如百度,cloudflare就到相应的设置。
添加2条解析

type    name    value
A   mail    xx.xx.xx.xx
AAAA    mail    xxx:xxx:xxx:xxx

A是IPv4,AAAA是IPv6,分别指向服务器的相应ip地址。为什么要两个,因为国内的邮箱如QQ,IPv4就可以了,但是Gmail这样的需要IPv6。

2. 配置dns反向解析

DNS是用来把IP映射成域名,让用户可以用google.com来访问而不是IP,那么Reverse DNS(反向域名解析)就是反过来,将域名映射成IP。因为多数垃圾邮件发送者使用动态分配或者没有注册域名的IP地址来发送垃圾邮件,以逃避追踪,使用了域名反向解析后,就可以大大降低垃圾邮件的数量。不设置的话会被拦截、拒绝,出现如下提示

----- Transcript of session follows -----
... while talking to gmail-smtp-in.l.google.com.:
>>> DATA
<<< 550-5.7.1 [xxx:xxx:xxx:xxx:xxx:xxx:xxx:xxx] Our system has detected that
<<< 550-5.7.1 this message does not meet IPv6 sending guidelines regarding PTR
<<< 550-5.7.1 records and authentication. Please review
<<< 550-5.7.1  https://support.google.com/mail/?p=IPv6AuthError for more information
<<< 550 5.7.1 . m6si6838178pfj.586 - gsmtp
554 5.0.0 Service unavailable

设置Reverse DNS需要到VPS提供商那里设置,如: vultr后台 – server – 某一台服务器 – setting – Reverse DNS
添加IPv4/IPv6 2条Reverse DNS记录

IP Address  Reverse DNS
xx.xx.xx.xx mail.xxx.com
xxx:xxx:xxx:xxx mail.xxx.com

3. 设置hostname

设置服务器的hostname和DNS需要解析的域名一致如mail.xxx.com

> vi /etc/hostname
#立即生效
> hostname -F /etc/hostname

4. 安装sendmail

sendmail是一种邮件传送代理(MTA,Mail Transport Agent)服务器,也可以用其他的代替。

> apt-get install sendmail

安装过程中有重要提示:
To enable sendmail to use STARTTLS, you need to:
1) Add this line to /etc/mail/sendmail.mc and optionally
to /etc/mail/submit.mc:
include(`/etc/mail/tls/starttls.m4')dnl
2) Run sendmailconfig
3) Restart sendmail
根据提示,需要
1) /etc/mail/sendmail.mc和/etc/mail/submit.mc,添加下面include的那一行
include(`/etc/mail/tls/starttls.m4')dnl
并且/etc/mail/sendmail.mc在DAEMON_OPTIONS改成
DAEMON_OPTIONS(`Family=inet, Name=MTA-v4, Port=smtp, Addr=0.0.0.0')dnl
2)执行 > sendmailconfig
3)执行 > service sendmail restart
查询是否正常运行服务
> service sendmail status

5. 安装MAILUTLS

mail 是用户使用客户端(类似foxmail)负责向MTA 撰写 发送邮件,要使用mail来发送邮件,需要安装mailutils。

> apt-get install mailutils

简单的命令来测试发送邮件

> echo "Hello, Water" | mail -s "Water's Greeting" [email protected]

意思是将内容为Hello,Water,主题为Water’s Greeting的email发送到指定的邮箱。
tips:这里测试了几次,刚开始QQ邮箱成功,但是到了垃圾箱,Gmail失败(原因是DNS反向解析没有配置),配置DNS反向解析后,QQ邮箱顺利收件,Gmail收件至垃圾箱,估计是因为内容太简陋被扔到了 垃圾箱。

6. 让PHP支持mail()函数

需要修改php.ini里面的sendmail_path,如何找到php.ini,可以使用 phpinfo.php查看,或者探针,这类应用一般在一键脚本都会携带,如没有可以上传到web目录即可。

Configuration File (php.ini) Path   /usr/local/php/etc
Loaded Configuration File   /usr/local/php/etc/php.ini

php.ini里面的sendmail_path修改为:

sendmail_path = /usr/sbin/sendmail -t -i

重启生效

> service php-fpm restart

如不确定是否修改成功,可继续到phpinfo.php中查看

sendmail_path   /usr/sbin/sendmail -t -i

7. 安装wordpress wp-mail-smtp 插件

这个插件可以配置第三方邮件比如使用QQ邮箱账号密码代发,这里使用原生mail()发送,毕竟搭建了邮件服务器

1.设置邮件地址如:[email protected]
2.设置用户名如:water
3.勾选使用php mail()函数
4.点击测试发邮件。

注意只能测试发送的过程,如果没开25端口,会提示端口连接失败,如果是mail()函数不支持也会提示。如果邮件被拒绝(或其他原因没收到,垃圾箱也没有),是不会提示的,需要到服务器 /var/mail/www 来查看日志 ,www是用户名。

8. 其他

  • 其他并不需要做什么设置,插件已经自动配置好了用户名和邮箱,目前是有评论待审和管理员登录时(由于安装了安全管理插件Wordfence)就有邮件通知啦。其他邮件功能还有待研究。
  • 这里只是配置了发邮件的服务和功能,收件的还没有弄,小域名邮箱,应该没什么用处吧,其他的联系就由Gmail来解决。
  • 邮件服务域名建议不要使用cdn之类的使用DNS服务商的IP来隐藏IP,否则会导致DNS和DNS反向解析的IP对应不上。

Docker安装配置WordPress

本站使用WordPress搭建,之前一直使用Linode $10美刀一个月的服务,机房选择在JP,但是感觉速度不行,在国内链接的响应速度基本都在200-300ms之间,前段时间发现搬瓦工的速度还可以,而且按年付费价格比Linode便宜,所以用了好一段时间来折腾网站迁移的工作。

之前在Linode,网站直接搭建在主机上,上面搭建的服务还很多,迁移非常的困难,于是在新站点服务全面使用基于Docker配置,方便以后迁移。

本站迁移中,使用了两个Docker镜像,官方的WordPress和MariaDB镜像。

安装MariaDB

下载安装最新版的MariaDB镜像

docker pull mariadb

创建一个外部目录/docker/mariadb/var/lib/mysql来存放MariaDB数据文件

mkdir -p /docker/mariadb/var/lib/mysql/

创建并运行MariaDB容器,把本地数据目录映射到容器中的/var/lib/mysql目录,并把3306端口映射到主机地址的3306端口,要注意使用-e MYSQL_ROOT_PASSWORD来指定MariaDB root用户初始密码

docker run --name mariadb -p 3306:3306 -v /docker/mariadb/var/lib/mysql:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=XXXXXXXXXX -d mariadb

登入MariaDB容器环境

docker exec -it mariadb bash
mysql -u root -p

创建数据库和数据库维护用户

create database wordpress character set utf8 collate utf8_general_ci;
create user wordpress_user identified by 'XXXXXXXXX';
grant all privileges on wordpress.* to wordpress_user;
flush privileges;

安装WordPress

下载最新版的WordPress镜像安装

docker pull wordpress

创建并运行Docker容器环境,官方的WordPress镜像是基于Ubuntu+Apache+MySQL的,镜像里面使用的是80端口,因为主机上安装了nginx,代理很多服务,所以把容器里面的80端口映射到主机的8081端口,使用–link mariadb:mysql指定使用的MySQL为已安装的MariaDB容器

docker run --name wordpress -p 8081:80 --link mariadb:mysql -d wordpress

这时候通过浏览器打开地址ip:8081即可按照提示安装WordPress了。

使用nginx反向代理

本机上安装了nginx,配置了https给很多服务使用,所以这里也把WordPress的地址通过用nginx反向代理实现https访问。

在/etc/nginx/conf.d/目录下创建一个新的配置文件

server {
    listen 80;
    server_name liangxiaorui.com www.liangxiaorui.com;
    return 301  https://$server_name$request_uri;
}

server {
  listen       443 ssl;
  server_name liangxiaorui.com www.liangxiaorui.com;
  ssl_certificate /path/to/cert.pem;
  ssl_certificate_key /path/to/key.pem;
  keepalive_timeout 70; 

  error_log /var/log/nginx/liangxiaorui.com.log error; 

  location  / {
        proxy_redirect off;
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-Server $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_pass http://127.0.0.1:8081; 
    }

    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }

}

这里使用proxy_pass反向代理到容器的8081端口实现https访问。这里需要注意的是,一定要加上

proxy_set_header X-Forwarded-Proto $scheme;

因为外部nginx使用的是https,容器里面的Apache使用的是http,添加这句话就是为了识别用户实际发出的是https协议还是http协议,之前没加,导致一直出现127.0.0.1重定向错误。这也是迁移过程中遇到的一个小问题之一。

配置完成之后,就可以通过https访问站点了

未分类

wordpress IP验证不当漏洞修复

wordpress /wp-includes/http.php文件中的wp_http_validate_url函数对输入IP验证不当,导致黑客可构造类似于012.10.10.10这样的畸形IP绕过验证,进行SSRF。

解决方案:

在网站目录中找到这个wp-includes/http.php文件,编辑http.php

查找

$same_host = strtolower( $parsed_home['host'] ) === strtolower( $parsed_url['host'] );

替换成

if ( isset( $parsed_home['host'] ) ) { $same_host = ( strtolower( $parsed_home['host'] ) === strtolower( $parsed_url['host'] ) || 'localhost' === strtolower( $parsed_url['host'] ) ); } else { $same_host = false; };

查找

if ( 127 === $parts[0] || 10 === $parts[0] || 0 === $parts[0]

改成

if ( 127 === $parts[0] || 10 === $parts[0] || 0 === $parts[0] || 0 === $parts[0]

最后保存退出即可修复

Wireshark抓包软件简单用法(协议分析/数据分析)

目前抓包软件比较多,目前我们用的最多的是wireshart和linux下的tcpdump,其中tcpdump不直观,但可以抓包保存为文件以后使用wireshark进行分析。这里简单记录下wireshark的使用。

说明:
1,抓包需要对TCP/IP协议栈有一定的了解,如果不清楚这块,还是需要先梳理网络知识以及TCP/IP协议栈。
2,wireshark能获取HTTP,也能获取HTTPS,但是不能解密HTTPS,所以wireshark看不懂HTTPS中的内容。
如果是处理HTTP,HTTPS 还是用Fiddler, 其他协议比如TCP,UDP 就用wireshark.

一、软件界面介绍

首先了解下界面:

未分类

上图简单说明

(1),主菜单

用于控制整个软件使用,捕获动作、搜索、视图如何显示、过滤规则、拆分、统计等等。

(2),常用按钮

常用按钮从左到右的功能依次是(注意不同版本不一样,大同小异):

1、新捕获抓包。
2,停止捕获抓包。
3,重新开始当前捕获。
4,设置捕获接口,以及捕获文件格式、日志文件自动生成。
5,打开抓包文件。可以打开之前抓包保存后的文件。不仅可以打开wireshark软件保存的文件,也可以打开tcpdump使用-w参数保存的文件。
6、保存文件。把本次抓包或者分析的结果进行保存。
7,关闭打开的文件。文件被关闭后,就会切换到初始界面。
8、重载抓包文件。

(3)小技巧:

软件最后一个抓取的单个数据包没有被格式化的,我们一般不将其显示;时间显示一般会根据实际需要进行显示,到视图那里设置。

二、如何使用wireshark抓包分析

1、设置数据抓取选项。 通过捕获接口指定哪个网卡,开始抓包,这里会抓取所有的包。

期间过滤器那里可以指定要抓取指定协议的数据包,比如我们可以填写http、https、tcp、arp等

2、通过捕获接口指定哪个网卡,设置过滤规则,比如这里指定本地网卡,抓取80端口的包

未分类

抓取效果如下:

未分类

3、使用显示过滤器

很多时候抓的包都不是需要的,我们可以使用过滤器捕获自己需要的包。显示过滤器应用于捕获文件,用来告诉wireshark只显示那些符合过滤条件的数据包。他可以用来过滤不想看到的数据包,但是不会把数据删除。如果想恢复原状,只要把过滤条件删除即可。比如我们这里只抓baidu.com的包:

点击表达式,生成规则,进行过滤。条件选取完以后会声场需要的过滤器指令,可以通过显示过滤器那里直接使用。

未分类

表达式对话框分左中右三部分。左边为可以使用的所有协议域。右边为和协议域相关的条件值。中间为协议域与条件值之间的关系。过滤器表达式对于初学者很有用。如上图,我们创建的表达式的作用是,只显示http协议包中包含关键词“baidu.com”的所有数据包。

字段说明:
这个列表中展示了所有支持的协议。点击前面的三角标志后,可以列出本协议的可过滤字段。当选中“Field name”列表中的任何一项,只需要输入你想要的协议域,就会自动定位到相应的协议域选项。

关系说明:
is present 如果选择的协议域存在,则显示相关数据包。
contains 判断一个协议,字段或者分片包含一个值
matches 判断一个协议或者字符串匹配一个给定的Perl表达式。

值说明:
此处输入合适的值。如果选择的协议域和这个值满足Relation中指定的关系,则显示相关数据包。

预定义值说明:
有些协议域包含了预先定义的值,有点类似于c语言中的枚举类型。如果你选择的协议域包含这样的值,你可以在这个列表中选择。

如果你熟悉了这个规则之后你就会发现手动输入表达式更有效率。当时手动在filter文本框中输入表达时,如果输入的语法有问题,文本框的背景色会变成红色。这时候,你可以继续输入或者修改,知道文本框中的表达式正确后,文本框的背景色又会变成绿色

参考资料:

wireshark怎么抓包、wireshark抓包详细图文教程: https://blog.csdn.net/holandstone/article/details/47026213
网络抓包工具 wireshark 入门教程:https://www.cnblogs.com/52php/p/6262956.html

nginx+varnish+angular universal实现服务端页面渲染缓存

项目使用angular universal实现服务端渲染,为了减轻服务器的压力,需要将用户频繁访问的页面进行缓存,这样就不必每次都去渲染相同的页面(例如首页),angular universal在features中有提到考虑加入缓存,但就目前来说,varnish是个不错的选择,但是varnish不支持https,所以还需要用nginx进行端口的转发

总的思路

  1. nginx监听80端口将http重定向到https
  2. nginx监听443端口,并将443端口的请求转发到8080端口
  3. varnish监听8080端口的请求,如果与缓存中的页面匹配,则返回页面,如果没有匹配的页面,则请求pm2启动的服务

总的流程

  1. 安装与配置nginx
  2. 安装SSL证书,nginx配置SSL
  3. 安装与启动PM2
  4. 安装与配置varnish

Nginx的安装与配置

1、安装nginx

yum install nginx

2、配置nginx以安装SSL证书 ( 使用varnish时,不需要nginx监听80端口,nginx监听443端口然后转发到80端口即可 )

//找到nginx配置文件所在目录
Linux code: nginx -t

//打开nginx.conf文件配置一个server
server {
    listen       80;  //监听的端口
    server_name  yourdiamond.com; //域名
    root         /usr/local/web/Panoramic; //文件路径
    location / {
        index  index.html; //主页
    }
}

//检查配置是否有误
Linux code: nginx -t

3、开启gzip

//在config文件中加入以下代码
gzip on;
gzip_min_length 1k;
gzip_buffers 4 16k;
gzip_comp_level 5;
gzip_types text/plain application/x-javascript text/css application/xml text/javascript application/x-httpd-php;

4、启动nginx

service nginx start/restart/reload(修改配置后无需重启,reload即可)/stop

Certbot证书配置

1、下载certbot

//安装git
yum install git

git clone https://github.com/certbot/certbot
cd certbot

2、安装证书

./certbot-auto certonly --webroot --agree-tos -v -t --email 邮箱地址 -w 网站根目录 -d 网站域名

//安装成功后会看到这样的信息,在配置nginx时会用上
Congratulations! Your certificate and chain have been saved at:
   /etc/******/fullchain.pem
   Your key file has been saved at:
   /etc/******/privkey.pem
   Your cert will expire on 2018-06-28. To obtain a new or tweaked
   version of this certificate in the future, simply run certbot-auto
   again. To non-interactively renew *all* of your certificates, run
   "certbot-auto renew"

3、证书的有效期为3个月,需要更新证书

./certbot-auto renew

Nginx配置SSL

1、在nginx.conf文件中,新加一个server,将443端口转发到8080端口

server {
    listen 443 ssl;
    server_name yourdiamond.com;
    //将ssl证书生成后的pem路径复制到ssl_certificate、ssl_certificate_key
    ssl_certificate /etc/******/fullchain.pem;
    ssl_certificate_key /etc/******/privkey.pem;
    location / {
        proxy_pass http://127.0.0.1:8080;
        proxy_set_header X-Real-IP  $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto https;
        proxy_set_header X-Forwarded-Port 443;
        proxy_set_header Host $host;
    }
}

PM2

1、安装pm2

npm install pm2 -g

2、启动pm2

//启动参数
--watch 监视项目,如有更改自动重启
-n 为项目命名

pm2 start /usr/local/web/PCbeta/server.js --watch -n PC_SSR_beta

3、pm2命令

pm2 list  //列出所有应用
pm2 stop all  //停止所有应用
pm2 stop name|app_id  //停止指定的应用
pm2 restart name|app_id  //重启指定的应用
pm2 logs  //查看日志

4、对于angular universal应用,需要将生成的dist目录、dist-server目录、server.js一并复制到项目文件夹中

Varnish

1、修改varnish配置

//找到varnish所在目录
Linux code: whereis varnish

//打开 varnish.params,修改varnish监听的端口为8080,接收该端口的http请求
VARNISH_LISTEN_PORT=8080

//打开 default.vcl
//修改指向服务器的地址和端口(pm2运行的端口)
backend pc {
    .host = "127.0.0.1"; //指向本地服务器
    .port = "4000";  //监听4000端口运行的程序
}

//可同时存在多个backend,实现多域名同时使用varnish缓存
backend pcbeta {
    .host = "127.0.0.1"; 
    .port = "4001";  
}
//对不需要使用cookie的页面屏蔽cookie检查,提高命中率,cookie不同varnish会认为是不同的页面,这里只对包含home路径的页面进行检查

sub vcl_recv{
    if (!(req.url ~ "^/home/")) {
        unset req.http.Cookie;
    }
}

2、varnish命令,中文文档https://jefferywang.gitbooks.io/varnish_4_1_doc_zh/content/

//启动
service varnish start

//停止
service varnish stop

//查看统计日志

varnishtop:读取共享内存中的日志,同时会显示一个不断更新的列表

varnishhist:读取varnishd共享内存日志,同时生成一个连续不断更新的柱状图显示最后 N 个请求的分布。

N的值和垂直比例尺显示在左上角的位置。水平刻度是对数的,命中标记是“|”,未命中标记是“#”。

varnishstat:统计未命中、命中、存储信息、线程创建、删除对象等