建站/LAMP

来自Wired
跳转到导航 跳转到搜索
如果您不了解某个命令的具体作用,请按照本文提供的内容执行,都是实际验证过的;参考资料为写文章时的部分操作的依据,环境不同强行复刻参考资料的文章或导致出现问题。
命令中出现 下划线 样式的是需要根据你的具体情况修改的内容,包括但不限于用户名、密码、文件名、版本号。
截止2023-08,PHP版本为8.1.2、MySQL版本为8.0.34;非大版本更迭(如PHP7-->8、Mysql5-->8)操作基本通用,但请注意配置文件路径或受版本号影响。

我需要做什么?

执行#安装环境#配置环境#进阶配置流程(若不需要则跳过多站点设置),根据需要选择是否执行其他流程,然后安装:框架

 

安装环境

更新软件包

先运行:sudo apt-get updatesudo 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/
  • 编辑配置文件(直接编辑#修改站点配置文件-多站点设置提到的文件即可):
  • 重启apache2:systemctl reload apache2
  • done,就可以用https访问网站了。

参考资料:install-ssl-certificates-on-apache-2-servers-that-run-ubuntucsr-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创建数据库。

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.LAgoatcounterStatuspage……

如果是多站点,默认是所有log信息都存储在一起的(因为我们前面没修改此条目),可以修改配置文件来进行分离:无特殊用途则http(80)、https(443)两栏的都改了就行

  • ErrorLog ${APACHE_LOG_DIR}/error_scio.icu.log
  • CustomLog ${APACHE_LOG_DIR}/access_scio.icu.log combined

以Mediawiki生成的日志为例,会有一些垃圾数据、数据冗余,可以在分析日志前将其尽数删除:(利用办公软件的自动筛选功能,可以输入关键词只陈列含关键词的行并将之删除;或写个脚本)

  • oldlimiteditdayicoloadreturntoselfloginlogoresourcesimagestypelogidhistoryactiondiff
  • %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:

其他通用的:

  • botspider301302403404408500Go-http-clientinternetnlcurlpython"-" "-"OPTIONSPOSTadminfeedusr/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 fosslinuxHow do I uninstall MySQL? for askubuntu

无法重启apache2

修改配置(如ssl)导致的:

  • https://askubuntu.com/a/848962
  • 输入:apachectl stop,查看报错内容,会说什么文件第几行有错误,修正了再输入该命令没有报错即可。
  • 然后重启apache2:systemctl reload apache2

提示AH00558:

实在不行可以重装系统,重新配置环境什么的,可能比研究更快。

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>