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