利用Nginx實(shí)現(xiàn)一個IP部署多個網(wǎng)站
一個服務(wù)器/一個 IP 地址完全可以部署多個網(wǎng)站虛擬主機(jī)
一、一個 IP 部署多個網(wǎng)站的原理
1. 基于域名區(qū)分(最常見)
多個網(wǎng)站共享同一個 IP 和端口(80/443),Nginx 根據(jù)請求頭中的 Host 字段區(qū)分:
用戶訪問 http://a.com → Nginx 匹配 server_name a.com → 返回網(wǎng)站 A 用戶訪問 http://b.com → Nginx 匹配 server_name b.com → 返回網(wǎng)站 B 用戶訪問 http://c.com → Nginx 匹配 server_name c.com → 返回網(wǎng)站 C
2. 基于端口區(qū)分
不同網(wǎng)站用不同端口:
http://服務(wù)器IP:80 → 網(wǎng)站 A http://服務(wù)器IP:8080 → 網(wǎng)站 B http://服務(wù)器IP:3000 → 網(wǎng)站 C
3. 基于 IP 區(qū)分(需要多網(wǎng)卡)
http://192.168.1.10 → 網(wǎng)站 A http://192.168.1.11 → 網(wǎng)站 B
二、Nginx 的虛擬主機(jī)配置結(jié)構(gòu)
配置文件層次
/etc/nginx/
├── nginx.conf # 主配置文件
├── sites-available/ # 所有站點(diǎn)配置(倉庫)
│ ├── site1.com
│ ├── site2.com
│ └── rentalhousing
└── sites-enabled/ # 啟用的站點(diǎn)(開關(guān))
├── site1.com -> ../sites-available/site1.com
├── site2.com -> ../sites-available/site2.com
└── rentalhousing -> ../sites-available/rentalhousing
單個站點(diǎn)配置文件示例
/etc/nginx/sites-available/rentalhousing
server {
listen 80;
server_name rental.yourdomain.com; # 域名1
root /opt/rentalhousing/apps/web/dist;
index index.html;
location /api/ {
proxy_pass http://127.0.0.1:3000;
}
}
/etc/nginx/sites-available/another-site
server {
listen 80;
server_name another.com www.another.com; # 域名2
root /var/www/another-site;
index index.html;
}
三、完整的多站點(diǎn)部署示例
場景:你的服務(wù)器上部署三個網(wǎng)站
| 網(wǎng)站 | 域名 | 用途 |
|---|---|---|
| 租房系統(tǒng) | rent.yourdomain.com | 你的主項(xiàng)目 |
| 博客 | blog.yourdomain.com | 技術(shù)博客 |
| 個人主頁 | yourdomain.com | 個人介紹 |
步驟
1. 創(chuàng)建三個配置文件
# 租房系統(tǒng) sudo nano /etc/nginx/sites-available/rentalhousing
server {
listen 80;
server_name rent.yourdomain.com;
root /opt/rentalhousing/apps/web/dist;
location /api/ {
proxy_pass http://127.0.0.1:3000;
}
}
# 博客 sudo nano /etc/nginx/sites-available/blog
server {
listen 80;
server_name blog.yourdomain.com;
root /var/www/blog;
index index.html;
}
# 個人主頁 sudo nano /etc/nginx/sites-available/homepage
server {
listen 80;
server_name yourdomain.com www.yourdomain.com;
root /var/www/homepage;
index index.html;
}
2. 啟用所有站點(diǎn)
# 創(chuàng)建符號鏈接 sudo ln -s /etc/nginx/sites-available/rentalhousing /etc/nginx/sites-enabled/ sudo ln -s /etc/nginx/sites-available/blog /etc/nginx/sites-enabled/ sudo ln -s /etc/nginx/sites-available/homepage /etc/nginx/sites-enabled/ # 測試配置 sudo nginx -t # 重載 Nginx sudo systemctl reload nginx
3. DNS 解析配置
在域名服務(wù)商處添加 A 記錄:
rent.yourdomain.com A → 你的服務(wù)器 IP blog.yourdomain.com A → 你的服務(wù)器 IP yourdomain.com A → 你的服務(wù)器 IP
四、匹配優(yōu)先級規(guī)則
當(dāng)一個請求到達(dá)時,Nginx 按以下順序匹配:
# 1. 精確域名匹配 server_name rent.yourdomain.com; # 最高優(yōu)先級 # 2. 通配符開頭 server_name *.yourdomain.com; # 匹配 sub.yourdomain.com # 3. 通配符結(jié)尾 server_name rent.*; # 匹配 rent.anything # 4. 正則表達(dá)式 server_name ~^(www\.)?(.+)$; # 最低優(yōu)先級
默認(rèn)站點(diǎn)(兜底配置)
server {
listen 80 default_server; # 默認(rèn)站點(diǎn)
server_name _; # 匹配所有未匹配的域名
return 404; # 或返回其他頁面
}
五、使用端口區(qū)分的示例
# 端口 80 → 網(wǎng)站 A
server {
listen 80;
server_name _;
root /var/www/site-a;
}
# 端口 8080 → 網(wǎng)站 B
server {
listen 8080;
server_name _;
root /var/www/site-b;
}
# 端口 3000 → 網(wǎng)站 C(直接代理到 Node.js)
server {
listen 3000;
server_name _;
location / {
proxy_pass http://127.0.0.1:3001;
}
}
六、實(shí)際驗(yàn)證
查看 Nginx 加載了哪些配置
# 查看所有啟用的配置 sudo nginx -T | grep "server_name" # 測試某個域名是否匹配 curl -H "Host: rent.yourdomain.com" http://你的服務(wù)器IP curl -H "Host: blog.yourdomain.com" http://你的服務(wù)器IP
查看訪問日志區(qū)分
# 為不同站點(diǎn)配置不同日志文件
server {
server_name rent.yourdomain.com;
access_log /var/log/nginx/rentalhousing-access.log;
error_log /var/log/nginx/rentalhousing-error.log;
}
server {
server_name blog.yourdomain.com;
access_log /var/log/nginx/blog-access.log;
error_log /var/log/nginx/blog-error.log;
}
七、實(shí)際限制
| 方案 | 優(yōu)點(diǎn) | 缺點(diǎn) | 適用場景 |
|---|---|---|---|
| 域名區(qū)分 | 用戶體驗(yàn)好、可無限擴(kuò)展 | 需要域名 | 生產(chǎn)環(huán)境 |
| 端口區(qū)分 | 無需域名、配置簡單 | 不友好、需要記住端口 | 測試、內(nèi)部系統(tǒng) |
| 路徑區(qū)分 | 單一域名 | 容易沖突、URL 不美觀 | 臨時方案 |
路徑區(qū)分示例(單一域名下)
server {
server_name yourdomain.com;
location /rental/ {
alias /opt/rentalhousing/apps/web/dist/;
}
location /blog/ {
alias /var/www/blog/;
}
}
八、管理命令速查
# 列出所有可用配置 ls /etc/nginx/sites-available/ # 列出已啟用的配置 ls -la /etc/nginx/sites-enabled/ # 啟用站點(diǎn) sudo ln -s /etc/nginx/sites-available/站點(diǎn)名 /etc/nginx/sites-enabled/ # 禁用站點(diǎn)(保留配置) sudo rm /etc/nginx/sites-enabled/站點(diǎn)名 # 重新加載配置 sudo systemctl reload nginx # 查看錯誤日志 sudo tail -f /var/log/nginx/error.log
總結(jié)
一個服務(wù)器/一個 IP 可以部署無限多個網(wǎng)站,限制只是:
- 服務(wù)器資源(CPU、內(nèi)存、帶寬)
- 文件描述符限制(Linux 系統(tǒng)配置)
Nginx 通過 server_name 和 listen 的組合,結(jié)合 sites-available/sites-enabled 目錄結(jié)構(gòu),實(shí)現(xiàn)了清晰、靈活的站點(diǎn)管理。
以上就是利用Nginx實(shí)現(xiàn)一個IP部署多個網(wǎng)站的詳細(xì)內(nèi)容,更多關(guān)于Nginx一個IP部署多個網(wǎng)站的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Nginx根據(jù)不同瀏覽器語言配置頁面跳轉(zhuǎn)的方法
這篇文章主要介紹了Nginx根據(jù)不同瀏覽器語言配置頁面跳轉(zhuǎn)的方法,包括一個簡體繁體的基本判斷方法及實(shí)際根據(jù)中英文跳轉(zhuǎn)的例子,需要的朋友可以參考下2016-04-04
LNMP 解決Access Denied錯誤詳細(xì)介紹
這篇文章主要介紹了LNMP 解決Access Denied錯誤詳細(xì)介紹的相關(guān)資料,需要的朋友可以參考下2016-10-10
Nginx1.21.6生產(chǎn)環(huán)境升級步驟
這篇文章主要介紹了Nginx1.21.6生產(chǎn)環(huán)境升級步驟,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-01-01
Nginx代理Vue項(xiàng)目出現(xiàn)Invalid Host header問題及解決
在使用Nginx的upstream對Vue項(xiàng)目進(jìn)行負(fù)載均衡時,如果代理地址無法訪問目標(biāo)地址且頁面報錯InvalidHostheader(無效主機(jī)頭),可能是由于Vue項(xiàng)目的主機(jī)檢查配置導(dǎo)致的,解決方法是在Vue項(xiàng)目的webpack.dev.js文件中的devServer下添加disableHostCheck:true,跳過主機(jī)檢查2024-12-12

