建站/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>