【原创】AWS搭建免费网站攻略

介绍如何使用AWS EC2 云主机搭建LAMP网站:

  • 注册AWS帐号,建立并启动免费Linux云主机
  • 在Linux云主机上构建LAMP服务器
  • 配置Apache服务器,配置多域名多网站
  • 配置DNS,让网站可用
  • 主机与空间

    空间最终选择了AWS的EC2,大概作为一个读书爱好者,对Kindle的喜爱也移情到了对AWS的喜爱吧。自己觉得EC2还是很赞的说,非常稳定、速度也不错。关键这个不是那种所谓的Host/空间(那些就是个配置好的web文件夹),是真正的云端的主机(你拥有的是一个在完全属于你控制的、云端的、完整的操作系统)。过去甚至现在,广大站长们大都使用各种虚拟主机来存放自己的网站,云主机有什么不一样?不一样的核心要点是,虚拟主机给你的是他控制的操作系统下的Apache服务器的一个文件夹或几个文件夹,限制很多,比如只能有5个域名绑定之类的,而AWS云主机给你的是一个操作系统,你是ROOT,你想干什么都可以,你可以开N个虚拟主机,你可以直接配置Apache的httpd.conf文件。

    Amazon是全球最大电子商务公司,同时也是全球最大的云计算公司,其云服务AWS是业界翘楚,Amazon的云计算体系中最重要的基础服务产品为EC2(Elastic Compute Cloud),很多人也直接把EC2称做弹性云主机,确实如此,在使用EC2的时候,你相当于拥有了一个计算能力可弹性部署、收费(个人网站完全可以使用其免费服务)按照使用量弹性计算的主机实例(instance)这个实例就好比一个你自己的Linux或Windows服务器,你可以在这个instance上安装LAMP服务器,进而安装你自己的网站,AWS有详细的中文英文的文件指引,绝大多数设置就按着文件来就好,我通过Window本地机与AWS云机相连,最后搭建成功,具体步骤记录如下,也会特别把AWS文档中没有提到的技巧分享在这里。

    EC2的启动、设置与使用

    步骤一:注册AWS帐号

    使用浏览器访问http://aws.amazon.com注册AWS帐号,过程中,需要信用卡,并会从卡中扣取1美金,同时需要提供真实的电话号码,并会有语音电话打到你提供的电话号码上,要求您通过电话输入屏幕上的一个4位数字PIN码确保您至少是一个有真实电话,真实信用卡的用户。注册完成后就已经进入AWS管理台页面了,以下到步骤五均通过AWS管理台执行。

    步骤二:设置IAM用户[私人维护的小站完全可以不设置]

    在AWS帐号下进一步设置IAM(Identity and Access Management)用户组,并在该IAM组下再设置一个或多个用户来访问AWS资源。

    步骤三:准备密钥对

    使用AWS的EC2实例时,需由 PPK密钥对访问,基本逻辑是将公钥文件放在AWS云端,然后使用本地私钥文件来访问EC2,准备蜜钥对的方法有2种:

    步骤四:设置安全组

    更通俗的说,就是为EC2的实例创建防火墙,控制进出实例的数据交换,比如,为了确保只有你能从你的IP上使用SSH访问EC2。防火墙可以通过console页面设置。我设立的安全政策将允许任何IP通过http/https访问EC2,但只有我自己的IP能通过SSH访问EC2,这样就保证后台只有我能访问。注意安全组是需要指明Region的,如果你的EC2实例是AP的,那么你的安全策略也应该是AP的。我刚开始使用的时候是在办公室设置的IP,回家发现SCP不工作了,好容易才想起来是IP的问题。。

    步骤五:启动实例/Launch instance

    所谓启动instance就是启动一个Linux服务器的instance, 按照wizard来就好了。一要注意选择合适的区域启动实例,我选择在亚太新加坡的机房启动我的实例,二要选择合理的配置,我选择的操作系统是Amazon Linux HVM实例。过程中需要设置该实例的安全组、密钥,启动成功后,在AWS控制台的“Dash board”上就可以看见这个实例的记录了,比如实例的状态、安全组、区域、Public DNS,其中,Public DNS的值很重要,我们连接EC2需要靠这个。这个值大概长这么个样子:ec2-address.ap-southeast-1.compute.amazonaws.com

    步骤六:连接实例/connect instance

    上面的步骤所有步骤都是通过浏览器完成的,完成后,我们相当于在新加坡有一个Linux服务器了。现在我们要做的事情就是从自己的Window PC机访问这台新加坡的Linux服务器,现在我们该使用PuTTY.exe来访问我们的服务器了。PuTTY 是windows下的SSH客户端应用,使用PuTTY.exe的时候,首先会是一个windows的UI, 在这个UI里面我们要填写HOST为ec2-user@ec2-address.ap-southeast-1.compute.amazonaws.com,同时确保SSH连接里面的授权使用了我们的私有密钥文件.ppk...按动open按钮后进入Linux的命令行界面: [ec2-user@ip-address~]$

    使用Putty要注意两点,否则Putty连不上主机,会time out报错

  • 1、在AWS安全组的策略里面,要确保SSH的设置是正确的,也就是说您所允许的IP可以通过SSH访问主机实例
  • 2、检查您客户端的安全软件的策略,这点很重要,比如我用的是赛门铁克的防火墙,一定要保证SSH/Putty软件可以访问外网
  • 步骤七:搭建并配置AMP(Apache+MySQL+PHP)服务器

    通过以下步骤,您将AMP服务器安装到您Linux服务器上以便部署LAMP网站。

  • 0、更新Linux实例到最新安全更新和缺陷修复:

    [ec2-user@ip-address~]$ sudo yum update -y

  • 1、开始安装LAMP软件包:

    [ec2-user@ip-address~]$ sudo yum groupinstall -y "Web Server" "MySQL Database" "PHP Support"

  • 1.5、有时,在第4项发现httpd无法启动,则可以用1.5的方法来重装这些软件,方法是:

    [ec2-user@ip-address~]$ sudo yum install gcc gcc-c++ make

    [ec2-user@ip-address~]$ sudo yum install apache mysql php php-mysql mysql-server

  • 2、安装 php-mysql 软件包:

    [ec2-user@ip-address~]$ sudo yum install -y php-mysql

  • 3、安装 php-mbstring软件包:

    [ec2-user@ip-address~]$ sudo yum install php-mbstring

  • 4、启动 Apache 服务器:

    [ec2-user@ip-address~]$ sudo service httpd start
    Starting httpd: [ OK ]

  • 5、配置 Apache 服务器在每次OS系统启动时启动。

    [ec2-user@ip-address~]$ sudo chkconfig httpd on

  • 6、验证 httpd 已启动:

    [ec2-user@ip-address~]$ chkconfig --list httpd
    httpd 0:off 1:off 2:on 3:on 4:on 5:on 6:off

  • 7、验证 httpd 运行正常:

    [ec2-user@ip-address~]$ sudo service httpd status
    httpd (pid 7111) is running...

  • 8、进一步使用浏览器验证:输入http://public.dns.amazonaws.com/,应返回apache测试页面(此时/var/www/html是空目录)。。Apache安装成功
  • 9、设置Apache根目录/var/www/html权限,将所有者由缺省的root变成ec2-user:先创建一个叫做www的用户组,将ec2-user加入到www组,将/var/www的权限授予www组,属于www组的成员ec2-user就可以增删改/var/www的文件或文件夹了。命令如下
    • 9-1、创建www 组到您的实例。

      [ec2-user ~]$ sudo groupadd www

    • 9-2、将ec2-user)添加到 www:

      [ec2-user ~]$ sudo usermod -a -G www ec2-user

    • 9-3、先退出,再重新登录,以接受新组www:

      [ec2-user ~]$ exit

    • 9-4、验证您是否为 www 组的成员。可以发现,ec2-user已经属于www组:

      [ec2-user ~]$ groups
      ec2-user wheel www

    • 9-5、将 /var/www 及其内容的组所有权更改到 www 组:

      [ec2-user ~]$ sudo chown -R root:www /var/www

    • 9-6、更改 /var/www 及其子目录的目录读取与写入权限:

      [ec2-user ~]$ sudo chmod 2775 /var/www
      [ec2-user ~]$ find /var/www -type d -exec sudo chmod 2775 {} +
      [ec2-user ~]$ find /var/www -type f -exec sudo chmod 0664 {} +

  • 10、启动并设置MySQL服务器的安全,MySQL 服务器的默认安装提供多种有助于测试和开发的功能,对于生产服务器,应禁用或删除这些功能。mysql_secure_installation 命令可引导您设置根密码并删除安装中的不安全功能。即使您不打算使用 MySQL 服务器,执行此步骤亦有必要。
    • 10-1、初始化MySQL服务器,以便可以运行 mysql_secure_installation。

      [ec2-user ~]$ sudo service mysqld start
      Initializing MySQL database: Installing MySQL system tables...
      OK
      Filling help tables...
      OK
      To start mysqld at boot time you have to copy
      support-files/mysql.server to the right place for your system
      PLEASE REMEMBER TO SET A PASSWORD FOR THE MySQL root USER !
      ...
      Starting mysqld: [ OK ]

    • 10-2、运行 mysql_secure_installation。

      [ec2-user ~]$ sudo mysql_secure_installation
      系统提示输入 root 账户的密码,默认情况下,root 账户没有设置密码,因此请按 Enter。
      键入 Y 设置密码,然后输入安全密码两次。
      键入 Y 删除匿名用户账户,系统中将只有root了。
      键入 Y 禁用远程 root 登录。
      键入 Y 删除测试数据库。
      键入 Y 重新加载权限表并保存您的更改。

    • 10-3、(可选)停止MySQL 服务器。

      [ec2-user ~]$ sudo service mysqld stop

    • 10-4、(可选)配置 Apache 服务器在每次OS系统启动时启动:

      [ec2-user ~]$ sudo chkconfig mysqld on

  • 步骤八(可选):配置MySQL数据库到可以远程做Admin工作

    经过上述的步骤,MySQL应该已经可用。可在Linux的shell下使用以下的命令检测mysql服务器的状态:

    [ec2-user ~]$ sudo service mysqld status
    mysqld (pid 21715) is running...

    目前这个mySQL服务器只有一个root用户,且没有我们可以使用的数据库,,且root只能使用本机/终端机(由于安全的原因在上述10.2步骤中禁用了root的远程登录)登录并使用终端上的MySQL命令行操作服务器。

    这里有三个问题,一个是我们不能总是使用root来操作服务器,另外我们也需要一个单独干净的数据库,同时人们也常常希望能使用GUI工具来操作这个数据库服务器,比如我就很希望使用我的 Window上面的Navicat来操作我的云端数据库,

    现在我要做几件事情来达到这个目的。首先我先以mysql root的身份与密码进入MySQL,请注意提示符号变成mysql>,这表明已经进入了mysql服务器,那么现在我们与之交互的就不在是shell命令,而是MySQL的SQL语句了,注意MySQL的每条语句都应该是用“;”结尾的。

    [ec2-user@my-aws-linux /]$ mysql -u root -p

    mysql >

    然后看看有些什么数据库和用户,请注意mysql的每个语句都是SQL语句,以“ ; ” 结束来执行

    mysql> show databases;
    +--------------------+
    | Database |
    +--------------------+
    | information_schema |
    | mysql |
    | performance_schema |
    +--------------------+
    3 rows in set (0.00 sec)

    mysql> select host,user from mysql.user;
    +-----------+----------+
    | host | user |
    +-----------+----------+
    | 127.0.0.1 | root |
    | ::1 | root |
    | localhost | root |
    +-----------+----------+
    3 rows in set (0.00 sec)

    可以发现,这个时候数据库服务器里面还是很干净的,只有3个数据库和一个root用户(三条root记录,其实是一个用户,分别表示他们访问的权限,其中::1是ipv6本机地址的压缩表示罚,相当于127.0.0.1的ipv6版)

    接下来,我们将创建一个mydb的数据库,并创建一个叫做mydb_dba的用户,并予以一些设置,使这个用户将拥有mydb,并且这个mydb_dba能远程访问my_db数据库

    创建一个数据库 mydb

    mysql> CREATE DATABASE `mydb`;
    Query OK, 1 row affected (0.01 sec)

    创建一个用户 mydb_dba

    指定它的密码,以及可以从什么机器上登陆,"%"表示还可以从其他机器上登陆,“localhost”表示只能在mySQL所在机器上登陆

    mysql> CREATE USER 'mydb_dba'@'%' IDENTIFIED BY '我的密码';
    Query OK, 0 rows affected (0.00 sec)

    将mydb的所有权利授予mydb_dba

    mysql> GRANT ALL PRIVILEGES ON `mydb`.* TO "mydb_dba"@"%";
    Query OK, 0 rows affected (0.00 sec)

    经过上面的步骤,我们有了一个专门管理mydb的DBA,并且我们已经授权他能从任何机器上使用mydb

    再次使用下面两个命令。可以看到database和用户都新增了一条记录

    mysql> show databases;
    +--------------------+
    | Database |
    +--------------------+
    | information_schema |
    | mydb |
    | mysql |
    | performance_schema |
    +--------------------+
    4 rows in set (0.00 sec)

    mysql> select host,user from mysql.user;
    +-----------+----------+
    | host | user |
    +-----------+----------+
    | % | mydb_dba |
    | 127.0.0.1 | root |
    | ::1 | root |
    | localhost | root |
    +-----------+----------+
    4 rows in set (0.00 sec)

    现在使用show grants命令来检查用户mydb_dba的权限,可以发现它的usage是"%"的,而且拥有mydb的全部权限

    mysql> show grants for mydb_dba;
    +------------------------------------------------------------------------------------------------------+
    | Grants for mydb_dba@% |
    +------------------------------------------------------------------------------------------------------+
    | GRANT USAGE ON *.* TO 'mydb_dba'@'%' IDENTIFIED BY PASSWORD '*乱码B01A45478A' |
    | GRANT ALL PRIVILEGES ON `mydb`.* TO 'mydb_dba'@'%' |
    +------------------------------------------------------------------------------------------------------+
    2 rows in set (0.00 sec)

    很好,现在可以用命令mysql>exit;来回到Linux shell提示符,并重新使用mydb_dba的帐号与密码进入mysql了,搞好了!

    似乎已经可以开始尝试我们的最后一项任务了,那就是用我们window机器上的navicat来连接。。毕竟我们已经设置mydb_dba的访问权是“%”,不过我们还要做最后一个服务器端的设置,对了,就是AWS EC2的Instance的安全组还要设置一下,增加MySQL访问规则,允许使用MySQL通道远程访问,同时规定访问者IP的具体值。。这样,从远程访问的角度,就只有那个IP的电脑可以通过工具来连接mydb了。。

    很好,现在我们可以打开navicat来新增一个连接了。

    新建一个连接,在navicat连接的常规设置是:
    连接名: 自己起一个名字
    主机名或 IP 地址: 就是aws实例的public IP,比如xx.xx.xxx.xxx.
    端口: 3306
    用户名: mydb_dba
    密码: 这个用户的密码

    步骤九:使用WinSCP操作云端文件

    WinSCP是一个windows的桌面程序,可以通过它来SSH到EC2,这样可以象FTP一样管理云端文件。通常我们需要管理的云端文件,就是/var/www/html 文件夹。我们需要利用WinSCP将本地做好的网站程序或者网页发送到云端。这个工具很好用,也很简单,需要用到密钥。

    步骤十:通过httpd.conf 配置Apache服务器

  • 1、改变/etc/httpd/conf/httpd.conf的所有权与写入权给ec2-user(以下代码也不晓得是否正确,反正用了就行了,我感觉命令一是改变那个目录的owner,后面2个是在这个目录里面找,如果是目录,就2775,如果是文件就0664)

    [ec2-user ~]$ sudo chown -R root:www /etc/httpd/conf
    [ec2-user ~]$ find /etc/httpd/conf -type d -exec sudo chmod 2775 {} +
    [ec2-user ~]$ find /etc/httpd/conf -type f -exec sudo chmod 0664 {} +

  • 2、配置httpd.conf的NameVirtualHost将多个网站部署在该服务器上
  • 3、配置httpd.conf的Directory Deny来提高网站安全性,允许或拒绝对特定目录的读取。
  • 3.5以上配置的做法一般就是vi httpd.conf文件,我自己的做法是将这个文件copy到本地,编辑后,在将这个文件覆盖到WinSCP上的原始文件。这个本地文件以后就不用再改了,换AWS云主机时直接覆盖就好了。
  • 4、重起Apache服务器服务器使配置生效: [ec2-user ~]$ sudo httpd -k restart

    步骤十一:修改Linux的root密码

    [ec2-user ~]$sudo passwd root

    步骤十二:注册DNSPod.cn,使用DNSPods设置域名解析

  • 1、登录您买域名的注册商网站,进入其管理界面,配置域名的DNS服务器为dnspod的
  • 2、登录dnspod.cn,在其管理面板里配置域名指向AWS服务器地址。