vocus logo

方格子 vocus

《Elixir 101》快速架設 HTTP 伺服器

更新 發佈閱讀 9 分鐘
raw-image
在 Elixir 裡要怎麼架設 HTTP 伺服器呢?

在 NodeJS 架設 HTTP 伺服器

如果是在 NodeJS 底下,我們可以很快透過以下的程式碼建立簡單的伺服器:

const http = require('http');

function serverHandler(req, res){
switch (req.url){
case '/':{
res.writeHead(200, {'Content-Type':'text/html'});
res.write('Hello world');
res.end();
break;
}

default:{
res.writeHead(404, {'Content-Type':'text/html'});
res.end('Not found');
break;
}
}
}

const server = http.createServer(serverHandler);
server.listen(3001);

但通常我們在 NodeJS 裡面不會這樣直接呼叫 http.createServer 來建立伺服器,我們會利用一些 Web 框架來幫助我們,讓開發上更加便利,例如 express,例如上述程式碼可以改成:

const server = require('express')();

server.get('/', function (req, res) {
res.send('Hello World')
});

server.listen(3000);

在 Elixir 中架設伺服器

所以一樣的,在 Elixir 中,我們透過一套名為 plug 的中間層套件,協助我們架設伺服器。

首先我們先建立一個乾淨的專案,並且啟用 supervision 模式:

$ mix new http_server --sup

讓我們看一下資料夾結構:

.
├── README.md
├── lib
│ ├── http_server
│ │ └── application.ex
│ └── http_server.ex
├── mix.exs
└── test
├── http_server_test.exs
└── test_helper.exs

安裝 plug

首先我們需要先安裝 plug。在 Elixir 安裝套件很簡單。

先讓我們打開資料夾中的 mix.exs 檔案,他內容會長這樣:

defmodule HttpServer.MixProject do
use Mix.Project

def project do
[
app: :http_server,
version: "0.1.0",
elixir: "~> 1.9",
start_permanent: Mix.env() == :prod,
deps: deps()
]
end

# Run "mix help compile.app" to learn about applications.
def application do
[
extra_applications: [:logger],
mod: {HttpServer.Application, []}
]
end

# Run "mix help deps" to learn about dependencies.
defp deps do
[
# {:dep_from_hexpm, "~> 0.3.0"},
# {:dep_from_git, git: "https://github.com/elixir-lang/my_dep.git", tag: "0.1.0"}
]
end
end

然後讓我們看到 defp deps do 這段函式區塊:

# Run "mix help deps" to learn about dependencies.
defp deps do
[
# {:dep_from_hexpm, "~> 0.3.0"},
# {:dep_from_git, git: "https://github.com/elixir-lang/my_dep.git", tag: "0.1.0"}
]
end

我們在他的 [] 的陣列裡加入 {:plug_cowboy, "~> 2.0"},這時候應該會長這個樣子:

# Run "mix help deps" to learn about dependencies.
defp deps do
[
{:plug_cowboy, "~> 2.0"}
]
end

首頁顯示 Hello World

安裝完後,我們在 lib 資料夾底下,建立一個檔案名為 router.ex,然後裡面寫入:

defmodule Router do
import Plug.Conn

def init(options) do
options
end

def call(conn, _opts) do
conn
|> put_resp_content_type("text/plain")
|> send_resp(200, "Hello world")
end
end

讓伺服器隨同程式上線

再來,我們必須讓伺服器隨著程式啟用時上線。所以我們要來更改 lib/http_server/application.ex 檔案。他應該會長這樣:

defmodule HttpServer.Application do
# See https://hexdocs.pm/elixir/Application.html
# for more information on OTP Applications
@moduledoc false

use Application

def start(_type, _args) do
children = [
# Starts a worker by calling: HttpServer.Worker.start_link(arg)
# {HttpServer.Worker, arg}
]

# See https://hexdocs.pm/elixir/Supervisor.html
# for other strategies and supported options
opts = [strategy: :one_for_one, name: HttpServer.Supervisor]
Supervisor.start_link(children, opts)
end
end

我們在 start 函式中的 children 陣列加入一行:

{Plug.Cowboy, scheme: :http, plug: Router, options: [port: 4001]}

他就變成:

children = [
{Plug.Cowboy, scheme: :http, plug: Router, options: [port: 4001]}
]

執行程式

程式碼都修改好後,我們在終端機打上:

$ mix run --no-halt

如果沒有東西話記得先切到 http_server 底下:

$ cd http_server

最後打開瀏覽器,輸入 http://localhost:4001,就大功告成啦!


raw-image

參考文獻

  • https://github.com/elixir-plug/plug
  • https://elixirschool.com/zh-hant/lessons/specifics/plug/
留言
avatar-img
工法人的沙龍
1會員
5內容數
身為一個軟體工程師,在現今如此快速變化的世界中,該如何確保自生不被滅亡呢?
你可能也想看
Thumbnail
賽勒布倫尼科夫以流亡處境回望蘇聯電影導演帕拉贊諾夫的舞台作品,以十段寓言式殘篇,重新拼貼記憶、暴力與美學,並將審查、政治犯、戰爭陰影與「形式即政治」的劇場傳統推到台前。本文聚焦於《傳奇:帕拉贊諾夫的十段殘篇》的舞台美術、音樂與多重扮演策略,嘗試解析極權底下不可言說之事,將如何成為可被觀看的公共發聲。
Thumbnail
賽勒布倫尼科夫以流亡處境回望蘇聯電影導演帕拉贊諾夫的舞台作品,以十段寓言式殘篇,重新拼貼記憶、暴力與美學,並將審查、政治犯、戰爭陰影與「形式即政治」的劇場傳統推到台前。本文聚焦於《傳奇:帕拉贊諾夫的十段殘篇》的舞台美術、音樂與多重扮演策略,嘗試解析極權底下不可言說之事,將如何成為可被觀看的公共發聲。
Thumbnail
柏林劇團在 2026 北藝嚴選,再次帶來由布萊希特改編的經典劇目《三便士歌劇》(The Threepenny Opera),導演巴里・柯斯基以舞台結構與舞台調度,重新向「疏離」進行提問。本文將從觀眾慾望作為戲劇內核,藉由沉浸與疏離的辯證,解析此作如何再次照見觀眾自身的位置。
Thumbnail
柏林劇團在 2026 北藝嚴選,再次帶來由布萊希特改編的經典劇目《三便士歌劇》(The Threepenny Opera),導演巴里・柯斯基以舞台結構與舞台調度,重新向「疏離」進行提問。本文將從觀眾慾望作為戲劇內核,藉由沉浸與疏離的辯證,解析此作如何再次照見觀眾自身的位置。
Thumbnail
本文深入解析臺灣劇團「晃晃跨幅町」對易卜生經典劇作《海妲.蓋柏樂》的詮釋,從劇本歷史、聲響與舞臺設計,到演員的主體創作方法,探討此版本如何讓經典劇作在當代劇場語境下煥發新生,滿足現代觀眾的觀看慾望。
Thumbnail
本文深入解析臺灣劇團「晃晃跨幅町」對易卜生經典劇作《海妲.蓋柏樂》的詮釋,從劇本歷史、聲響與舞臺設計,到演員的主體創作方法,探討此版本如何讓經典劇作在當代劇場語境下煥發新生,滿足現代觀眾的觀看慾望。
Thumbnail
《轉轉生》為奈及利亞編舞家庫德斯.奧尼奎庫與 Q 舞團創作的當代舞蹈作品,融合舞蹈、音樂、時尚和視覺藝術,透過身體、服裝與群舞結構,回應殖民歷史、城市經驗與祖靈記憶的交錯。本文將從服裝設計、身體語彙與「輪迴」的「誕生—死亡—重生」結構出發,分析《轉轉生》如何以當代目光,形塑去殖民視角的奈及利亞歷史。
Thumbnail
《轉轉生》為奈及利亞編舞家庫德斯.奧尼奎庫與 Q 舞團創作的當代舞蹈作品,融合舞蹈、音樂、時尚和視覺藝術,透過身體、服裝與群舞結構,回應殖民歷史、城市經驗與祖靈記憶的交錯。本文將從服裝設計、身體語彙與「輪迴」的「誕生—死亡—重生」結構出發,分析《轉轉生》如何以當代目光,形塑去殖民視角的奈及利亞歷史。
Thumbnail
在這篇教學文章中,我們將展示如何使用 Node.js 建立一個簡單的伺服器,並解決常見的跨來源資源共享(CORS)問題,確保伺服器能夠接收並處理來自不同來源的資料。
Thumbnail
在這篇教學文章中,我們將展示如何使用 Node.js 建立一個簡單的伺服器,並解決常見的跨來源資源共享(CORS)問題,確保伺服器能夠接收並處理來自不同來源的資料。
Thumbnail
這篇想來寫,剛碰到js得時候,為了讓程式可以運作而安裝Node.js 。Node.js 是能夠在伺服器上面運行 JavaScript 的應用平台環境,透過 Node.js 提供的函式庫與執行環境能完成伺服器端服務。此篇幅就直接從純後端的角度切入摟(對不起拉我寫來寫去還是不知道怎麼順順的寫好文章開頭Q
Thumbnail
這篇想來寫,剛碰到js得時候,為了讓程式可以運作而安裝Node.js 。Node.js 是能夠在伺服器上面運行 JavaScript 的應用平台環境,透過 Node.js 提供的函式庫與執行環境能完成伺服器端服務。此篇幅就直接從純後端的角度切入摟(對不起拉我寫來寫去還是不知道怎麼順順的寫好文章開頭Q
Thumbnail
簡介如何使用 NGROK 來協助開發與測試
Thumbnail
簡介如何使用 NGROK 來協助開發與測試
Thumbnail
身為一個非本科新手工程師,對於網路知識還是有許多疑惑之處,像是我在編輯器上寫了數十行的程式碼,那它們是怎麼透過終端機的指令被運行起來,讓我可以一邊開發一邊預覽結果呢?
Thumbnail
身為一個非本科新手工程師,對於網路知識還是有許多疑惑之處,像是我在編輯器上寫了數十行的程式碼,那它們是怎麼透過終端機的指令被運行起來,讓我可以一邊開發一邊預覽結果呢?
Thumbnail
寫一封email是現在人的日常,用程式發送email本來以為是一件難事,但自從摸了一下Nodemailer以後世界就變得不一樣 甚至使用Nodemailer搭配Express就可以製作出簡易發送Email的API給自己使用(or別人),馬上進入主題 首先你要有一個nodejs的server,會看這篇
Thumbnail
寫一封email是現在人的日常,用程式發送email本來以為是一件難事,但自從摸了一下Nodemailer以後世界就變得不一樣 甚至使用Nodemailer搭配Express就可以製作出簡易發送Email的API給自己使用(or別人),馬上進入主題 首先你要有一個nodejs的server,會看這篇
Thumbnail
打包網頁 在部署網站之前,我們要先來打包我們的網頁前端專案 為什麼要打包呢?什麼是打包呢?這有點像是編譯,如果你寫過 C 應該講到這裡就理解為什麼要這樣做了 在網頁開發中網頁內容最原始就是直接用 html 下去寫,但一個成熟的開發者會善用框架來開發,不論是用 vue 或 react,樣式的部分也會從
Thumbnail
打包網頁 在部署網站之前,我們要先來打包我們的網頁前端專案 為什麼要打包呢?什麼是打包呢?這有點像是編譯,如果你寫過 C 應該講到這裡就理解為什麼要這樣做了 在網頁開發中網頁內容最原始就是直接用 html 下去寫,但一個成熟的開發者會善用框架來開發,不論是用 vue 或 react,樣式的部分也會從
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News