梳理:我是如何开始一个服务器环境的搭建和网站的架设的

这半年我大部分时间都在和服务器打交道,虽然一直在写代码,但是和linux打交道的次数却不计其数,为了更好的连接到服务器上面,我甚至现在完全是在ubuntu下面工作,ubuntu对于我来说,目前最不好的就是没有QQ和一个PS级的图片处理软件,其他方面我可以完全抛开windows甚至比在windows下面效率高很多。话归正题,由于现在搭建服务器环境已经轻车熟路,所以打算写一篇文章,用来梳理如何快速的搭建网站服务器环境及代码部署。

购买环节

首先需要购买一台(云)服务器,一个很重要的参数是服务器的配置,对于不同的项目,服务器的配置,服务之间的搭配都很重要。我写过一篇《如何应对服务器压力?服务器横向扩展(加机器)策略详谈》用来介绍了在几台服务器搭配使用的情况下的几种架构设计,所以,搭建服务器并非那么简单,只需要在一台服务器上面完成所有工作。不同的服务器用来完成不同的功能,虽然功能不同,但是我们可以统一把它们成为“服务”,因此,架设服务器也就有套路可循,在知乎上看过一篇文章,专门讨论“套路”,套路可以帮助我们提高工作效率,降低成本。

所谓套路,就是不要管任何干扰因素,直接按照套路出牌即可,不管最终是否能成,即使中途出现问题,你也可以根据实际情况调整,但是之后你会发现,只要按套路走,每一个开始时的出发点总是对的。既然有“套路”,那么我来谈购买服务器的套路,购买服务器之前,你需要先想一下这个问题:你看我这篇文章的时候,一定是网站还没有的情况下,也就是说网站还在开发,或者刚刚开发完,还在调试环节,对于代码而言,上到服务器上后,仍然需要有一段时间的调整和适应,试问,刚刚上线的网站,能否撑爆一台服务器?既然如此,我现在给出的套路是:

购买一台内存为1G的服务器。

LNMPA环境的搭建

有了服务器(裸机),现在就是网站运行环境的搭建,我推荐使用nginx + apache的架构,有两个原因:1. 性能上OK;2. 对重写支持很赞。那么怎么搭建呢?我推荐使用lnmp.org提供的lnmp一键安装包。

LNMPA一键安装

使用lnmp一键安装包安装非常方便,甚至可以无人坚守,执行一个命令后,去看看电影,电影回来可能就已经安装好了。你不需要去lnmp.org网站上去下载,按照我下方的命令行操作即可:

yum install screen
screen -S lnmp
wget -c http://soft.vpser.net/lnmp/lnmp1.3beta-full.tar.gz && tar zxf lnmp1.3beta-full.tar.gz && cd lnmp1.3-full && ./install.sh lnmpa

注意,最后一个单词是lnmpa。执行完毕之后,就会进入安装的配置选择界面,其中mysql一定要选择5.5版本,高的版本是安装不上的,其他软件就无所谓了。这个配置过程没什么好说的,配置好之后进入自动安装吧。去喝杯咖啡,看场片,回来看看,是否已经安装成功了?如果都OK了,那么进入下一步吧。

升级软件

上面我们已经说到了,mysql只能选择5.5版本的,但是现在mysql都已经5.7版本了,所以我们要做件事——升级。你可能会问,为什么不在安装的时候直接安装最新版本呢?你可以自己试试,由于服务器内存是1G,所以高版本是安装不上的,但是问题是,我们使用lnmp一键安装包里面的升级脚本,却可以升级,所以我们要把mysql, apache, nginx, php都升级到最新版本。由于升级是一样的,所以下面我用升级php做演示:

./upgrade phpa

执行后,会进入升级的界面,它会提示你一个网址,进入这个网址,找到php的最新版本,把版本号(7.0.3)拷贝过来,输入,回车,然后开始升级,直到升级过程自动完成。

你可能会问,为什么是phpa呢?因为我们使用的是lnmpa环境,为了区分lnmp环境(php的调用运行方式不同),所以升级的时候要使用phpa作为升级php的标识。升级其他软件其实是一样的,mysql升级的时候,要求你输入root用户的密码,其他的升级过程几乎都是全自动的。

安装缓存扩展

一般的,网站会启用一项缓存服务,而且各个缓存服务之间往往只选择一种。由于php7自带了opcache,所以我们这里安装的缓存是memcache数据库。lnmp一键安装包提供了一个扩展安装脚本,执行如下命令:

./addons.sh

就可以看到哪些缓存服务,输入memcache前面的数字,回车即可。在弹出了新提示中,会让你选择安装memcache的哪一个服务,我们一般使用的是php-memcache,注意末尾是没有d的那一项。之后回车,即可自动完成安装。

创建虚拟主机和绑定域名

lnmp安装好之后,可以使用一个lnmp命令进行一些管理,你可以使用lnmp --help来看有哪些命令。现在,我们来创建一个虚拟主机:

lnmp vhost add

执行之后,会让你进行选择和输入。输入域名的地方要注意,你打算绑定哪个域名,就输入哪个域名,如果这个虚拟主机有多个域名可以访问,可以在输入之后弹出来的新提示中加入更多域名。把该填写的信息都填写好之后,就可以回车创建了。

cd /home/wwwroot

可以看到该网站的目录,进入到这个目录,创建一个index.php,然后将你的域名解析到你的服务器IP地址上,访问域名试试看,是否可以显示index.php中写入的内容了?

你可以多操作几次,熟悉之后,对你今后的使用有帮助。

lnmp路径问题

和使用yum安装不同,lnmp一键安装包为了方便管理,将所有的软件统一安装在/usr/local目录中,下面是所有的有关路径:

/usr/local/apache    # apache的软件安装路径,配置文件在它的conf目录中
/etc/init.d/httpd      # httpd服务脚本,使用service httpd start|stop|restart

/usr/local/mysql      # mysql的安装路径,数据在data目录中
/etc/init.d/mysql     # mysql服务脚本,使用service mysql start|stop|restart
/etc/my.cnf              # mysql配置文件

/usr/local/php         # php安装路径,配置文件在它下面的etc目录中

/usr/local/memcache     # memcahce安装路径
/etc/init.d/memcached  # memcache服务脚本

/home/wwwroot    # 网站默认根目录,所有网站的目录都放在这个目录中
/home/wwwlogs    # 网站运行日志目录

上面就是我们所安装的所有软件的路径,删除软件的方法很简单,先使用service stop把服务停掉,然后把上面这些路径对应的软件全部删掉,即可。如果我们哪一天需要增加服务器,把服务转移到新的服务器上面去怎么办?我写过一篇《Mariadb数据库搬家(文件转移)》的文章,告诉你其实对于软件和数据而言,只需要转移文件即可,但是也不尽然,因为软件的运行需要依赖于其他软件,所以一般而言,如果我们要转移软件,则第一步是在新的服务器上面再次使用lnmp一键安装包进行一次安装,这样可以解决所有软件依赖问题,然后在新的服务器上面停掉所有服务,并全部删掉,然后把老的服务器上的要转移服务停掉,通过scp的方法,转移文件,最后把老服务器上的文件删掉。这样新老服务器的服务就分开了。

至此,我们的服务器环境已经搭建好了,网站也可以运行了,如果遇到问题,多练习几遍。

补充:在开始运行网站之前,还有一个建议,就是阅读一下《在开始之前就最小化你的MySQL》,如果你也和我一样,是为小型网站准备,就可以尝试这种方法,如果是土豪用户,则可以忽略。

服务器安全

服务器环境已经OK了,可是服务器的安全可不容小觑。我之前专门写过一篇《网站服务器安全构建策略基础》,比较详细,但是不利于实践,现在一步一步教你怎么完成基本的服务器安全维护。

使用非root用户在服务器上操作

root用户的权限实在太高了,一个不小小,可以把整个服务器删除掉,比如来一个rm -rf / ,那你的内心一定是崩溃的。所以,我们需要创建一个新的用户来作为服务器的管理者,在管理的时候使用sudo来进行操作。

useradd -g www admin    # 创建一个admin用户到www组中,www组是apache的运行用户组,后面我们会发现有必要这样做
passwd admin    # 为admin设置密码,下面我们会禁用密码登陆,但是在sudo的时候,需要admin输入密码
chmod u+w /etc/sudoers 
vi /etc/sudoers

这个操作是为了让admin用户可以使用sudo命令,默认情况下linux是不允许其他用户使用sudo命令的。在/etc/sudoers文件中,找到root ALL=(ALL) ALL,在它的下一行写上

admin ALL=(ALL) ALL

OK,这样在以后使用admin登陆之后,就可以使用sudo来操作一些root权限的命令了。

使用SSH密钥登陆

使用SSH密钥登陆会安全很多,因为密钥是经过加密的,黑客很难破解,除非他可以黑入你的办公电脑,偷走你的密钥文件,并且可以拿到你的密钥口令(这种情况几乎不可能)。

mkdir /home/admin/.ssh
vi /home/admin/.ssh/authorized_keys

这个地方你需要阅读一下上面我提到的那篇关于服务器安全策略的文章,了解这里使用ssh登陆的实施过程。把你的pub key拷贝到authorized_keys中,这样就可以使用ssh密钥登陆了。

为了安全,请为你的ssh密钥设置口令。

修改SSHD权限相关配置

我们希望服务器仅允许admin可以登陆,而且登陆的时候必须使用ssh密钥登陆,而不能使用密码登陆,我们需要修改sshd的配置文件:

vi /etc/ssh/sshd_config

这个就是sshd的配置文件了,我们要修改4个地方:

  1. port 2020 # 取消port前面的注释符号,并修改端口值
  2. PasswordAuthentication no # 这一行让登陆服务器时不能使用密码登陆
  3. PermitRootLogin no # 不允许root登陆
  4. AllowUsers admin # 仅允许这些用户登陆,由于我们只设置了admin,所以只有admin可以登陆

以上这几条配置如果没有找到的话,可以自己另起一行自己添加进去。完成后保存,执行:

service sshd restart

这个时候已经生效了,这个时候你要注意,如果你的root用户退出,则再也登陆不进去了,所以如果有需要修改的,即使更改,一旦退出,只能使用admin登陆了。

现在回到你自己的电脑(linux,ubuntu,mac osx)上,使用下面的命令连接到服务器:

ssh admin@192.168.3.45 -p 2020

最好在root用户退出之前先试下是否可以登陆,登陆之后用sudo命令操作一下试试是否可行。这里最好还暂时不要推出root,继续往下看。

配置iptables防火墙

iptables防火墙是我们在linux服务器上最常用的,我写过一篇文章《iptables入门:规则及路由基础》来谈iptables的一些基本的概念和规则撰写。下面我们就直接给出规则文件吧。

vi /etc/sysconfig/iptables

打开iptables的链表规则文件,修改为下面的规则:

*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [1:140]
-A INPUT -i lo -j ACCEPT
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p tcp -m tcp --dport 2020 -j ACCEPT    # 允许ssh连接到服务器
-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT        # 允许http访问
-A INPUT -p icmp -m icmp --icmp-type 0 -j ACCEPT    # 允许服务器对外ping得到结果
-A INPUT -j DROP    # 除了ssh、http以外,其他所有接口都无法访问服务器了,包括ping服务器,如果后期你还要使用https的话,在上面的80端口后面需要再加上443端口
-A FORWARD -j DROP
COMMIT

上面就是我所设计的最基本的iptables规则,它可以防止外部使用mysql、memcache等服务,然后执行:

service iptables restart

这个时候,回到你自己电脑上,通过ping服务器,ssh连接到服务器,http访问服务器(phpmyadmin)试试看是否已经运行了防火墙规则,一般情况下,ssh能连上,ping不通,就说明已经起作用了。

OK,到这里,服务器运行环境的搭建就搞定了,接下来就是部署你的网站了。这个地方有一个点要注意,前面我们说过,admin用户是放在www用户组里面的,为什么?因为我们不打算使用ftp,而是使用admin用户,通过sftp连接到服务器上面上传网站文件,所以,只有当我们在服务器上规定网站文件为77x权限时,admin用户才能操作文件,否则admin是没有文件权限的,其实这样,我们又增加了一层安全防护。

2016-02-20