标签归档:mysql

Amazon EC2 上mysql常常崩溃解决办法

一般情况下,mysql在亚马逊 AmazonEC2上崩溃的原因是内存不足导致。解决办法是增加swap分区来缓解。
解决步骤:
以管理员权限进行以下操作。ubuntu上记得在命令前面增加sudo。

腾出1G的空间来创建swap,

dd if=/dev/zero of=/swapfile bs=1M count=1024

建立分区文件,

cd /
mkswap /swapfile

如果要立刻启用swap分区,执行

mkswap /swapfile

查看swap分区,

free -m

此时应该看到类似下面的信息,

             total       used       free     shared    buffers     cached
Mem:           590        370        219          0         11         90
-/+ buffers/cache:        267        322
Swap:         1023          0       1023

为了让系统启动是就启用swap分区文件,请在 /etc/fstab 文件中添加内容,

/swapfile swap swap defaults 0 0

这样就可以解决内存不足而导致mysql崩溃的问题。

在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

MySQL中文问题

      今天花了一个晚上终于解决了MySQL中中文插入显示问题,当然少不了Google的帮忙:)把解决方法写出来以供参考。

      现象: 用JDBC将中文字段插入MySQL数据库中,然后打开表发现,那些字段都是"??".用java做出select方法进行select后也是"??".

     原因:

             1.创建数据库时没有指定默认的编码方式,导致数据库使用了MySql的默认字符集latin1。

           2.Client端字符集为latin1. 3.进行jdbc链接时使用了不匹配的字符集。

解决办法:

           1.创建数据库时将数据库的缺省字符集指定为utf8。sql: create database dbname DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;

           2.修改Client默认字符集为utf8。windows下在mysql安装目录下找到my.ini(linux下,mysql的配置一般是/etc/my.conf,其中的datadir指明了数据存储目录。),将里面的default-character-set=latin1 改为default-character-set=UTF8,然后重起mysql服务即可将数据库默认字符集改为utf8.此时应该在mysql命令行用s命令检查一下看是否改好了。

          3.修改jdbc的链接,将原来的 jdbc:mysql://localhost:3306/YourDb 改为 jdbc:mysql://localhost:3306/YourDb?useUnicode=true& characterEncoding=UTF-8 做完以上工作后,插入到mysql的中文应该不会再是乱码了.

作者:豆博草堂