1. 程式人生 > 其它 >LAMP和LNMP環境搭建的艱辛歷程

LAMP和LNMP環境搭建的艱辛歷程

目錄

作業系統:Ubuntu 20.10

1. LAMP環境的搭建

在圖形管理化介面中依次開啟系統設定、軟體和更新。在下載自重選擇其他站點,然後在中國的條目下選擇mirrors.ustc.edu.cn。

Ubuntu換源可參考https://mirrors.ustc.edu.cn/help/ubuntu.html

更新資源包:sudo apt update

更新軟體:sudo apt upgrade

清除不需要的軟體:sudo apt autoremove

清除不需要的檔案:sudo apt autoclean

1. Apache

接下來就可以進入正式搭建了

su root //方便之後更快的操作,切換root使用者

apt install apache2

預設的配置檔案:/etc/apache2/sites-enabled/000-default.conf

預設網站根目錄:/var/www/html

安裝完成之後檢查apache是否開啟:

service apache2 status // 檢視apache是否開啟

service apache2 stop // 關閉apache服務

service apache2 start // 開啟apache服務

service apache2 restart //重啟apache服務

也可以檢視80埠是否開啟

安裝apache遇到的問題

安裝過程中發現apache啟動不了,使用

systemctl status apache2 檢視apache服務的狀態

查閱資料和翻譯英語得知是80埠被佔用所以開啟不了apache服務

netstat -ntulp|grep 80 // 檢視80埠

這我才發現是因為之前搭建靶場時docker容器佔用了80埠,只要把容器停止就好了

2. mysql

apt install mysql-server

mysql的配置檔案: /etc/mysql/mysql.conf.d/mysqld.cnf

登入mysql的方法

  1. cat /etc/mysql/debian.cnf檢視預設使用者的密碼

mysql -u debian-sys-maint -p

可以在authentication_string欄位中為root新增密碼:

update mysql.user set authentication_string='passwd' where user=’root’;

  1. 執行mysql_secure_installation命令

根據提示進行操作即可

3. PHP

apt install php7.4

測試php是否安裝成功

安裝php元件:

apt install apt install php-curlphp.cgi php-json

php-curl:curl是一個庫,能讓你通過URL和許多不同種的伺服器進行勾搭、搭訕和深入交流,並且還支援許多協議。並且人家還說了curl可以支援https認證、http post、ftp上傳、代理、cookies、簡單口令認證等等功能啦。

php.cgi: cgi是 (common gateway interface)通用閘道器介面 .php-cgi是php提供給web serve也就是http前端伺服器的cgi協議介面程式,當每次接到http前端伺服器的請求都會開啟一個php-cgi程序進行處理。

php-json: json 序列化相關操作

安裝php擴充套件:

apt install php-pear libapache2-mod-php php-mysql

php-pear: Pear 是“PHP Extension and Application Repository”的縮寫,即PHP擴充套件和應用倉庫。Pear 將PHP程式開發過程中常用的功能編寫成類庫,涵蓋了頁面呈現、資料庫訪問、檔案操作、資料結構、快取操作、網路協議、WebService 等許多方面,使用者可以通過下載這些類庫並適當的作一些定製以實現自己需要的功能。避免重複發明“車輪”。Pear 的出現大大提高了PHP 程式的開發效率和開發質量。

libapache2-mod-php:我猜測應該是對apache php解析的一個增強

php-mysql: 關於php對資料庫操作的函式

2. Lnmp環境的搭建

1. nginx

停止apache服務 service apache2 stop

安裝nginx apt install nginx

2. PHP

apt install php7.4-fpm

vim /etc/nginx/sites-available/default

在56行做如下修改

service nginx restart // 重啟服務即可

或者還可以這樣

然後這樣

vim /etc/php/7.4/fpm/pool.d/www.conf

在37行加入下面這句話

service php7.4-fpm restart //重啟服務即可

3. 配置PHP環境中出現的一些問題

PHP執行目前為止主要的三種方式:

  1. 以模組載入的方式執行——將PHP整合到Apache伺服器,以同一個程序執行。
  2. 以CGI的方式執行——Apache在遇到PHP指令碼的時候會將PHP程式提交給CGI應用程式(php-cgi.exe)解釋,解釋之後的結果返回給Apache,最後再返回給相應的請求使用者。
  3. 以FastCGI的方式執行——CGI的加強版本,CGI是單程序,多執行緒的執行方式,程式執行完成之後就會銷燬,所以每次都需要載入配置和環境變數fork-and-execute(建立-執行)。而FastCGI則不同,FastCGI像是一個常駐 (long-live) 型的CGI,只要啟用後,在web伺服器啟動時就開啟了一個程序,它可以一直執行著,不會每次都要花費時間去fork一個程序(CGI最為人詬病的fork-and-execute模式)。

1. CGI

CGI(Common Gateway Interface)公共閘道器介面是HTTP伺服器與機器上的程式進行“交談”的一種工具,其程式須執行在網路伺服器上。CGI可以用任何一種語言編寫,只要這種語言具有標準輸入、輸出和環境變數。

工作原理:CGI程式根據請求提交的引數作相應處理,然後輸出標準的html語句返回給web server,web server再返回給客戶端。

簡單的說:cgi就是專門用來和web 伺服器打交道的。web伺服器收到使用者請求,就會把請求提交給cgi程式(php的fastcgi),cgi程式根據請求提交的引數作應處理(解析php),然後輸出標準的html語句返回給web服伺服器,再返回給客戶端,這就是普通cgi的工作原理。

2. FastCGI

FastCGI像是一個常駐(long-live)型的CGI,它可以一直執行著,只要啟用後,不會每次都要花費時間去fork一次(這是CGI最為人詬病的fork-and-execute 模式)。它還支援分散式的運算, 即 FastCGI 程式可以在網站伺服器以外的主機上執行並且接受來自其它網站伺服器來的請求。

傳統的cgi協議在每次連線請求時,會開啟一個程序進行處理,處理完畢會關閉該程序,因此下次連線,又要再次開啟一個程序進行處理,因此有多少個連線就有多少個cgi程序,這也就是為什麼傳統的cgi會顯得緩慢的原因,因此過多的程序會消耗資源和記憶體。而fast-cgi則是一個程序可以處理多個請求(這裡的意思不是說一個程序可以同時處理多個請求,二十因為fastcgi是常駐cgi,不需要花費時間去fork程序),和上面的cgi協議完全不一樣,cgi是一個程序只能處理一個請求,這樣就會導致大量的cgi程式,因此會給伺服器帶來負擔。

FastCGI是語言無關的、可伸縮架構的CGI開放擴充套件,其主要行為是將CGI直譯器程序保持在記憶體中並因此獲得較高的效能。眾所周知,CGI直譯器的反覆載入是CGI效能低下的主要原因,如果CGI直譯器保持在記憶體中並接受FastCGI程序管理器排程,則可以提供良好的效能、伸縮性、Fail- Over特性等等。

工作原理

  1. Web Server啟動時載入FastCGI程序管理器(IIS ISAPI或Apache Module)
  2. FastCGI程序管理器自身初始化,啟動多個CGI直譯器程序(在工作管理員中可見多個php-cgi.exe)並等待來自WebServer的連線,FastCGI使用tcp方式通訊。
  3. 當客戶端請求到達Web Server時,FastCGI程序管理器選擇並連線到一個CGI直譯器。WebServer將CGI環境變數和標準輸入傳送到FastCGI子程序php-cgi。
  4. FastCGI子程序完成處理後將標準輸出和錯誤資訊從同一連線返回WebServer。當FastCGI子程序關閉連線時,請求便告處理完成。FastCGI子程序接著等待並處理來自FastCGI程序管理器(執行WebServer中)的下一個連線。 在CGI模式中,php-cgi在此便退出了。

3. php-cgi

php-cgi是php提供給web serve也就是http前端伺服器的cgi協議介面程式,當每次接到http前端伺服器的請求都會開啟一個php-cgi程序進行處理,而且開啟的php-cgi的過程中會先要過載配置,資料結構以及初始化執行環境,如果更新了php配置,那麼就需要重啟php-cgi才能生效,這也是php-cgi的不足之處。

這裡需要注意的是:php-cgi不是php指令碼的解析器,它是cgi協議的解析器,然後通過呼叫php的php_execute_script函式來解析和執行php指令碼。

3. php-fpm

php-fpm是php提供給web serve也就是http前端伺服器的fastcgi協議介面程式,它不會像php-cgi一樣每次連線都會重新開啟一個程序,處理完請求又關閉這個程序,而是允許一個程序對多個連線進行處理,而不會立即關閉這個程序,而是會接著處理下一個連線。它可以說是php-cgi的一個管理程式,是對php-cgi的改進。

換句話說:php-fpm其實是升級版的php-cgi,但是最後處理的單元仍然是一個php-cgi程式,php-fpm可以更好的去排程資源來實現fastcgi協議。

重點PS:在剛才配置lnmp過程中,我們安裝了php-fpm包,在配置lamp過程中並沒有安裝,這是為什麼呢?

答:apache使用的是一種名為mod_php模式去解析php的,即mod_php 模式是將php模組安裝到apache中,apache每接收一個請求,都會產生一個程序來連線php-cgi來完成請求,可想而知,如果一旦使用者過多,併發數過多,伺服器就會承受不住了。

而Nginx只負責反向代理/請求轉發,不負責管理php-cgi程序,所以Nginx一般配合能夠自行管理工作程序(子程序)的php-fpm使用。Nginx不能像Apache那樣直接執行外部可執行程式,但Nginx可以作為代理伺服器,將請求轉發給後端伺服器,這也是Nginx的主要作用之一。

4. Spawn-FCGI

Spawn-FCGI是一個通用的FastCGI管理伺服器,它是lighttpd中的一部份,很多人都用Lighttpd的Spawn-FCGI進行FastCGI模式下的管理工作,不過有不少缺點。Spawn-FCGI目前已經獨成為一個專案,更加穩定一些,也給很多Web 站點的配置帶來便利。已經有不少站點將它與nginx搭配來解決動態網頁。

總結

  1. CGI和FastCGI嚴格意義上來說是協議,CGI程序和FastCGI程序就是具有該協議特性的程序。
  2. php-cgi和php-fpm都是協議介面程式,用來管理採用不同協議的php-cgi程式,前者管理cgi程序,後者管理fastcgi程序。
  3. spawn-fcgi和php-fpm作用相同,都是fastcgi程序管理器。