靜態網站與 Server Block
server block(有些文件稱為 virtual host)是 Nginx 用來定義「一個網站」的基本單位。一份 Nginx 設定裡可以有多個 server block,各自綁定不同的網域或連接埠,讓一台主機同時服務多個網站。
基本寫法
server {
listen 80;
server_name example.com www.example.com;
root /var/www/example.com;
index index.html;
}
listen:監聽的連接埠,80是預設的 HTTP 埠。server_name:這個 block 要回應的網域名稱,可以寫多個,用空白分隔。root:靜態檔案所在的資料夾。index:使用者只輸入資料夾路徑(例如/)時,預設回傳的檔名。
root 與 alias 的差異
兩者都是用來指定檔案位置,但路徑組合方式不同,是新手很容易搞混的地方:
# root:完整路徑 = root + location 的路徑
location /images/ {
root /var/www; # 實際會找 /var/www/images/檔名
}
# alias:完整路徑 = alias 取代掉 location 的路徑
location /images/ {
alias /var/www/static/; # 實際會找 /var/www/static/檔名
}
簡單記法:root 是「加上去」,alias 是「換掉」。
try_files 與自訂錯誤頁
try_files 依序嘗試多個路徑,常用來處理前端 SPA 或找不到檔案時的備援:
location / {
try_files $uri $uri/ /index.html;
}
error_page 404 /404.html;
error_page 500 502 503 504 /50x.html;
上面的設定會先找完全符合的檔案,找不到再試資料夾,最後才回傳 index.html(常見於前端框架的路由需求)。
同時架設多個網站
只要用不同的 server_name 各寫一個 server block,同一台主機、同一個連接埠就能服務多個網域,這稱為 name-based virtual hosting:
server {
listen 80;
server_name shop.example.com;
root /var/www/shop;
}
server {
listen 80;
server_name blog.example.com;
root /var/www/blog;
}
Nginx 會依照 HTTP 請求標頭中的 Host 決定要交給哪一個 server block 處理。實務上通常會把每個網站的設定拆成獨立檔案,放在 sites-available/,再透過符號連結啟用到 sites-enabled/(見 安裝與啟動),方便個別管理與除錯。