iT邦幫忙

2022 iThome 鐵人賽

DAY 13
0

NGINX 是個在業界廣泛使用的 Web Server,也稱為 Reverse Proxy,
用途是把進入 Server 的 Request 導向給指定的服務來處理,更進階也能用來設定 Load Balance,

今天來看看 Docker 版本的 NGINX 是怎麼使用的,GOGO。


NGINX Image

NGINX 同樣也有多個 image tag,可以指定版本或使用極致輕量的 alpine image,這次我們直接使用 latest (預設) 就可以了,

$ sudo docker run  --rm  --publish=80:80  --detach  nginx

咻!
馬上就啟動好 NGINX 了,

可以在 Server 上呼叫 Localhost:

$ curl localhost

<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
...
<p><em>Thank you for using nginx.</em></p>
</body>
</html>

或者在瀏覽器輸入 Server IP 看一下:

nginx-1

如果此時發現沒辦法看到 NGINX 的歡迎頁面,常見有兩種情況,
一是使用的 80 Port 已經被佔用了,可以查看一下 docker run 的錯誤訊息或 log,
第二則是雲端伺服器平台有防火牆阻擋,大部分的平台都會需要手動去設定 Port 開放。


default.conf

如果稍微熟悉 NGINX,會知道設定檔會放在 /etc/nginx,讓我們進入到 Container 裡觀察一下,

sudo docker exec -it your-container bash

可以看到裡面有個 default.conf 檔案,內容就是設定為導向 NGINX 歡迎頁面:

# /etc/nginx/conf.d/default.conf

server {
    listen       80;
    listen  [::]:80;
    server_name  localhost;

    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
    }

    # redirect server error pages to the static page /50x.html
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
}

NGINX 設定檔

接著我們需要加入自己的 NGINX 設定檔,

假設我們分別要設定 hello.testithelp.test 這兩個網域,並回傳不同的內容,用來證明我們的設定有生效,

這裡講解兩種放入設定檔的方式,

我們可以把當下目錄的 conf.d/ 跟 Container 內的 /etc/nginx/conf.d 用 Volume 連結起來,

而在官方的文件中,則是介紹了另一種方法 —— 定義 Dockerfile 來建立一個新的 Image,在建置過程中,以 nginx image 為基底,並把我們的定義的 nginx 設定檔放進去,

兩個做法都能用,我這裡以較簡單的第一種做法來當範例:

# ./conf.d/hello.conf
server {
	listen 80;
	server_name hello.test;

	location / {
		default_type text/plain;
		return 200 'hello';
	}
}
# ./conf.d/ithelp.conf
server {
	listen 80;
	server_name ithelp.test;

	location / {
		default_type text/html;
		return 200 '<a href="https://ithelp.ithome.com.tw/users/20120541/ironman/5683">https://ithelp.ithome.com.tw/users/20120541/ironman/5683</a>';
	}
}

定義 docker compose:

version: "3"
services:
  nginx:
    image: nginx
    restart: unless-stopped
    ports:
      - "80:80"
    volumes:
      - ./conf.d:/etc/nginx/conf.d

最後同樣用 docker compose 跑起來:

$ sudo docker compose up -d

如果再進入新的 container 查看的話,可以發現 default.conf 不見了,取而代之的則是我們的兩個設定檔,

這是前述兩種做法的差異,如果用 Dockerfile 就能保留 default.conf,不過對我們來說沒有影響。

測試

設定完之後,要如何測試呢?
我們可以借助 /etc/hosts 來設定,它是可以強制設定電腦的 DNS 解析,即使網路上沒有這個網域,

只要記得三個小細節:

  1. 是編輯你開發電腦上的檔案
  2. 要用 sudo 權限來編輯它
  3. xx.xx.xx.xx 是你的 Server 對外 IP

我們在裡面加上這兩行:

# /etc/hosts

xx.xx.xx.xx ithelp.test
xx.xx.xx.xx hello.test

就可以到瀏覽器上來查看設定結果了:

nginx-2
nginx-3


完成!
學會了用 Docker 來啟動 NGINX,這個做法能夠省去安裝 NGINX 的時間,並快速啟動,

今天的程式碼範例可以在 這裡 找到。


上一篇
D12 - Image Size
下一篇
D14 - Vue with NGINX
系列文
其實沒有那麼難 — Docker30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言