可能是最全的LAMP环境配置记录 - 记第一次配置服务器环境

这篇文章的配置过程不是最详细的,但可能是最全的。
由于原服务器到期,所以索性租了一个新的云服务器,用了两天时间,终于完成服务器的配置与网站数据的迁移。第一次自己独立进行服务器的配置,踩了不少坑,简单记录配置过程,以备后用。

原文地址:https://www.zlucy.com/archives/281/

服务器环境配置

新的服务器是阿里云的ECS云服务器,全程使用远程连接进行配置。

macOS下,使用终端命令即可进行连接:

ssh root@{IPAddress}

新的云服务器使用的是Ubuntu 16.04的系统,网站运行在Apache+MySQL+Php(AMP)环境下,所以需要手动搭建环境。

安装Apache2

apt install apache2

⚠️ 由于配置时使用root账户,所以本文章所有命令均是以管理员身份执行,非管理员账户请在命令前加sudo以管理员身份执行命令。

命令执行期间会询问(y/n)输入y回车即可。

命令执行完毕后,Apache服务已经自动启动,可通过服务器的浏览器访问127.0.0.1localhost检查是否正常安装及工作。若看到“It works!”即表示Apache已经正常安装及运行。

Apache的默认安装,会在/var下建立一个路径为www/html/的目录,这个就是Web目录了,所有要能过浏览器访问的Web文件都要放到这个目录里。

⚠️ 由于使用远程连接,无法通过访问127.0.0.1localhost进行验证,可以使用本地的浏览器访问远程服务器IP地址检查Apache2是否正常安装及工作。

⚠️ 由于阿里云ECS服务器默认没有放行80端口,所以需要先在阿里云控制台配置安全组以通过浏览器正常访问服务器,详见本文阿里云安全组配置

Apache重启:

/etc/init.d/apache2 restart

service apache2 restart

安装MySQL

apt install mysql-server

在安装期间,会要求设置mysql数据库的root账户密码,两次输入密码后,完成安装。安装完成之后可以使用如下命令来检查是否安装成功:

netstat -tap | grep mysql

通过上述命令检查之后,如果看到有mysql 的socket处于 listen 状态则表示安装成功。

登陆mysql数据库可以通过如下命令:

mysql -u root -p

-u:登陆的用户名;

-p:登陆的用户密码。

上面命令输入之后会提示输入密码,输入密码就可以登录到mysql。

然后通过show databases;就可以查看当前所有的数据库,exit退出mysql。

安装PHP(7.0)

apt install php

安装PHP-mysql扩展

apt install php-mysql

安装Apache-PHP扩展

apt install libapache2-mod-php

重启Apache。

在Apache2的Web服务根目录(var/www/html)中,写入index.php文件:

<?php
    phpinfo();
?>

删除目录中原有的index.html

通过服务器的浏览器访问127.0.0.1localhost检查PHP是否正常安装。同样,在本地使用http://{IPAddress}进行访问。

安装phpMyAdmin

通过终端操作数据库终究不是那么方便,可以使用数据库客户端远程连接数据库进行操作或使用phpMyAdmin进行数据库管理。

apt install phpmyadmin

在安装过程中会要求选择Web server:apache2或lighttpd,使用空格键选定apache2,按tab键然后确定。接下来会要求输入Mysql数据库的管理员密码。

接下来,将phpMyAdmin与Apache的Web服务目录进行软连接:

ln -s /usr/share/phpmyadmin /var/www/html

通过浏览器访问http://localhost/phpmyadmin就可以使用phpMyAdmin进行数据库管理了。同样,在本地使用http://{IPAddress}/phpmyadmin进行访问。

至此,LAMP的基本组件就安装完毕了。

设置Ubuntu文件执行读写权限

由于Linux系统的安全性原则,改系统目录下的文件读写权限是只允许root用户操作的,所以我们不能在Apache的Web服务目录中新建php文件,也不能修改和删除,所以必须要先修改/var/www/html目录的读写权限。

chmod -R 777 /var/www/html

-R:同时修改所有子目录及文件的权限;

777:所有用户均可读写执行。

使用Git进行代码管理及网站部署

搭建Git服务

安装Git

apt install git

新建Git用户组

groupadd git

新建git用户

useradd git -m -s /sbin/nologin -d /home/git -g git

-m, --create-home:创建Home目录;

-s, —shell:指定一个shell,下面是不能登录的;

-d, --home-dir:指定具体Home目录在哪;

-g, --gid GROUP:指定组名或组的ID。

修改git用户的密码

passwd git

创建空仓库(可使用cd命令进入仓库存放的目录)

git init --bare yourweb.git  

--bare:空仓库。

修改仓库权限

chown -R git:git yourweb.git

为避免以后每次操作需要输入密码,生成本地公钥,添加公钥至服务器

ssh-keygen

⚠️ 此操作是在本地终端进行,并非连接到远程服务端下操作。可通过终端命令前的标识可区分本地还是远端。

macOS下生成的公钥在/Users/{Username}/.ssh/目录下,id_rsa.pub即为公钥,使用文本编辑工具打开,完整复制内容,写入远端git用户的Home目录下/home/git/.ssh/authorized_keys,每行一个公钥。authorized_keys文件不存在就按照路径创建。

Git本地(客户端)克隆测试

git clone git@{IPAddress}:/具体目录/yourweb.git

如:git clone git@39.121.33.34:/home/git/test.git

同步更新网站文件

创建hook任务

进入远端yourweb.git目录,在/hooks/目录下创建post-receive文件。

post-receive中加入如下代码:

git --work-tree=/var/www/html/yourweb checkout -f

--work-tree:工作目录

checkout:检出

-f:强制执行

修改post-receive文件执行权限

chmod +x post-receive

+x:增加执行权限

为增加git用户增加修改Web 目录的权限

chown -R git:git /var/www/html/yourweb

现在可以在本地修改index.php文件,或者添加一个新文件,提交到远程仓库,然后在/var/www/html/yourweb下面,看看有没有刚才提交的文件。

至此,一个使用Git进行自动部署的Web服务器就搭建完成了。

网站配置

接下来只需要通过Git提交网站文件及绑定域名,就可以通过域名访问网站了。域名绑定及设置详见本文域名解析配置

本次是网站迁移,所以后续还有一些东西要配置。

这个网站使用的是Typecho。由于网站已经配置过,需要进行手动修改配置文件或删除网站根目录下的config.inc.php文件重新进入引导。主要就是数据库的配置。

数据库配置及数据迁移

在修改网站配置文件前,需要手动在服务器的mysql数据库中添加用户及数据库,这里使用phpMyAdmin。

在浏览器中打开http://{IPAddress}/phpmyadmin,输入数据库账户及密码,进入数据库。

这里可以新建一个用户及数据库,或者直接使用root用户仅新建一个数据库。

新建数据库用户:点击“用户账户”选项卡—“新增账户用户“,设置登录信息,勾选“创建与用户同名的数据库并授予所有权限。”,点击“执行”,账户及数据库就创建成功了。

在左侧数据库列表中,就可以看到一个与用户名同名的数据库了。

数据迁移

在原数据库中,导出数据,导出时注意编码方式。

在新数据库中导入对应的数据库。

网站配置

手动修改的方式:

打开网站的config.inc.php文件,找到最后几行:

/** 定义数据库参数 */
$db = new Typecho_Db('Pdo_Mysql', 'typecho_');  //数据库连接方式,数据库表前缀
$db->addServer(array (
  'host' => 'localhost',        //数据库地址
  'user' => 'typecho',          //数据库用户名
  'password' => '******',       //数据库密码
  'charset' => 'utf8',          //数据库编码格式
  'port' => '3306',             //数据库端口
  'database' => 'typecho',      //数据库名称
), Typecho_Db::READ | Typecho_Db::WRITE);
Typecho_Db::set($db);

保存文件,提交变更。

使用引导的方式设置:

删除网站的config.inc.php文件,打开网站,即可进入配置引导。

⚠️ 由于数据库已经导入了数据,在引导完成时,会提醒是否保留数据,选择保留!

至此,网站数据迁移完成。

SSL配置

开启Apache2的SSL模块

a2enmod ssl

执行完毕后会提示重启Apache。

上传证书

这里用的是阿里云的免费证书,在阿里云的控制台可下载证书相关文件:

214184720410***.key
214184720410***.pem
chain.pem
public.pem

这里可以使用ssh的SFTP服务进行文件上传,macOS下可使用FileZilla客户端连接远端的文件服务。

证书文件分别放置如下位置:

# 214184720410***.key
/etc/ssl/private/214184720410***.key

# chain.pem
/etc/ssl/certs/chain.pem

# public.pem
/etc/ssl/certs/public.pem

修改默认的ssl配置文件default-ssl.conf,文件位于/etc/apache2/site-available目录下:

ServerName www.yourwebdomain.com
DocumentRoot /var/www/html/yourweb

# 证书公钥配置
SSLCertificateFile  /etc/ssl/certs/public.pem
# 证书私钥配置
SSLCertificateKeyFile /etc/ssl/private/214184720410125.key
# 证书链配置,如果该属性开头有'#'字符,请删除掉
SSLCertificateChainFile /etc/ssl/certs/chain.pem

保存文件,启用配置:

a2ensite default-ssl.conf

执行完毕后会提示重新加载Apache:

service apache2 reload

若配置文件出错,则会重载失败,请检查证书文件路径及文件是否正确。

在本地浏览器访问https://www.yourwebdomain.comhttps://{IPAddress},检查配置是否正确。

⚠️ 由于阿里云ECS服务器默认没有放行HTTPS(443)端口,所以需要先在阿里云控制台配置安全组以通过浏览器正常访问服务器,详见本文阿里云安全组配置

301跳转配置

使用301跳转,需开启Apache2的rewrite模块:

a2enmod rewrite

执行完毕后会提示重启Apache。

同时,需要修改Apache的配置文件/etc/apache2/apache2.conf,找到如下记录并修改AllowOverride原值NoneAll以开启重写功能:

<Directory />
        Options FollowSymLinks
        AllowOverride All
        Require all denied
</Directory>

<Directory /var/www/>
        Options Indexes FollowSymLinks
        AllowOverride All
        Require all granted
</Directory>

<Directory /var/www/html/yourweb/>
        Options Indexes FollowSymLinks
        AllowOverride All
        Require all granted
</Directory>

301重定向有两种实现方式,一种是在网站的根目录下加入.htaccess文件,写入跳转规则;另一种则是在Apache的website配置文件中加入跳转规则。前者规则配置集中便于管理,后者规则较为分散但针对不同域名有更高的灵活度。本例中使用.htaccess进行配置。

强制HTTPS访问

如果网站已经配置SSL证书,开启了HTTPS的访问,那么网站中HTTP链接便会影响网站的安全,而来自HTTP的访问也无法访问HTTPS的链接,所以需要强制使用HTTPS访问。

在网站的根目录下创建.htaccess文件,写入如下规则:

<IfModule mod_rewrite.c>

    RewriteEngine On
    RewriteBase /

    RewriteCond %{SERVER_PORT} 80
    RewriteRule ^(.*)$ https://%{SERVER_NAME}/$1 [L,R=permanent]

</IfModule>

domain.com跳转www.domain.com

对所有的一级域名访问添加“www”可以保证网站权重的集中,如果不做跳转,网站的权重会分散,导致搜索引擎的排名的不理想。

规则如下:

<IfModule mod_rewrite.c>

    RewriteEngine On
    RewriteBase /

    RewriteCond %{HTTP_HOST} ^domain.com
    RewriteRule ^(.*)$ https://www.domain.com/$1 [L,R=permanent]

</IfModule>

Typecho的伪静态配置

Typecho提供了伪静态的选项,这让网站看起来是一个静态站,开启伪静态对SEO的优化也有很重要的影响。

规则如下(参考:Typecho开启伪静态并隐藏index.php):

<IfModule mod_rewrite.c>

    RewriteEngine On
    RewriteBase /

    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.*)$ index.php/$1 [L,E=PATH_INFO:$1]

</IfModule>

在Typecho网站的后台,“设置”—“永久链接”选项卡下可以开启并设置伪静态样式。

⚠️ 若开启时提示“重写功能检测失败, 请检查你的服务器设置”,可勾选“如果你仍然想启用此功能, 请勾选这里”,以强制开启伪静态,但同时要在网站的.htaccess文件中配置好规则,否则会导致所有二级页面无法访问。

其他相关

阿里云安全组配置

在阿里云的控制台中,“云服务器ECS”—“网络和安全”—“安全组”选项下,可以看到所有的安全组,在需要配置的安全组中,进入“配置规则”。

在“入方向”选项卡下添加以下规则:

授权策略 协议类型 端口范围 授权类型 授权对象 描述 优先级
允许 自定义TCP 443/443 地址段访问 0.0.0.0/0 HTTPS端口 1
允许 自定义TCP 21/21 地址段访问 0.0.0.0/0 FTP端口 1
允许 自定义TCP 3306/3306 地址段访问 0.0.0.0/0 数据库端口 1
允许 自定义TCP 80/80 地址段访问 0.0.0.0/0 HTTP端口 1
允许 自定义TCP 22/22 地址段访问 0.0.0.0/0 SSH端口 110
允许 自定义TCP 3389/3389 地址段访问 0.0.0.0/0 远程桌面端口 110
允许 全部 ICMP -1/-1 地址段访问 0.0.0.0/0 系统创建规则 110

本例中,并没有使用到3306、21及3389端口。因为数据库与Web服务在同一服务器,所以在网站运行中并不需要使用3306端口,如果需要在本地客户端链接远端数据库,此端口需要打开。21端口是用于FTP文件服务,在本例中,使用了SSH的SFTP服务,所以也并没有使用到21端口,而是使用了22端口。22端口是SSH端口,是由系统创建的规则,不需要再进行创建。因为使用SSH远程连接,所以3389端口也并没有使用。

对于使用不到的端口,可以删除规则,或者修改授权策略为不允许,以保证服务器的安全。

可以在远端通过命令查看服务器使用到那些端口,再添加或修改相应的规则:

netstat -atunlp

在生产环境中,可能会用到更多端口及配置更多规则,详情查看阿里云官方文档

CDN配置(阿里云)

CDN(Content Delivery Network):内容分发网络。可以提高网站的访问速度,保护服务器源站信息,降低带宽使用成本等。

在阿里云的控制台中,“CDN”—“域名管理”下,添加要加速的域名。

根据网站的不同用途,选择不同的业务类型:图片小文件、大文件下载、视音频点播、直播流媒体。

源站可以为IP地址或域名,但要加速的域名,不可与源站域名相同。

端口选择网站使用的端口,443端口需要添加网站相应的证书,可根据引导添加。

域名添加完成后,可以设置加速规则、访问控制、性能优化等设置选项,本例着重说明“缓存设置”。

缓存设置是CDN对网站加速的一个重要设置,设置好的缓存规则,可以提高CDN命中率,加快网站访问速度,及减少源站流量用量:

地址 类型 过期时间 权重
jpg,png 文件后缀名 1月 90
js,css 文件后缀名 30分 80
php 文件后缀名 0年 1
asp 文件后缀名 0年 1
aspx 文件后缀名 0年 1

⚠️ CDN缓存配置支持针对目录、后缀名的两种缓存规则设置,暂时还不支持针对于具体文件(URL)的缓存设置。在设置多条缓存策略后选择对应的配置并通果优先级的向上/向下来调整个配置优先级,遇到具体文件将按照优先级由高至低进行匹配。

当需要设置某个目录或后缀不缓存,过期时间设置为0秒即可 。

规则配置好之后,我们需要设置相应的域名解析,以实现加速。在域名管理的列表中,可以查看CName。

域名解析配置(阿里云)

在阿里云的控制台,“云解析 DNS”—“解析设置”下,进行域名的解析操作。

添加一条解析

记录类型有A、CNAME、AAAA、NS、MX、SRV、TXT、CAA、显性URL、隐形URL。

  • A:地址记录,用来指定域名的IPv4地址,如果需要将域名指向一个IP地址,就需要添加A记录。
  • CNAME: 如果需要将域名指向另一个域名,再由另一个域名提供ip地址,就需要添加CNAME记录。
  • AAAA:用来指定主机名(或域名)对应的IPv6地址(例如:ff06:0:0:0:0:0:0:c3)记录。
  • TXT:在这里可以填写任何东西,长度限制255。绝大多数的TXT记录是用来做SPF记录(反垃圾邮件)。
  • NS:域名服务器记录,如果需要把子域名交给其他DNS服务商解析,就需要添加NS记录。
  • MX:如果需要设置邮箱,让邮箱能收到邮件,就需要添加MX记录。
  • SRV:记录了哪台计算机提供了哪个服务。格式为:服务的名字、点、协议的类型。
  • 显性URL:从一个地址301重定向到另一个地址的时候,就需要添加显性URL记录(注:DNSPod目前只支持301重定向)。
  • 隐性URL:类似于显性URL,区别在于隐性URL不会改变地址栏中的域名。

主机记录一般有www、@、*以及其他

  • www:解析后为www.domain.com
  • @:直接解析主域名
  • *:泛解析,除已设置的主机记录外,均解析到此地址
  • mail:将域名解析为mail.aliyun.com,通常用于解析邮箱服务器。
  • 二级域名:如:abc.aliyun.com,填写abc。
  • 手机网站:如:m.aliyun.com,填写m。
  • 显性URL:不支持泛解析(泛解析:将所有子域名解析到同一地址)

记录值即为要解析到的地址,或域名,或配置等。

在域名解析设置中,不同的记录类型主机记录可能会有冲突,比如在使用了邮件服务的域名下,设置了MX的“@”记录,则CNAME记录就不能再使用“@”主机记录了。

详细冲突原因可查阅设置解析记录时提示冲突的原因

设置CDN加速

可设置记录类型为CNAME,主机记录为“www”,记录值为CDN域名列表中相应域名的CNAME值即可。

最后再说几句

用了两天时间完成了此次的网站迁移,期间也踩了不少坑:

比如SSL证书配置好之后,无法使用HTTPS访问,以为是SSL证书配置问题,各种检查无果,恍然间才发现是ECS的安全组配置没有放行443端口,规则修改后,即可正常访问了。

又比如设置Typecho的301重定向,导致所有二级页面全部404,查阅后,发现需要手动配置.htaccess文件,而之前服务器则不需要手动配置。配置好.htaccess文件后,网站的后台设置均无法保存,初以为是数据库权限问题,又重新设置一遍数据库,但是问题依旧,各种折腾无果,又是恍然间,发现是Typecho伪静态的301重定向规则不够完善,仅仅对前台重定向正确,后台链接重定向错误,导致数据不能正常提交,修改.htaccess文件,重写301重定向规则,问题解决。

又如在未开启HTTPS访问前,导致网站所有样式丢失,检查后发现是因为原网站的配置文件开启了HTTPS相关,导致在HTTP下,无法访问HTTPS资源,所有样式丢失。关闭HTTPS相关配置,问题解决,配置好SSL后,重新开启网站HTTPS配置即可。

……

在迁移过程中,难免遇见大大小小的问题,有的可能容易解决,有的可能意想不到,当没有头绪的时候,不如换换思维,做点别的事情,说不定哪个“恍然间”问题就解决了:)

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,378评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,356评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,702评论 0 342
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,259评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,263评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,036评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,349评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,979评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,469评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,938评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,059评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,703评论 4 323
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,257评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,262评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,485评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,501评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,792评论 2 345

推荐阅读更多精彩内容