亚马逊(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