标签归档:wordpress

wordpress登录后站点出现 502错误

最近发现,wordpress 4.7 在登录后,如果再次访问自己站点会直接出现502错误,但是如果非登录状态,则访问都是正常的。这个现象非常奇怪。无论如何,先登录服务器看日志:

tail -f /var/log/nginx/error.log

然后在登录状态下访问我的网站,发现有如下日志,

2016/12/21 14:59:57 [error] 8551#0: *26 upstream sent too big header while reading response header from upstream, client: **.*.*.*, server: idocbox.com, request: "GET / HTTP/1.1", upstream: "fastcgi://unix:/var/run/php5-fpm.sock:", host: "idocbox.com", referrer: "http://idocbox.com/wp-admin/plugins.php?plugin_status=all&paged=1&s"

看来是头信息过大导致超时了,所以出现了502错误。一番简单搜索,得到如下解决方案:

sudo vi /etc/nginx/sites-enabled/idocbox.com

在里面增加

                fastcgi_buffer_size 128k;
                fastcgi_buffers 32 32k;

修改后配置片段,

location ~ \.php$ {
                fastcgi_buffer_size 128k;
                fastcgi_buffers 32 32k;
                fastcgi_split_path_info ^(.+\.php)(/.+)$;
        #       # NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini
        #
        #       # With php5-cgi alone:
        #       fastcgi_pass 127.0.0.1:9000;
        #       # With php5-fpm:
                fastcgi_pass unix:/var/run/php5-fpm.sock;
                fastcgi_index index.php;

        include fastcgi_params;
        }

然后重启nginx,

sudo service nginx restart

验证:再次在登录状态下访问网站,网站正常了,日志里面也没有了那个“upstream sent too big” 错误。

wordpress xmlrpc攻击解决

今天,我想打开本博客,居然发现我的博客报:

504 Gateway Time-out

这是为何呢?难道我的服务器所在位置的网络有问题?dns解析不正常?还是程序运行太慢? 赶快登录ec2后台,将服务器重启,10秒左右不到,我重新访问我的博客,访问正常,然后仅仅过了不到一分钟,我的博客再次出现错误:

504 Gateway Time-out

看来有有外部力量在破坏我的博客服务器。赶快登录服务器后台,查看下cpu
top
后台发现有好几个php5-fpm进程在执行,cpu使用率在20%~30%波动,我的博客访问量很小,不应该有这么多php5-fpm进程的,博客内容做了缓存,更不应该出现这么高的使用率。
继续查看nginx访问日志,

tail -f /var/log/nginx/access.log

发现如下持续频繁的访问:

攻击日志

从日志看,攻击者ip 为185.130.5.209, 因为访问频繁而导致499,也有502网关错误,这个499可以理解,而502属于攻击者频繁访问,导致php处理速度变慢引起。

先屏蔽这个ip,阻止它继续攻击,

sudo iptables -A INPUT -s 185.130.5.209 -j DROP

继续观察日志,

tail -f /var/log/nginx/access.log

发现攻击ip发生变化,

攻击日志

看来攻击程序会变更自己的ip来伪装自己,那干脆直接屏蔽整个ip段:

sudo iptables -A INPUT -s 185.130.5.0/16 -j DROP

继续观察日志发现,攻击停止,博客访问恢复。
说明这样可以暂时拦截攻击,那保存刚才的iptables配置,

sudo iptables-save

这样就可以避免下次服务器重启而导致配置丢失。

我们接着分析下这个攻击。攻击者请求wordpress的xmlrpc.php,

185.130.5.195 - - [06/Feb/2016:13:56:20 +0000] "POST /xmlrpc.php HTTP/1.0" 499 0 "-" "Mozilla/4.0 (compatible: MSIE 7.0; Windows NT 6.0)"

xmlrpc是wordpress提供的apic,允许开发客户端来进行发布、更新等操作,而攻击者进行持续试探一般也是为了通过暴力方式获取博客密码,然后进行各种非法操作。所以,如果没有使用xmlrpc,可以通过disable xmlrpc插件将这个功能禁用,但如果用了,则就要给服务器配置一套防火墙来避免大流量攻击。配置防火墙属于非常专业的工作,需要进行深入研究进行。但对于ec2和阿里云这样的服务器来说,可以直接购买对应服务即可。

以下攻击的数据,从图中可以看到,攻击者一直在持续进行攻击试探,最后在我屏蔽ip后各项数据直线降了下来。

进入服务器的流量
输出的网络流量
cpu占有率

环境信息:ubuntu, nginx, wordpress.

以上

在Amazon EC2搭建WordPress博客

亚马逊(Amazon) ec2 是一个不错的服务,最重要的是,它向大家提供一年免费使用的服务。我这个博客原来是在php空间放的,现在也搬到了ec2上面。主要出于这几点考虑:

1.国内的空间服务商没有很好的服务。像这次,我的服务器到了,我不想续费了,也忘记了提前备份程序和数据库,由于它们在帐号到期后停用了我对后台ftpphpmyadmin等权限,导致我无法备份。然而,幸亏我是每天借助wordpress插件备份数据库才不至于丢失数据。

2.备案问题。原来是备过案的,不知为什么,前段时间提醒备案,但我看了下,非常麻烦。耗不起,那我躲吧。

3.自己完全借助ec2搭建,掌握更多的自主权。数据库、服务器配置等等。附加的,我们拥有一台有公网ip的服务器,可以做各种必须在公网才能进行的开发任务。

4.还有一点,网速很快的。

好了,好处说了不少,现在说说怎么搭建吧。


注册&申请

1. 进入 http://aws.amazon.com/free , 点击 右侧的 “Sign Up Now ” 按钮, 然后用你的amazon.com 帐号登录。

2.登录后填写你的信用卡信息,另外就是你的地址信息要填写准确,后面电话确认时会询问。这里要求是支持外币的。建议大家用master或者visa就可以。

3.填写电话信息:

1)选择China

2)填写手机号码,无需+86

3)点击 “Call Me Now”

点击后,此页面转到第二步,显示四位PIN 验证码。同时会接收到亚马逊美女电话验证,输入您浏览器页面中的PIN码,如果你不懂英文,等美女说完话后就输入,页面会马上显示信息验证完成。

4.验证通过后,会显示“Continue” 按钮,点击即可。

做完这一步,究进入激活过程。有时很快,几分钟,有时可能慢。像我,做完后等待了大概十几分钟后,我接到了一个来自印度的电话。对方用英语向我确认我的信用卡全名,信用卡注册人地址,以及我的vps用途(商用还是个人 business or personal use), 回答完毕之后,对方会根据你的信息來确认是否通过审核。

 注意:2010年11月之后注册的帐号才能享受免费一年的服务!是否可以享受,可以从 https://portal.aws.amazon.com/gp/aws/developer/account/index.html?ie=UTF8&action=activity-summary& 看到


创建ec2实例

当以上审核通过后,那么恭喜你!你现在可以來创建ec2实例了。

1.进入 https://console.aws.amazon.com/ec2/home , 你会看到 一个按钮 “Launch Instance”, 点击它,进入实例选择页面。

2.选择 “Quick Launch Wizard”, 选择里面有 “Free tier eligible” 字样的linux版本, 根据你自己喜好可选不同的linux发行版本。我选择了 “Ubuntu Server 12.04 LTS” 版本。先不要点击“Continue”, 继续做下面两个工作。

1)    在页面的 “Name Your Instance:” 位置填写一个实例名,比如我叫“idocbox.com”。

2)      创建 一个key, 后面ssh登录要用到这个文件。在 “Choose a Key Pair:” 下面,选择 “Create New” 标签,给key一个名字,比如我就叫“idocboxcom”, 然后点击后面的 “Download”按钮下载

它到本地。注意:此文件是你登录服务器的认证文件,不可泄!

做完以上工作之后,点击“Continue“按钮,然后进入信息确认页面,如果确认无误,点击”Launch”按钮 。这样等一会儿就有了一个实例。

3. 在左侧导航栏,点击“Instance” 链接,你就会看到你创建的实例了。选中右侧创建的实例,会在最下面显示相关信息。关注Public DNS, 它可以用來通过ssh來登录服务器。还有 Security Groups一项内容,它控制着服务器的对外端口和服务。记下,Security Groups内容,我们接下来來设置安全策略。

4.设置安全策略。在左侧导航栏,点击“Security Groups” 链接,在右侧选中上面记下來的Security Groups值。这时在下面选择“Inbound”标签栏,你会看到旁边有ssh端口。由于我们要搭建wordpress,需要开放http端口。在 “Create a new rule:” 的下拉框中选择 “http”,点击“Add Rule”, 同样的选择”https”,然后点击“Apply Rule Changes” 按钮。即可。

5.接下来连接你的linux实例。 点击左侧的Instances 链接,选择你的实例,点开上面的Instance Actions,点击 ”Connect”, 这时会显示两种连接方式。我们选择“Connect with a standalone SSH Client”, 里面会显示一段连接的ssh命令,类似这样,

ssh -i xxxx.pem root@ec2-xx-xx-xx-xx.compute-1.amazonaws.com

我们就假设你在linux1下面吧(如果用putty, 你可以看看Connect from a Windows client using PuTTY).

进入你的前面下载的key文件保存目录,执行 ssh -i xxxx.pem root@ec2-xx-xx-xx-xx.compute-1.amazonaws.com 像我用的是ubuntu实例,这个命令是不能登录的,改成这个

ssh -i xxxx.pem ubuntu@ec2-xx-xx-xx-xx.compute-1.amazonaws.com就可以了。

好了,至此,我们就可以來配置我们服务器了。


配置一台wordpress服务器:安装相关软件

接下来,我们来看看怎么配置一台wordpress服务器

1.先用ssh登录服务器。

2.执行:

sudo apt-get update

sudo apt-get upgrade

对系统进行升级。注意,这一步要做,我开始没有做,后面安装一些软件会报错的。

3.安装LAMP相关软件

sudo apt-get install apache2 php5-mysql libapache2-mod-php5 mysql-server php5

顺利的话,这一句命令能搞定的。安装过程中会提示你设置mysql root 的密码,设置过程中一定要记住自己设置的密码是什么。

4.安装curl, 我们用它來测试搭建的网站是否正常。

sudo apt-get install curl libcurl3 libcurl3-dev php5-curl php5-imap php5-xmlrpc

5.安装phpmyadmin

sudo apt-get install phpmyadmin

它默认会安装到 /usr/share/phpmyadmin下面,中间会提示你输入mysql的root密码.

6. 启用mod_rewrite模块

sudo a2enmod rewrite

为了我们后面能够在wordpress中使用WP Super Cache插件來加速网站性能,我们同时启用mode_headers和mode_expires两个插件,

sudo a2enmod headers

sudo a2enmod expire

7.配置php.ini

sudo vi /etc/php5/apache2/php.ini

修改以下选项:

date.timezone= PRC

enable_dl = On

display_errors = On

upload_max_filesize = 2M

在 disable_functions选项中增加要禁用的函数,

shell_exec, system, exec, passthru, show_source, proc_open, proc_close, dl

8.重启apache2

sudo /etc/init.d/apache2 restart

9.验证服务是否正常

先在ec2实例的命令行执行

curl http://localhost/

如果能看到html内容打印,有”It works!” 字样,说明服务已经启动成功了。

然后在我们本地电脑浏览器上输入 http://<你的pulic-dnc>, 像这个 http://ec2-xx-xx-xx-xx.compute-1.amazonaws.com, 如果看到 “It works!”, 说明网站已经可以对外访问了。


配置一台wordpress服务器:搭建wordpress

接下来,我们搭建wordpress

1.ssh登录到ec2实例,在自己的目录下执行

mkdir blog-related

cd blog-related

进入 http://cn.wordpress.org/, 选择你要安装的wordpress版本的文件链接,比如我要安装 的是 http://cn.wordpress.org/wordpress-3.3.2-zh_CN.tar.gz, 然后执行

wget http://cn.wordpress.org/wordpress-3.3.2-zh_CN.tar.gz

來下载它到服务器上.

解压,

sudo tar  zxvf wordpress-3.3.2-zh_CN.tar.gz

将它部署到apache的网页目录,默认是/var/www

mv wordpress /var/www/

2.创建wordpress数据库和用户

假设我们的数据库名字就叫 idocbox, 在命令行执行

mysql -u root -p

提示你输入密码时,输入上面安装过程设置的mysql root密码即可,然后执行,

create database idocbox DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;

这样就创建了一个utf8编码的数据库,

接着创建wordpress的mysql用户,

GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP ON idocbox.* TO <your-wordpress-user-name>@localhost IDENTIFIED BY ‘<your-wordpress-mysql-passwords>’;

FLUSH PRIVILEGES;

3.下面,我们來开始安装wordpress吧!

1)在你的浏览器上 输入

http://ec2-xx-xx-xx-xx.compute-1.amazonaws.com/wordpress

这时会进入安装页面,在页面设置一些站点基本信息,管理员用户密码,然后继续,进入数据库设置页面

2).填写上面创建的数据库名称(idocbox), 创建给wordpress的数据库用户名、密码。然后点击

下一步,

这时会报一个权限问题“不能写入wp-config.php文件”。 这个是因为运行apache2的用户和我们当前在命令行部署wordpress的用户不是同一个而引起的权限问题。没关系,安装它说的,我们在命令行创建这个文件,把内容复制进去即可。

sudo vi /var/www/wordpress/wp-config.php

复制那段内容到vi编辑器中,然后

:wq

即可。

做完上面之后,回到浏览器安装页面,点击“继续”即可,这样应该可以安装成功。

别急! 这还没有完全好。我们还要进行一些配置。

3) 配置wordpress的文件目录权限。

记得刚才哪个不能创建wp-config.php问题吧! 它就是权限问题造成的,我们进行下面配置后,在wordpress后台就可以安装插件、主题、上传文件了。

a) 在ec2命令行,

cd /var/www/wordpress

放开所有权限,便于我们识别出apache2运行的用户名。

sudo chmod  777 wp-content

b)进入你的这个博客的后台,写一篇文章,在里面上传一张图片,然后回到命令行。

cd wp-content

ll

这时你会看到一个新目录的信息

drwxr-xr-x 2 www-data www-data  4096 Jul  8 03:24 upgrade

这个目录就是刚才创建的,说明wp执行用的用户是 www-data, 当然,你看到的不一定是这个,看到是什么就是什么。

接下来,我们要恢复wordpress目录权限到正常情况,

cd ..

      sudo chmod 755 wp-content

修改wordpress所有者为wordpress 运行所用的用户,www-data

sudo   chown -R www-data: wordpress

这时进入wordpress后台,就可以安装插件、主题了。

好了,到此wordpress的安装就结束了。


域名绑定

我们的博客总不能让别人通过 http://ec2-xx-xx-xx-xx.compute-1.amazonaws.com/wordpress 來访问吧!

是的,当然不能这样干! 我们有自己的独立域名的。那接下来,我们就说说怎么把域名和ec2上这个wordpress博客绑定到一起去。

这里假设你拥有一个独立域名,我就以我自己的域名 idocbox.com來进行说明。

1.在ec2的命令行,

a)进入apache的站点设置目录

cd   /etc/apache2/sites-available

b)在这个目录你会看到两个文件  default 和 default-ssl, 我们复制default 为idocbox.com,

sudo cp default idocbox.com

对idocbox.com进行编辑修改

sudo vi idocbox.com

将内容修改为以下,黑体部分是要修改的,

<VirtualHost *:80>

#你的电子邮件

ServerAdmin xxxxx@xxxx.com

#wordpress放置目录

DocumentRoot /var/www/wordpress

#映射到这个目录的域名

ServerName idocbox.com

<Directory />

Options FollowSymLinks

AllowOverride All

</Directory>

#wordpress放置目录

<Directory /var/www/wordpress>

Options Indexes FollowSymLinks MultiViews

AllowOverride All

Order allow,deny

allow from all

</Directory>

ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/

<Directory “/usr/lib/cgi-bin”>

AllowOverride None

Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch

Order allow,deny

Allow from all

</Directory>

#日志

ErrorLog ${APACHE_LOG_DIR}/idocbox.com-error.log

# Possible values include: debug, info, notice, warn, error, crit,

# alert, emerg.

LogLevel warn

#日志

CustomLog ${APACHE_LOG_DIR}/idocbox.com-access.log combined

Alias /doc/ “/usr/share/doc/”

<Directory “/usr/share/doc/”>

Options Indexes MultiViews FollowSymLinks

AllowOverride None

Order deny,allow

Deny from all

Allow from 127.0.0.0/255.0.0.0 ::1/128

</Directory>

</VirtualHost>

接下来,我们复制一份上面的文件

cp idocbox.com www.idocbox.com

将www.idocbox.com里面的 ServerName修改为www.idocbox.com

这也做是为了在域名面板里面配置idocbox.com和www.idocbox.com的A记录后可以用idocbox.com和www.idocbox.com都可以访问网站。

然后执行

sudo a2ensite idocbox.com

sudo a2ensite www.idocbox.com

将两个站点启用。

然后重启apache服务器,

sudo /etc/init.d/apache2 restart

好了,服务器配置就完成了。接下来你要做的的是,

申请一个固定ip给你的ec2实例

1.进入 https://console.aws.amazon.com/ec2/home, 点击左侧的 “Elastic IPs”, 点击右侧栏的上部一个按钮”Allocate New Address”.

这样会分配一个固定ip给你。

2.绑定ip给你的实例。选择你申请的ip,点击上部的 “Associate Address” 按钮,这时会让你选择实例,选择我们这个安装wordpress的实例即可。

这时,我们的ec2实例会进行配置、重启,所以一段时间内这个服务器会连接不上。等一会儿吧!

等待…

大概5分钟后,应该是吧! 继续在实例面板 https://console.aws.amazon.com/ec2/home 的instance里面,选择你的实例,你会发现它的Public DNS是另一个,下次ssh登录要用这个的。还有就是Elastic IP显示了你刚才申请的ip。

好了,下面用用这个ip先访问你的服务器试试, 假设是ip是 xx.xxx.xx.xx,  用http://xx.xxx.xx.xx访问下,看看有没有“

It works!

字样,有的话说明ip可用了。

3. ip可用后,登录你的域名控制面板,在A记录里面将idocbox.com和www.idocbox.com指向这个ip 恩,好了试试用域名访问吧!


另外,记得执行

sudo cp -r /usr/share/phpmyadmin /var/www/

将phpmyadmin部署到www目录下,这样就可以通过 http://xx.xxx.xx.xx/phpmyadmin來使用phpmyadmin管理数据库了。

注意:这里我们虽然配置好了wordpress,也可以访问了,但是,为了让你的网站性能好些,还需要对wordpress进行一些后续优化。主要优化点是:

1)spam的防止

这里推荐安装 Akismet 和 Verification Code for Comments

前者是一个根据内容來判断是否spam的服务插件,非常智能。后者是评论时要求输入验证码的插件,可以阻止一些程序來发垃圾评论。

2) WP Super Cache

这个安装后,启用,配置下,缓存页面为静态文件,这样就能避免去查询数据库,提高响应速度,降低服务器压力。效果是非常明显的。

3) WordPress Database Backup

数据库备份插件。非常好用,避免系统出现问题时数据丢失。

这三个插件我没次都是必装。还有一些很优秀的插件,根据自己需要选择安装。


补充说明:

mysql挂掉的问题
系统配置好之后,常常出现mysql挂掉的情况。一直找不到原因,后来发现是因为apache 或者mysql 占用内存超过了虚拟机分配的内存导致 linux结束了mysql的进程导致的。具体可以从

less /var/log/kern.log

中找到下面这段内容:

Oct 6 10:43:25 ** kernel: [26897370.048751] Out of memory: Kill process 8384 (mysqld) score 80 or sacrifice child
Oct 6 10:43:25 ** kernel: [26897370.048778] Killed process 8384 (mysqld) total-vm:889292kB, anon-rss:48456kB, file-rss:0kB
Oct 6 10:43:25 ** kernel: [26897370.126735] init: mysql main process (8384) killed by KILL signal
Oct 6 10:43:25 ** kernel: [26897370.133818] init: mysql main process ended, respawning
Oct 6 10:43:25 ** kernel: [26897370.625165] type=1400 audit(1381056205.953:256): apparmor=”STATUS” operation=”profile_replace” name=”/usr/sbin/mysqld” pid=17504 comm=”apparmor_parser”
Oct 6 10:43:26 ** kernel: [26897370.908396] apache2 invoked oom-killer: gfp_mask=0x201da, order=0, oom_adj=0, oom_score_adj=0
Oct 6 10:43:26 ** kernel: [26897370.908411] apache2 cpuset=/ mems_allowed=0
Oct 6 10:43:26 ** kernel: [26897370.908415] Pid: 17476, comm: apache2 Not tainted 3.2.0-25-virtual #40-Ubuntu

解决办法:

修改apache的资源占用,减少内存使用量。

sudo vi /etc/apache2/apache2.conf

减小下面的值,如我配置为:

# prefork MPM
# StartServers: number of server processes to start
# MinSpareServers: minimum number of server processes which are kept spare
# MaxSpareServers: maximum number of server processes which are kept spare
# MaxClients: maximum number of server processes allowed to start
# MaxRequestsPerChild: maximum number of requests a server process serves

    StartServers          1
    MinSpareServers       1
    MaxSpareServers       5
    MaxClients            20
    MaxRequestsPerChild   1000

# worker MPM
# StartServers: initial number of server processes to start
# MinSpareThreads: minimum number of worker threads which are kept spare
# MaxSpareThreads: maximum number of worker threads which are kept spare
# ThreadLimit: ThreadsPerChild can be changed to this maximum value during a
#              graceful restart. ThreadLimit can only be changed by stopping
#              and starting Apache.
# ThreadsPerChild: constant number of worker threads in each server process
# MaxClients: maximum number of simultaneous client connections
# MaxRequestsPerChild: maximum number of requests a server process serves

    StartServers          1
    MinSpareThreads       5
    MaxSpareThreads       20 
    ThreadLimit           64
    ThreadsPerChild       15
    MaxClients            20
    MaxRequestsPerChild   1000

# event MPM
# StartServers: initial number of server processes to start
# MinSpareThreads: minimum number of worker threads which are kept spare
# MaxSpareThreads: maximum number of worker threads which are kept spare
# ThreadsPerChild: constant number of worker threads in each server process
# MaxClients: maximum number of simultaneous client connections
# MaxRequestsPerChild: maximum number of requests a server process serves

    StartServers          1
    MinSpareThreads      10
    MaxSpareThreads      20 
    ThreadLimit          64
    ThreadsPerChild      15
    MaxClients           20
    MaxRequestsPerChild  1000

配置完毕后,重启apache2即可。或者干脆重启服务器。
参考资料:

http://docs.amazonwebservices.com/AWSEC2/latest/GettingStartedGuide/Welcome.html?r=1874

http://lanhl.com/2011-amazon-ec2-ubuntu-lamp-wordpress.html

http://www.piaoyi.org/php/Wordpress-To-perform-the-requested-action.htm