建站/LAMP
如果您不了解某个命令的具体作用,请按照本文提供的内容执行,都是实际验证过的;参考资料为写文章时的部分操作的依据,环境不同强行复刻参考资料的文章或导致出现问题。
命令中出现 下划线 样式的是需要根据你的具体情况修改的内容,包括但不限于用户名、密码、文件名、版本号。
截止2023-08,PHP版本为8.1.2、MySQL版本为8.0.34;非大版本更迭(如PHP7-->8、Mysql5-->8)操作基本通用,但请注意配置文件路径或受版本号影响。
我需要做什么?
安装环境
更新软件包
先运行:sudo apt-get update
和 sudo apt-get upgrade
更新软件包,以防遇到各种奇怪问题(包括但不限于缺少文件及依赖)。
- 若执行命令后短期内安装软件提示有进程锁,可能是后台还在更新,等几分钟就行。
安装Apache2
安装:sudo apt-get install apache2 -y
查看运行状态:service apache2 status
绿点就是运行中。
- 启动/停止:
sudo service apache2 start/stop
在浏览器输入服务器ip/url,就能看到默认的欢迎页了。
- 如果访问失败,先看看实际访问的url,如果是https,则改为http;
- 还是无法访问,在命令行运行:
apache2
,提示“/etc/apache2/apache2.conf 第 80 行出现语法错误……”,则运行:source /etc/apache2/envvars
再访问ip地址[参考]; - 还是看不到请尝试刷新页面、新建隐私窗口访问、换个浏览器访问。
安装MySQL
安装:sudo apt install mysql-server -y
查看运行状态:service mysql status
绿点就是运行中。
- 启动/停止:
service mysql start/stop
;
新版mysql初始是没密码的,以root身份在终端输入:mysql
,进入mysql命令行;
输入指令:ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '你要设置的密码';
- 显示ok就是设置成功,注意保留末尾的英文分号,下同。
输入 exit
并回车退出。
以后再进入mysql命令行就需要输入:mysql -u root -p
,回车并输入root密码。
创建数据库(在mysql命令行内运行):CREATE DATABASE 数据库名;
安装PHP
安装(仅PHP与apache2和mysql组件):sudo apt install php libapache2-mod-php php-mysql -y
- 如果你要使用mediawiki或typecho框架,可以用以下命令一次性安装所需拓展:
- mediawiki框架:
sudo apt-get install php php-apcu php-common php-intl php-json php-mbstring php-xml libapache2-mod-php php-mysql php-curl -y
- typecho:
sudo apt install php libapache2-mod-php php-mysql php-mbstring -y
配置环境
修改index.php
为默认资源:
编辑配置文件:nano /etc/apache2/mods-enabled/dir.conf
- 将
index.php
设为最优先项(排在第一位即可,注意保留前后空格)。
重启apacha2服务激活设置:sudo systemctl restart apache2
查看PHP信息/验证:
在网页目录内新建php文件(nano /var/www/html/info.php
),内容为以下三行:
<?php
phpinfo ();
?>
然后访问 url或ip/info.php
,能正常显示就说明PHP一切正常,也可以顺便查看php版本等系统信息。
done,到这里就完成了。如果单网站,直接把网站资源文件放web目录(/var/www/html/
)内就行了。
- 如果网站强制跳转https,无法进行初始化设置,可能是默认的ssl文件的锅,可以参考#ssl证书进行设置。
进阶配置
修改站点配置文件-多站点设置
如果只有一个网站请跳过本节
建议网站资源不要存放在/html/
主目录下,为站点各自新建目录(文件操作命令:#文件处理)。
以我三个站点为例,他们的网站资源文件分别存储在:
mkdir /var/www/html/mediawiki
mkdir /var/www/html/typecho
mkdir /var/www/html/scio.icu
复制配置文件:
- 进入配置文件目录:
cd /etc/apache2/sites-available/
- 拷贝配置文件:
sudo cp 000-default.conf mediawiki.conf
- 拷贝配置文件:
sudo cp 000-default.conf typecho.conf
- 如果需要禁用某个默认配置文件:
a2dissite xxxx
- 我将默认配置文件用于主域,如果你不想的话可以禁用默认配置文件。
修改配置文件(在配置文件目录内):
nano 000-default.conf
DocumentRoot /var/www/html/scio.icu/
# 网站资源位置
ServerName scio.icu
# 网站域名
ServerAlias www.scio.icu
# 域名别名、其他域名,没有可以不写。
nano mediawiki.conf
DocumentRoot /var/www/html/mediawiki/
ServerName wiki.scio.icu
nano typecho.conf
DocumentRoot /var/www/html/typecho/
ServerName blog.scio.icu
激活配置文件:
a2ensite 000-default.conf
a2ensite mediawiki.conf
a2ensite typecho.conf
重新加载 apache2:
systemctl reload apache2
注意:
- 如果在诸如mediawiki、typecho、wp等框架初始化设置时填写了ip/域名信息,但最后实际使用(解析)的域名与之不同,则找到框架对应的设置文件,将其修改成正确的信息即可(参考本系列文章对应框架的子文章或善用搜索引擎);
- 建议同步修改log文件存放位置,不然混在一起会较难分析,参考#日志文件log所示例的两行。
ssl证书
由于阿里云政策更改,暂无法一直白嫖为期一年的免费证书,现采用 Let's Encrypt 作为替代方案:
通过Certbot客户端实现获取与自动更新证书,详细指南可进入其官网按照提示选择您的环境(例如ubuntu+apache)并复制粘贴所提供的命令:
# ubuntu默认附加了snap,但部分系统(如linuxmint)没有,可以参考官网按系统分的操作指南:https://snapcraft.io/docs/installing-snapd
sudo snap install --classic certbot # 安装certbot
sudo ln -s /snap/bin/certbot /usr/bin/certbot # 使certbot指令可用
sudo certbot --apache # 获取证书,按照提示操作,最后生成证书时,如果提供了www开头的域名但你并未启用它,请通过数字选择需要生成证书的域名,不然会失败,数字间按照提示用英文逗号、空格分离即可。
- 安装好后若新增了站点就可以运行命令:
sudo certbot --apache
重走一遍安装证书的流程。
- 记得开启自动更新证书(按照指南通过snap安装的默认即开启此功能,可按照其官网给出的测试命令下,或运行
systemctl list-timers
看是否有snap.certbot.renew.service
条目即可; - 更新是实时的,没那么多延迟,浏览器刷新(
ctrl+shift+r
/ctrl+f5
)一下页面缓存,点击域名左侧的小锁,不同浏览器操作不同,但都为详细信息处,可见证书颁发者为Let's Encrypt
,即大功告成。
Cerbot会自动修改配置文件,下方引用的为原内容(通过链接证书文件的方式),现已弃用:
用途:使站点支持https,在现代这是一个不可缺少的功能。
- 阿里云购买的域名,可以在阿里云搜索“数字证书管理服务”,进入证书控制台,在左侧选择“SSL证书”,点击“免费证书”,再点击“创建证书”,再点击“申请证书”,输入域名信息后提交审核,中间会自动创建一个dns解析记录(证书颁发后可删除),审核看脸一般1-15分钟,审核通过后点击“下载”,下载“Apache”栏。将下载一份压缩文件,里面是一个key和两个crt文件。
- cf购买或经过cf代理的域名默认就是https,不需要任何额外的设置。
- 其他情况可以用免费证书:Let's Encrypt
以阿里云为例,如果用的宝塔,设置页面直接上传证书就行了,这里说如何手动操作:
- 新建ssl文件夹:
mkdir /etc/apache2/ssl
- 将证书文件(解压后的)上传到该目录(建议通过sFTP);
- 启用ssl模块:
a2enmod ssl
,不报错就是成功。- 进入配置文件所在目录:
cd /etc/apache2/sites-available/
;- 编辑配置文件(直接编辑#修改站点配置文件-多站点设置提到的文件即可):
nano 000-default.conf
- 添加的内容见:#default-ssl.conf
- 重启apache2:
systemctl reload apache2
- done,就可以用https访问网站了。
参考资料:install-ssl-certificates-on-apache-2-servers-that-run-ubuntu、csr-ssl-installation/ubuntu-server-with-apache2-openssl
禁止访问目录
默认是可以访问目录的,这样就可以将文件一览无余,也会有很多安全与隐私隐患,可以在文件夹下放入index.php/html等会被web服务器软件解析的主页资源文件使目录不可见,但对于文件夹稍多点的未免太过麻烦,况且一看就不是很靠谱。可以通过修改apache配置文件限制:
nano /etc/apache2/apache2.conf
- ※ 善用ctrl+w搜索关键词。
- Directory标签内有一行是:
Options Indexes
(或Options Indexes FollowSymLinks
),改为:Options None
——到此已结束,此为分隔符——
※ 到目前为为止已经部署好了web服务,但为了您的体验,请至少开启SFTP以便于后续传输文件。
体验增强
开启SFTP
服务器端安装ssh:sudo apt install ssh
修改配置:sudo nano /etc/ssh/sshd_config
在末尾添加如下行:
Match group sftp
ChrootDirectory /home
X11Forwarding no
AllowTcpForwarding no
ForceCommand internal-sftp
重启ssh服务:sudo systemctl restart ssh
查看运行状态:sudo systemctl status ssh
绿点就是运行中。
- 启动/停止:
sudo service ssh start/stop
客户端建议使用FTP Rush,跨平台、免费、易用。
- 文件--站点管理器--新建(加号)
- 输入ip地址,端口默认的22,用户名root,密码输入root密码,链接即可。
- 文件传输还是有GUI方便。
参考资料(如果需要更详细的设置权限):https://linuxhint.com/setup-sftp-server-ubuntu/
FTP部分可以参考:搭建FTP服务器 - 阿里云、FTP服务器 - Ubuntu,我使用的是SFTP,因为觉得方便。
远程访问数据库
默认只有本地设备可以访问数据库,不影响正常的web服务,但是如果有远程控制数据库的需求,则需要进行一些设置:
编辑配置文件:
nano /etc/mysql/mysql.conf.d/mysqld.cnf
- 以下两行注释掉,或者改成(意思是所有ip都可以访问,127.0.0.1的意思是仅本地设备可访问):
bind-address = 0.0.0.0
mysqlx-bind-address = 0.0.0.0
- “[mysqld]”下面添加一行(因为有些数据库管理客户端可能还不兼容这种加密方式):
default_authentication_plugin=mysql_native_password
重启mysql:
systemctl restart mysql
如果连接报错,则在mysql命令行内执行:
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '数据库root密码' WITH GRANT OPTION;
如果还是报错,则在mysql命令行内依次执行:
USE mysql;
CREATE USER 'root'@'%' IDENTIFIED BY '你的数据库root密码';
GRANT ALL ON *.* TO 'root'@'%';
FLUSH PRIVILEGES;
如果还是报错,请检查服务器的防火墙设置,阿里云的可以参考:建站/服务器#防火墙设置
※ 每次更改设置后,都需要重启数据库才能确保生效。
※ 也可以服务器安装phpMyAdmin,在web端通过这种工具管理数据库。
远程连接数据库:
- 命令行:
mysql -u root -h 服务器IP地址 -p
- 跨平台开源客户端:DBeaver
备份/恢复数据库
可以通过DBeaver这类工具进行便捷的操作。
或命令行操作,并通过ftp传输文件:
- 导出:
mysqldump -u root -p Unraid > /var/www/html/typecho.sql
- 导入:
mysql -u root -p Unraid < /home/anon/app/Unraid.sql
- 导入前需要该数据库存在,按#安装MySQL创建数据库。
- 回车后输入数据库密码,从左到右下划线部分分别是:数据库名称、sql文件路径。
- 参考资料:how-do-i-import-an-sql-file-using-the-command-line-in-mysql
robots.txt
由于我忘记设置robots.txt,有两天访问wiki异常的缓慢,刚开始的时候明明挺流畅,而且最近较大的编辑都是在本地,直接导入到线上的,数据库臃肿不可能这么快,还没一周。然后看阿里云服务器控制台带宽一直被占满,就系列站点的体量来说,绝对不可能。然后想到自己还没设置robots文件。
导出日志文件一看,2023-08-29 00:00 到 10:02:30 这十个小时,有36876个请求,其中Crawlers(没掩盖身份的爬虫)占了33319个,33,173个都是(自称)亚马逊bot,不屏蔽爬虫,正常用户根本无法访问网站(不过就这个请求量,1c2g的机子,带宽能到4Mbps也能轻松应对,爬虫大概只用了1.5-2Mbps(但是全程跑满),所以就普通个人博客的访问体量来说,这个配置完全足够,可惜那时我是1Mbps)。
设定也很简单,创建robots.txt
文件放在网站根目录下即可,内容填写参考:
User-agent: * Disallow: / User-agent: Googlebot Disallow: User-agent: BaiDuSpider Disallow: User-agent: Bingbot Disallow: User-agent: DuckDuckBot Disallow: User-agent: Slurp Disallow: User-agent: yandex Disallow:
前两行是所有bot标识的都禁止访问,后面的是例外项(谷歌/百度/bing/ddg/yahoo/yandex搜索引擎),指允许这些bot访问。可以根据需要进行增删[参考]。但这只能阻止有规范的爬虫,因为很多恶意爬虫不会管规范文件。
日志文件log
默认存储在 /var/log/apache2/
中,access.log
是访问日志,可以使用GoAccess分析日志,但默认的并不好用,如果需要计数,可以考虑使用第三方服务(注意隐私问题):51.LA、goatcounter、Statuspage……
如果是多站点,默认是所有log信息都存储在一起的(因为我们前面没修改此条目),可以修改配置文件来进行分离:无特殊用途则http(80)、https(443)两栏的都改了就行
ErrorLog ${APACHE_LOG_DIR}/error_scio.icu.log
CustomLog ${APACHE_LOG_DIR}/access_scio.icu.log combined
以Mediawiki生成的日志为例,会有一些垃圾数据、数据冗余,可以在分析日志前将其尽数删除:(利用办公软件的自动筛选功能,可以输入关键词只陈列含关键词的行并将之删除;或写个脚本)
old
、limit
、edit
、day
、ico
、load
、returnto
、self
、login
、logo
、resources
、images
、type
、logid
、history
、action
、diff
%E5%9C%A3%E7%8E%8BH%E7%9A%84%E7%A7%98%E5%AF%86%E5%9F%BA%E5%9C%B0%E5%AF%BC%E8%88%AA%E9%A1%B5
(“圣王H的秘密基地导航页”的urlcode)%E7%89%B9%E6%AE%8A:
(“特殊:”的urlcode)MediaWiki:
其他通用的:
bot
、spider
、301
、302
、403
、404
、408
、500
、Go-http-client
、internetnl
、curl
、python
、"-" "-"
、OPTIONS
、POST
、admin
、feed
、usr/
、Google-InspectionTool
后续维护
卸载mysql
停止mysql:service mysql stop
卸载 mysql-common:sudo apt remove mysql-common
卸载 mysql-server:sudo apt autoremove --purge mysql-server
清理残留:dpkg -l|grep ^rc|awk '{print$2}'|sudo xargs dpkg -P
查看依赖项:dpkg --list|grep mysql
(如果php安装了mysql的拓展应该还有两个,不过这个不影响,其他安装mysql附带的没了就行)
其他参资料:How to properly uninstall MySQL Server in Ubuntu for fosslinux、How do I uninstall MySQL? for askubuntu
无法重启apache2
修改配置(如ssl)导致的:
- https://askubuntu.com/a/848962
- 输入:
apachectl stop
,查看报错内容,会说什么文件第几行有错误,修正了再输入该命令没有报错即可。
- 然后重启apache2:
systemctl reload apache2
提示AH00558:
- https://www.digitalocean.com/community/tutorials/apache-configuration-error-ah00558-could-not-reliably-determine-the-server-s-fully-qualified-domain-name
- 一堆看不懂,我是:
nano /etc/apache2/apache2.conf
- 添加:
ServerName 127.0.0.1
到文件末尾; - 验证是否报错:
apachectl configtest
- 重启apache2:
systemctl reload apache2
实在不行可以重装系统,重新配置环境什么的,可能比研究更快。
default-ssl.conf
见#ssl证书章节,由于使用Certbot客户端自动更新Let's Encrypt签发的证书,本节已经作废。
很多教程让修改启用ssl模块后新增(或本就存在)的default-ssl.conf
文件,比如阿里云的那个参考文章,但是遇到了很多问题,我就直接编辑了原配置文件,一点问题都没。以下内容,都摘自该ssl配置文件,然后进行了些修改:
添加/编辑:
ServerName scio.icu
:网站域名,要与证书绑定的域名一致(有别名的话也可以使用别名参数,前提是证书包括别名)。DocumentRoot /var/www/html/scio.icu/
:网站对应的路径。SSLCertificateFile /etc/apache2/ssl/scio.icu_public.crt
:对应的.crt证书文件。SSLCertificateKeyFile /etc/apache2/ssl/scio.icu.key
:对应的.key私钥文件。SSLCertificateChainFile /etc/apache2/ssl/scio.icu_chain.crt
:对应的.crt chain文件。
删除/注释掉(行头添加“#”):
# SSLCertificateFile /etc/ssl/certs/ssl-cert-snakeoil.pem
# SSLCertificateKeyFile /etc/ssl/private/ssl-cert-snakeoil.key
其他内容大都留着。
最终成品示例(默认的是“<VirtualHost *:80>
”,上述下划线部分修改成自己的信息后,在配置文件最后复制粘贴即可):
nano 000-default.conf
(我主站的配置文件):
<VirtualHost *:443> ServerAdmin webmaster@localhost ServerName scio.icu ServerAlias www.scio.icu DocumentRoot /var/www/html/scio.icu/ SSLCertificateFile /etc/apache2/ssl/scio.icu_public.crt SSLCertificateKeyFile /etc/apache2/ssl/scio.icu.key SSLCertificateChainFile /etc/apache2/ssl/scio.icu_chain.crt ErrorLog ${APACHE_LOG_DIR}/error.log CustomLog ${APACHE_LOG_DIR}/access.log combined SSLEngine on <FilesMatch "\.(cgi|shtml|phtml|php)$"> SSLOptions +StdEnvVars </FilesMatch> <Directory /usr/lib/cgi-bin> SSLOptions +StdEnvVars </Directory> </VirtualHost>