等等,我到底該怎麼Run個Server?

影山小麥機
9 min readMar 1, 2023

來聊聊PHP初心者的首戰

Picture by Midjourney

前言

我剛開始的時候碰Laravel run個 server時,以為我就只需要:

php artisan serve

一切就完事,不過顯然不是如此。

通常我們在擁有Laravel的PHP專案中,只要在終端機下了上面這個指令,我們確實會讓server跑起來沒錯,但到底是哪個server呢?或許我們需要先理解 php artisan serve這個指令背後的意義。

1. Server

為什麼需要伺服器?或許用這個問題去切入會是一個好選擇。

網站通常需要伺服器去接收和處理用戶端請求的相關工作,這些就是伺服器存在的意義,也許是將網頁、圖片、音樂、影片等資料存起來後,透過網際網路與用戶端進行通信,為用戶端提供資料。

所以綜合上述所提到的內容,你可以說伺服器的主要功能大概如下:

  1. 儲存資料:伺服器可以儲存網站所需的所有資料,例如網頁、圖片、音樂、視頻等。
  2. 處理請求:當用戶端請求網站時,伺服器可以根據用戶端的請求,從儲存的資料中找到所需的內容,然後通過網際網路將該內容傳送給用戶端。
  3. 管理資料庫:伺服器可以管理網站的資料庫,包括儲存和維護用戶帳戶、訂單、產品信息等數據。
  4. 安全保護:伺服器可以提供安全保護措施,例如設置防火牆、加密通訊等,以確保網站的安全性和用戶隱私的保護。

伺服器是網站運行的核心,可以讓網站提供穩定、高效的服務,確保網站的運行安全。

2. 什麼是php artisan serve?

其實可以說是PHP內部自己有一個輕量級的內置Web伺服器,它可以提供一個基本的HTTP服務,通常這個伺服器可以用來開發與測試,所以在輸入php artisan serve這個指令後,我們就會啟動這個輕量級的Web伺服器,但它的功能性與可擴展性相對之下就比較小,假如我們在具有生產力的情況之下,需要使用伺服器,這邊會更建議使用其他的Server,比如像是Apache、Nginx。

所以,並不是說這個指令所run出來的Server不好,而是在開發情境下,如果有更大的需求,就應該使用其他類型的Server去做這些事情。那大抵上,如果我創建一個PHP的Repository,我自己也實際的去用php artisan serve指令去run 一個server,那麼我應該就會清楚自己現在正在做的事情是使用PHP內建的Server。

3. 其他Server:Apache與Nginx

那假如我今天改用Apache或Nginx去run Server,我怎麼知道這時候應該用誰呢?其實有蠻多資源討論這一塊,我想我們這邊也可以實際的去整理在Reference中提到的比較與內容。就以兩種種類的Server來說:

Apache是一個多線程的伺服器:

多線程的意義可以這樣比喻:

一個餐廳裡面有很多桌子,而一個服務生就是只會針對一張桌子進行服務,也就是說一個線程就是一個服務生。這就是多線程的概念。

Nginx是事件驅動的伺服器:

事件驅動的意義可以這樣比喻:

一個餐廳裡面有不知道多少客人,但只有一個服務員,只要客人舉手,那服務生就會去到舉手的客人那裡,去為這位客人進行服務。也就是說,舉手就是一個事件。這就是事件驅動的概念。

到底哪一種好呢?其實是看我們在使用伺服器的情境,那我們也在下面稍微比較一下兩者的優缺點:

Apache:

優點:可以同時處理多個連線請求,每個進程獨立運行,互不干擾。

缺點:進程創建和銷毀需要耗費系統資源,需要較多的記憶體和處理器資源。

Nginx:

優點:可以高效地處理大量連線請求,只需要單一進程處理,不需要創建多個進程,節省系統資源。

缺點:對於某些較複雜的應用場景,需要使用特殊的編程方式來處理事件。

那在應用情境下,Apache可能會比較會比較適合哪種類型的網站呢?也許像是銀行或電子商務網站,如果根據下列的特性來整理,或許會是一個好的性質去了解:

  1. 穩定性和可靠性:Apache具有較長的歷史和更多的測試和驗證,因此更穩定和可靠。對於需要高度可靠性的企業網站,這是非常重要的因素。
  2. 安全性:Apache通常比Nginx更容易設置和管理安全性。它提供了更多的模組和選項,可讓開發人員定制和強化安全性。對於銀行和電子商務網站等需要處理敏感資訊的網站,這是一個非常重要的考慮因素。
  3. 靈活性和可擴展性:Apache提供了豐富的模組和選項,可以讓開發人員輕鬆地擴展和自定義Web Server。這對於需要滿足複雜需求的企業網站來說是非常重要的。

Nginx呢?也許是社交網站、大型內容管理系統等網站。但支持的理由是什麼,也許下面的性質可以提供一些思考脈絡:

  1. 高效處理大量請求:Nginx通常比Apache更高效,因為它具有較低的記憶體占用量和更高的效能。對於需要處理大量請求的網站來說,這是非常重要的。
  2. 內置反向代理和負載均衡功能:Nginx提供內置的反向代理和負載均衡功能,可以更有效地處理大量的請求。對於需要處理多個服務器的網站來說,這是非常重要的。

綜合上述的分析,在選擇Web Server上,或許對於server性質的了解,可以讓後端工作在基本的選擇性上有更大的理解空間。

4. Run WebServer by Apache or Nginx

那我應該怎麼使用Apache與Nginx作為我的環境呢?

這邊有一個還不錯的開發工具:MAMP

它是以MacOS、Apache、MySQL及PHP的縮寫所組成的,這個開發工具可以讓你簡單的就能使用Apache以及Nginx作為WebServer來使用,接下來我們就來看一下在MAMP上要怎麼Run Server。

如果你是一個已經會用php artisan serve指令去run php內建server的人,你應該知道我今天要跑這個serve需要跟它相關的程式碼。

這個時候,我就需要這個資料夾的目錄,所以正如上圖,我們需要針對Document root進行設定,將路徑位址改為上面這樣。

那怎麼改呢?當然不是在這個GUI介面進行點擊,我們需要點擊左上角的Preference,進到設定頁面:

這個時候就可以藉由選擇路徑去選擇我們要由MAMP來實作的專案,選擇好之後,我們如果在port號目前都沒有其他更動的設定之下,就可以實際來運作一個server了,可以回到原先的GUI介面,確認完你是用哪個Web Server,這邊的預設是Apache,所以我們就可以點選右上角的start,開始run server。
正常的情況下,按了start就會run一個server了:

我們可以看到localhost:8888的原始Port號設定。

在這邊如果要用Nginx來實作的話,我們這邊可以把環境改為Nginx,然後也是以同樣的步驟去完成這些事情。

OK,那我們接下來會進到下一個環節的提問,我知道GUI介面是告訴我現在我是用哪個環境來run server,但是我並不知道到底有沒有run對,那我應該怎麼樣的確認我現在的測試是在Apache或是在Nginx的WebServer上呢?

5. 我怎麼確定我run的web server是Apache還是Nginx?

我想這次我這邊就用terminal來確認這件事情。

我們先來確認Apache是否正在運行中,輸入下面的指令:

sudo apachectl -t

如果在配置上沒什麼問題的話,應該會得到:「Syntax OK」

Syntax OK

那上面那個指令其實是Apache Http Server的測試命令,主要用於檢查Apache的設定文件是否有語法上的問題。

-t參數告訴Apache只要語法錯誤,不要實際的啟動Apache,並顯示設定文件中的任何錯誤或警告。

那假若自己現在需要看現在Apache載入的模組,可以下:

sudo apachectl -t -D DUMP_MODULES

你應該就會看到一堆Apache的模組:

那上面那個指令也可以稍微解釋一下:

-t :用來檢查 Apache 的配置文件,可以確定配置是否正確並且不會出錯。

-D DUMP_MODULES :用來顯示已載入的 Apache 模組列表,包括核心模組和第三方模組。

不過我覺得最直觀確認現在是run Apache或是Nginx的,可用下面這個指令:

sudo lsof -i :8888

那你就會得到上面這串資訊,這可以證明我現在就是用Apache來run server,但有個問題是,為什麼是httpd呢?

這是因為 httpd 是 Apache HTTP Server 的服務名稱,不過假若我今天run Nginx的話就不一樣了,我們也一樣用:

sudo lsof -i :8888

指令下完之後,就會產生上面的這串資訊。我們可以清楚地知道這個服務名稱是來自Nginx

那你可能會問下面這串指令的意思是什麼:

sudo lsof -i :8888

sudo的意思是表示需要管理員權限執行這個指令。

lsof的意思是 list open files的縮寫,可以列出在系統中被開啟的文件和進程。

-i 8888則是列出在8888 port的進程。

不過今天先不解釋這些資訊蘊含著怎麼樣的意義,也許往後會更深的切入這些訊息的意義。

後記:原來如此

最近在試很多東西,從iOS開發者跳轉試試後端開發後,大概要適應的點蠻多的:

  1. 以前都會罵Xcode很大很肥,但是它其實幫我們做了很多的事情。所以其實身為開發者抱怨一些有的沒的,也許也沒什麼,至少蘋果做了很多我們看不到的事情了。
  2. 看不見的東西魔鬼很多,大部分的時候是不知道為什麼會這樣,也許環境設錯,就會錯很多。
  3. 與其說準備好走後端,更重要的是,我要怎麼知道接下來在學習後端知識時我往這個方向找的資料是對的。

Free

Distraction-free reading. No ads.

Organize your knowledge with lists and highlights.

Tell your story. Find your audience.

Membership

Read member-only stories

Support writers you read most

Earn money for your writing

Listen to audio narrations

Read offline with the Medium app

影山小麥機
影山小麥機

Written by 影山小麥機

本職為Mobile工程師,熱愛分享視野,也樂意站在ChatGPT的肩膀上。訂閱小麥機,收割技術、職涯、人生的難題。

Responses (1)

Write a response