戰(zhàn):Apache安裝、虛擬主機(jī)配置與防火墻避坑指南)
很多朋友手里還跑著Ubuntu 18.04的存量服務(wù)器尤其是那批LTS時(shí)代部署的老業(yè)務(wù)遷移成本高、依賴(lài)鎖定壓根不是說(shuō)換就換的。在這個(gè)版本上裝Apache看似是apt install apache2一句話(huà)的事但實(shí)際落下去會(huì)碰到軟件源、systemd服務(wù)管理、防火墻放行、站點(diǎn)目錄權(quán)限等一系列連鎖問(wèn)題。這篇文章是Linux之Apache安裝系列的第五篇前面幾篇我們把Ubuntu 18的基礎(chǔ)環(huán)境、網(wǎng)絡(luò)配置、SSH加固都過(guò)了一遍現(xiàn)在正好輪到Web服務(wù)這一層。我會(huì)完整走一遍從更新軟件源到虛擬主機(jī)可用的全過(guò)程重點(diǎn)講清楚每一步背后的機(jī)制和我在實(shí)際部署中遇到過(guò)的坑保證你照著做能避開(kāi)大多數(shù)新手會(huì)踩的雷。1. 為什么到了Ubuntu 18還會(huì)重提Apache安裝——版本差異與選型邏輯1.1 Ubuntu 18.04的Apache版本其實(shí)是老而穩(wěn)的典型Ubuntu 18.04自帶的Apache版本是2.4.29這個(gè)版本放在今天看絕對(duì)算不上新但它恰恰是LTS時(shí)代的經(jīng)典組合。2.4系列從2.4.6開(kāi)始就引入了事件型MPMmulti-processing module的成熟實(shí)現(xiàn)2.4.29已經(jīng)是event模式非常穩(wěn)定的狀態(tài)。很多老項(xiàng)目的.htaccess規(guī)則、模塊依賴(lài)都是圍繞2.4系列寫(xiě)的你換成新買(mǎi)的VPS默認(rèn)帶的Apache 2.4.5x反而可能出現(xiàn)配置語(yǔ)法兼容問(wèn)題比如某些老模塊在新版本里被拆分或棄用。我接手過(guò)某公司的內(nèi)部系統(tǒng)跑的就是Ubuntu 18 Apache 2.4.29上面掛著五六套老舊的PHP應(yīng)用。運(yùn)維那邊不是不想升級(jí)而是每升一次就要重新驗(yàn)證幾十個(gè)RewriteRule和認(rèn)證模塊的兼容性代價(jià)遠(yuǎn)大于收益。所以對(duì)相當(dāng)一部分生產(chǎn)環(huán)境來(lái)說(shuō)Ubuntu 18重裝Apache依然是一個(gè)非?,F(xiàn)實(shí)的需求——可能是容器化遷移前的過(guò)渡也可能是新擴(kuò)容的機(jī)器要加入已有的負(fù)載均衡集群要求版本保持完全一致。1.2 選Apache而不是Nginx這里面的邏輯要說(shuō)清楚經(jīng)常有人問(wèn)我新部署為什么不直接用Nginx我的回答是取決于你的應(yīng)用長(zhǎng)什么樣。Apache和Nginx的核心差異不在性能而在于請(qǐng)求處理模型和配置理念。Apache的prefork模式每個(gè)請(qǐng)求一個(gè)進(jìn)程內(nèi)存開(kāi)銷(xiāo)大但兼容性好特別是配合mod_php的老式PHP環(huán)境幾乎零適配成本。而event模式雖然性能和Nginx接近但配置復(fù)雜度高一些。Nginx的優(yōu)勢(shì)是高并發(fā)靜態(tài)資源處理和反向代理缺點(diǎn)是動(dòng)態(tài)內(nèi)容的FastCGI配置鏈路長(zhǎng)模塊體系不像Apache的DSODynamic Shared Object那樣可以裝完即刻生效。如果你的項(xiàng)目有.htaccess文件的強(qiáng)依賴(lài)——比如某些老舊的CMS系統(tǒng)、WordPress插件、ThinkPHP的URL重寫(xiě)——Apache就是最省事的選擇。Nginx雖然也能模擬.htaccess規(guī)則但你得手動(dòng)把規(guī)則翻譯到server塊里這是個(gè)純體力活還容易出錯(cuò)。在實(shí)際運(yùn)維中沒(méi)必要為了用新不用舊強(qiáng)行遷到Nginx那是給自己找事。2. 開(kāi)始動(dòng)手三個(gè)命令把Apache裝上以及每一步的真實(shí)用意2.1 第一步是刷新軟件源索引不是走過(guò)場(chǎng)在干凈的Ubuntu 18上裝Apache第一件事永遠(yuǎn)是sudo apt update這個(gè)命令很多人會(huì)習(xí)慣性執(zhí)行但未必清楚它到底做了什么。apt update并不會(huì)升級(jí)任何軟件它的作用是讀取/etc/apt/sources.list和/etc/apt/sources.list.d/下的軟件源配置然后從源服務(wù)器拉取軟件包索引Packages.gz等文件到本地緩存。如果你新裝的系統(tǒng)幾個(gè)月沒(méi)刷新過(guò)索引直接apt install很可能得到Unable to locate package apache2或者裝到一個(gè)非常舊的版本。這里有個(gè)Ubuntu 18特有的細(xì)節(jié)需要注意18.04已經(jīng)不在標(biāo)準(zhǔn)源里提供所有更新了很多機(jī)器配置了ESMExtended Security Maintenance源或者其他鏡像源。如果apt update輸出里出現(xiàn)Timeout或者404 Not Found優(yōu)先檢查/etc/apt/sources.list里是否有security.ubuntu.com或archive.ubuntu.com的舊地址。我多次遇到的問(wèn)題是源列表里還寫(xiě)著EOL版本的組件倉(cāng)庫(kù)導(dǎo)致apt update到一半報(bào)錯(cuò)。穩(wěn)妥做法是把官方源切換為可用的鏡像源再用apt update驗(yàn)證直到不報(bào)錯(cuò)為止。2.2 安裝apache2包Ubuntu裁剪版的默認(rèn)行為有哪些索引刷新完成后安裝命令非常簡(jiǎn)單sudo apt install -y apache2但裝完之后發(fā)生的事才是重點(diǎn)。Ubuntu的apache2包和Apache官網(wǎng)的源碼包有一個(gè)重要區(qū)別它沒(méi)有單獨(dú)提供httpd這個(gè)啟動(dòng)腳本而是完全走systemd服務(wù)模型服務(wù)名叫apache2.service。安裝完成后不需要你手動(dòng)注冊(cè)服務(wù)包管理器已經(jīng)幫你把服務(wù)文件和符號(hào)鏈接都放好了systemctl直接就能接管。同時(shí)Ubuntu包裝版默認(rèn)啟用的MPM是mpm_event不是許多人印象中的prefork。如果你后續(xù)要裝libapache2-mod-phpDPKG會(huì)自動(dòng)幫你切換到mpm_prefork但你如果先手動(dòng)改了MPM配置再裝PHP模塊就可能在重啟服務(wù)時(shí)報(bào)模塊沖突。這是我在給某項(xiàng)目部署LAMP環(huán)境時(shí)真踩過(guò)的手動(dòng)把MPM改成prefork裝PHP后服務(wù)直接起不來(lái)最后只能通過(guò)清除配置重裝才解決。2.3 驗(yàn)證服務(wù)狀態(tài)從systemd的角度看Apache安裝完成后立刻檢查三件事服務(wù)運(yùn)行狀態(tài)、開(kāi)機(jī)自啟狀態(tài)、端口監(jiān)聽(tīng)情況。systemctl status apache2 systemctl is-enabled apache2 ss -tlnp | grep :80systemctl status不僅能告訴你服務(wù)是否active還能看到主進(jìn)程PID、內(nèi)存占用、最近日志。is-enabled確認(rèn)是否已經(jīng)設(shè)置開(kāi)機(jī)自啟正常情況下返回enabled如果返回disabled需要執(zhí)行sudo systemctl enable apache2。ss -tlnp是用來(lái)替代老命令netstat的現(xiàn)代工具??吹?.0.0.0:80或者[::]:80說(shuō)明Apache已經(jīng)監(jiān)聽(tīng)所有IPv4和IPv6地址的80端口。注意如果你只想讓Apache監(jiān)聽(tīng)特定IP可以修改/etc/apache2/ports.conf里的Listen指令。比如只監(jiān)聽(tīng)內(nèi)網(wǎng)IPListen 192.168.1.10:80這樣可以避免Web服務(wù)意外暴露到公網(wǎng)。這一步我在安全意識(shí)較強(qiáng)的項(xiàng)目里經(jīng)常做能少很多不必要的掃描攻擊。接著用curl驗(yàn)證默認(rèn)頁(yè)面是否正常響應(yīng)curl -I http://127.0.0.1/正常情況下會(huì)返回HTTP/1.1 200 OK以及Server: Apache/2.4.29 (Ubuntu)響應(yīng)頭。如果看到的是curl: (7) Failed to connect那就需要從頭排查服務(wù)狀態(tài)和端口監(jiān)聽(tīng)了。3. 裝完不等于能用Ubuntu 18上必須處理的自啟動(dòng)與防火墻策略3.1 設(shè)置開(kāi)機(jī)自啟與確認(rèn)監(jiān)聽(tīng)地址兩步打包做很多教程在安裝完Apache之后就戛然而止我建議你多花一分鐘確認(rèn)開(kāi)機(jī)自啟。雖然不是每次都需要手動(dòng)啟用——Ubuntu的DEB包安裝流程通常已經(jīng)把服務(wù)啟用寫(xiě)入了postinst腳本——但有些特殊的違規(guī)操作系統(tǒng)鏡像或Docker容器里服務(wù)注冊(cè)并不完整。檢查命令sudo systemctl enable apache2 sudo systemctl restart apache2enable操作本質(zhì)是在/etc/systemd/system/multi-user.target.wants/目錄下創(chuàng)建一個(gè)指向/usr/lib/systemd/system/apache2.service的符號(hào)鏈接。知道這個(gè)原理之后你就能理解為什么有些禁用服務(wù)教程會(huì)直接讓你刪符號(hào)鏈接而不是用systemctl disable——兩者效果一樣但前者容易留下殘留狀態(tài)。確認(rèn)監(jiān)聽(tīng)地址時(shí)我建議同時(shí)看IPv4和IPv6因?yàn)閁buntu 18默認(rèn)開(kāi)啟了IPv6Apache的默認(rèn)Listen 80和Listen 443會(huì)同時(shí)綁定*所有地址。如果機(jī)器商的防火墻對(duì)IPv6處理不完善可能出現(xiàn)IPv4能訪(fǎng)問(wèn)、IPv6打不開(kāi)的詭異現(xiàn)象。你可以在瀏覽器或者用curl -6 http://[::1]/測(cè)試本機(jī)IPv6連通性然后在云控制臺(tái)和本地UFW兩側(cè)都把相應(yīng)協(xié)議放行。3.2 UFW防火墻放行HTTP/HTTPSIPv4和IPv6別漏Ubuntu 18默認(rèn)沒(méi)有啟用UFW但生產(chǎn)環(huán)境我建議打開(kāi)否則應(yīng)用端口裸露在公網(wǎng)太危險(xiǎn)。放行Apache相關(guān)的命令sudo ufw allow Apache Full sudo ufw enable sudo ufw status numberedApache Full是UFW自帶的應(yīng)用配置包含80和443兩個(gè)端口。如果你不想開(kāi)放HTTPS用sudo ufw allow Apache即可那個(gè)只放行80。需要注意幾點(diǎn)ufw enable會(huì)立即激活防火墻規(guī)則如果你當(dāng)前是通過(guò)SSH連接的請(qǐng)先確認(rèn)SSH端口已經(jīng)被放行否則會(huì)把自己關(guān)在外面。標(biāo)準(zhǔn)的做法是sudo ufw allow OpenSSH或者sudo ufw allow 22/tcp順序上是先放行22端口再開(kāi)防火墻。UFW規(guī)則會(huì)自動(dòng)生成IPv6的對(duì)應(yīng)條目前提是內(nèi)核啟用了IPv6且/etc/default/ufw里的IPV6yes。很多被精簡(jiǎn)過(guò)的系統(tǒng)鏡像是IPV6no這會(huì)導(dǎo)致只有IPv4規(guī)則生效IPv6流量全部被擋。云服務(wù)商比如各種云主機(jī)的控制臺(tái)安全組策略和主機(jī)內(nèi)部的UFW是兩層獨(dú)立的東西。哪怕UFW里放行了80端口控制臺(tái)安全組沒(méi)放行的話(huà)外網(wǎng)依然訪(fǎng)問(wèn)不了。這一條我?guī)缀趺看巫龇?wù)器巡檢都要提醒太容易忽略了。4. 安裝后的目錄結(jié)構(gòu)默認(rèn)頁(yè)面、站點(diǎn)配置和模塊機(jī)制的來(lái)龍去脈4.1 /var/www/html、sites-available與sites-enabled的關(guān)系裝完Apache后很多教程只說(shuō)默認(rèn)頁(yè)面在/var/www/html但對(duì)配置目錄的結(jié)構(gòu)講得很淺。Ubuntu的Apache目錄結(jié)構(gòu)其實(shí)是一個(gè)典型的可用/啟用分離設(shè)計(jì)搞清楚它才能優(yōu)雅地管理多站點(diǎn)。關(guān)鍵目錄如下路徑作用說(shuō)明/etc/apache2/apache2.conf主配置文件一般不直接改內(nèi)容通過(guò)Include引入其他配置/etc/apache2/ports.conf端口配置定義80、443等監(jiān)聽(tīng)端口/etc/apache2/sites-available/站點(diǎn)可用配置存放所有站點(diǎn)的VirtualHost定義/etc/apache2/sites-enabled/站點(diǎn)啟用配置通過(guò)符號(hào)鏈接指向available里的文件/etc/apache2/mods-available/模塊可用配置需要加載的模塊的.load和.conf文件/etc/apache2/mods-enabled/模塊啟用配置通過(guò)符號(hào)鏈接指向available里的文件/etc/apache2/conf-available/全局可用配置片段如安全策略、緩存參數(shù)等/var/www/html/默認(rèn)站點(diǎn)的DocumentRootUbuntu默認(rèn)首頁(yè)所在位置sites-enabled和sites-available的關(guān)系是整個(gè)設(shè)計(jì)精髓。默認(rèn)情況下你在sites-available里看到的是000-default.conf而sites-enabled里同樣有一個(gè)000-default.conf的符號(hào)鏈接。Apache啟動(dòng)時(shí)會(huì)用IncludeOptional sites-enabled/*.conf把這層符號(hào)鏈接指向的真實(shí)文件全部讀進(jìn)來(lái)。這種機(jī)制的好處是你可以提前準(zhǔn)備多個(gè)站點(diǎn)配置但不會(huì)被Apache加載直到你顯式地用a2ensite把它們鏈接到enabled目錄。4.2 模塊啟用的本質(zhì)符號(hào)鏈接和a2enmod的等價(jià)操作同樣的機(jī)制也適用于模塊目錄。很多人用一個(gè)a2enmod rewrite就完事了不理解它到底改了什么。查看mods-enabled目錄就能看到端倪ls -la /etc/apache2/mods-enabled/里面滿(mǎn)是rewrite.load - ../mods-available/rewrite.load這種符號(hào)鏈接。a2enmod rewrite做的事情無(wú)非就是創(chuàng)建這個(gè)符號(hào)鏈接然后在服務(wù)重載時(shí)讓Apache加載rewrite.load里指定的共享對(duì)象文件。手動(dòng)操作的話(huà)ln -s一條命令也能達(dá)到同樣效果但很容易忘記同時(shí)啟用相關(guān)的.conf文件有些模塊有配置片段所以我還是建議一律用a2enmod和a2dismod管理。模塊配置在Ubuntu兩個(gè)文件里被加載.load負(fù)責(zé)加載模塊二進(jìn)制.conf負(fù)責(zé)模塊的默認(rèn)參數(shù)。例如a2enmod php7.2或a2enmod ssl前者會(huì)加載libphp7.2.so后者會(huì)啟用mod_ssl并順帶加載SSL相關(guān)配置。理解這個(gè)機(jī)制之后你就能舉一反三當(dāng)Apache無(wú)法重啟時(shí)報(bào)Module X already loaded錯(cuò)誤多半是你在apache2.conf里手動(dòng)LoadModule同時(shí)又用a2enmod啟用了同一個(gè)模塊導(dǎo)致重復(fù)加載。遇到這種問(wèn)題不要慌檢查mods-enabled里是否有對(duì)應(yīng)符號(hào)鏈接有就去掉apache2.conf里手動(dòng)加的那行。5. 逼近實(shí)戰(zhàn)虛擬主機(jī)配置、日志位置和權(quán)限問(wèn)題的常見(jiàn)坑5.1 用sites-available新建站點(diǎn)而不是直接改默認(rèn)配置默認(rèn)的000-default.conf內(nèi)容很簡(jiǎn)單但新手最常見(jiàn)的錯(cuò)誤就是直接在里面堆一堆配置然后發(fā)現(xiàn)以后想換站點(diǎn)結(jié)構(gòu)時(shí)無(wú)處下手。更好的做法是每個(gè)站點(diǎn)一個(gè)獨(dú)立配置文件放在sites-available里。假設(shè)我要為一個(gè)新業(yè)務(wù)建站點(diǎn)域名為example.local文檔目錄為/var/www/example.local/public_htmlsudo mkdir -p /var/www/example.local/public_html sudo tee /etc/apache2/sites-available/example.local.conf EOF VirtualHost *:80 ServerName example.local ServerAdmin webmasterexample.local DocumentRoot /var/www/example.local/public_html ErrorLog ${APACHE_LOG_DIR}/example.local_error.log CustomLog ${APACHE_LOG_DIR}/example.local_access.log combined Directory /var/www/example.local/public_html Options FollowSymLinks AllowOverride All Require all granted /Directory /VirtualHost EOF然后執(zhí)行啟用和重載sudo a2dissite 000-default.conf sudo a2ensite example.local.conf sudo systemctl reload apache2a2dissite同理本質(zhì)是移除sites-enabled里的符號(hào)鏈接。systemctl reload不是restart在讀配置后重新加載不會(huì)中斷現(xiàn)有連接生產(chǎn)環(huán)境推薦。如果你修改了端口或MPM這種需要重新初始化進(jìn)程的參數(shù)才需要restart。5.2 日志與權(quán)限改DocumentRoot之后最常見(jiàn)的403錯(cuò)誤虛擬主機(jī)配置好之后最常出問(wèn)題的不是語(yǔ)法而是權(quán)限。Apache2.4開(kāi)始默認(rèn)對(duì)目錄訪(fǎng)問(wèn)控制更嚴(yán)格了常見(jiàn)的403錯(cuò)誤有好幾個(gè)來(lái)源文檔根目錄本身沒(méi)有x權(quán)限給其他用戶(hù)比如/var/www/example.local權(quán)限是700但Apache的worker進(jìn)程以www-data用戶(hù)運(yùn)行無(wú)法進(jìn)入目錄。目錄下沒(méi)有索引文件且目錄瀏覽未開(kāi)啟。雖然403在缺少index.html時(shí)常見(jiàn)但你如果確實(shí)沒(méi)有DirectoryIndex匹配的文件Apache會(huì)嘗試目錄列表只有Options Indexes開(kāi)啟時(shí)才允許展示否則返回403。配置里的Require all granted缺失或?qū)戝e(cuò)。Apache2.4生效的是Require語(yǔ)法傳統(tǒng)的Allow from all在2.4上默認(rèn)不生效。排查時(shí)的最快方法是看錯(cuò)誤日志sudo tail -f /var/log/apache2/error.log日志里會(huì)有明確提示比如[client 192.168.1.1] AH00035: access to / denied (filesystem path /var/www/example.local/public_html) because search permissions are missing on a component of the path。這句話(huà)的意思是路徑鏈條中某一層目錄缺少x執(zhí)行/進(jìn)入權(quán)限。解決方案通常是sudo chown -R www-data:www-data /var/www/example.local/public_html sudo chmod -R 755 /var/www/example.local順便說(shuō)一下/var/log/apache2/下默認(rèn)會(huì)有access.log和error.log如果你的虛擬主機(jī)沒(méi)有單獨(dú)指定日志文件所有站點(diǎn)的請(qǐng)求都會(huì)進(jìn)默認(rèn)access.log。多站點(diǎn)生產(chǎn)環(huán)境建議一定要在每個(gè)站點(diǎn)里單獨(dú)指定日志文件否則排查問(wèn)題時(shí)根本分不清流量進(jìn)的是哪個(gè)站。另外提醒一個(gè)Ubuntu特別容易遇到的坑如果你把DocumentRoot指向了/home/某用戶(hù)/www這種位置Apache的www-data用戶(hù)要跨目錄訪(fǎng)問(wèn)用戶(hù)主目錄就必須確保從根目錄到目標(biāo)目錄之間的每一層目錄都有至少ox權(quán)限。但為了安全/home/用戶(hù)本身通常權(quán)限是755或更嚴(yán)格這就是頻繁出現(xiàn)403的原因。不要為了解決問(wèn)題直接把整個(gè)home目錄權(quán)限放開(kāi)那等于把shell賬號(hào)的可讀范圍暴露給了Web進(jìn)程。6. 這套安裝流程在系列教程里的承上啟下下一步還能做什么6.1 裝完Apache之后LAMP鏈路還差PHP和數(shù)據(jù)庫(kù)這個(gè)系列既然叫Apache安裝而非Web服務(wù)器配置那重點(diǎn)就是先讓Apache跑起來(lái)跑得穩(wěn)。但實(shí)際部署項(xiàng)目幾乎沒(méi)有人只裝一個(gè)Apache。接下來(lái)順理成章的步驟是裝PHP和數(shù)據(jù)庫(kù)Ubuntu 18上要注意PHP版本的默認(rèn)源問(wèn)題。Ubuntu 18.04默認(rèn)PHP版本是7.2如果你需要PHP 7.4或更高通常要添加第三方源。而安裝PHP時(shí)Apache的模塊配置又會(huì)自動(dòng)切換MPM我之前在第2.2節(jié)提到過(guò)這里再?gòu)?qiáng)調(diào)一次安裝libapache2-mod-php7.2時(shí)包管理器會(huì)禁用php相關(guān)模塊以外的mpm_event并啟用mpm_prefork這是兼容性設(shè)計(jì)不是錯(cuò)誤。看到systemctl status apache2里有mpm_prefork別吃驚。數(shù)據(jù)庫(kù)方面推薦選擇MariaDB或者M(jìn)ySQLUbuntu 18源里默認(rèn)提供的是MySQL 5.7若添加了官方源才換和MariaDB 10.1。裝完MySQL后Apache和PHP通過(guò)mysqli或PDO擴(kuò)展連接數(shù)據(jù)庫(kù)這時(shí)候要注意連接地址別寫(xiě)錯(cuò)成localhost導(dǎo)致socket連接失敗有時(shí)需要明確寫(xiě)127.0.0.1:3306使用TCP連接。6.2 如何用一次重建實(shí)踐來(lái)驗(yàn)證今天這套安裝步驟最有效的驗(yàn)證方式不是打開(kāi)瀏覽器看到It works頁(yè)面而是故意破壞一次再修復(fù)。我建議你按下面的順序做一輪破壞性練習(xí)把/etc/apache2/sites-available/000-default.conf里的DocumentRoot改成一個(gè)不存在的路徑執(zhí)行systemctl reload apache2看看瀏覽器返回什么錯(cuò)誤。執(zhí)行a2dismod rewrite然后訪(fǎng)問(wèn)一個(gè)依賴(lài)重寫(xiě)規(guī)則的應(yīng)用觀(guān)察500或404表現(xiàn)。把/var/www/html權(quán)限改成700觀(guān)察403的出現(xiàn)和消失。這三步做完你對(duì)Apache的配置加載機(jī)制和權(quán)限模型的理解會(huì)比干看十篇教程都深。我在培訓(xùn)某項(xiàng)目組新人的時(shí)候就經(jīng)常用這套練習(xí)效果比反復(fù)抄命令好太多。每做完一步記得用journalctl -u apache2 -e看日志輸出日志會(huì)告訴你Apache眼中的世界是什么樣的。6.3 本系列后續(xù)篇目的擴(kuò)展方向SSL與性能調(diào)優(yōu)既然Apache已經(jīng)能穩(wěn)定運(yùn)行下一篇很自然的主題就是TLS/SSL證書(shū)配置。Ubuntu 18上加證書(shū)有兩種路徑一是直接用a2enmod ssl和a2ensite default-ssl啟用默認(rèn)SSL站點(diǎn)用自己的自簽名證書(shū)先測(cè)通二是通過(guò)Lets Encrypt的客戶(hù)端工具自動(dòng)簽發(fā)證書(shū)后者需要保證域名解析和80端口可訪(fǎng)問(wèn)性沒(méi)問(wèn)題。性能調(diào)優(yōu)方面我會(huì)重點(diǎn)關(guān)注這幾項(xiàng)MPM調(diào)優(yōu)確認(rèn)當(dāng)前MPM模式apache2ctl -M可以列出現(xiàn)加載模塊apache2ctl -V可以看編譯時(shí)的MPM默認(rèn)值。event模式下MaxRequestWorkers要結(jié)合機(jī)器內(nèi)存來(lái)算理論上每個(gè)請(qǐng)求線(xiàn)程大約占用數(shù)MB到幾十MB內(nèi)存。啟用的模塊精簡(jiǎn)默認(rèn)a2enmod并沒(méi)有把所有模塊都啟用但很多歷史配置會(huì)殘留用不到的模塊比如status、info這類(lèi)信息泄漏風(fēng)險(xiǎn)模塊能禁用就禁用。HTTP/2Apache 2.4.29已經(jīng)支持mod_http2Ubuntu 18也提供了這個(gè)模塊。啟用后配合SSL站點(diǎn)在HTTPS下能看到明顯的性能提升。這些內(nèi)容如果展開(kāi)又是一個(gè)萬(wàn)字長(zhǎng)文正好留作這個(gè)系列的下一期。你現(xiàn)在不需要急著把所有優(yōu)化做完先把Apache的安裝、起停、站點(diǎn)建立、日志定位這四個(gè)動(dòng)作做到條件反射的程度后面一切都會(huì)順很多。