Nginx中server_name的超詳細(xì)使用指南
簡(jiǎn)介
server_name 是 Nginx 配置文件中的一個(gè)重要指令,用于指定 Nginx 服務(wù)器塊(或虛擬主機(jī))應(yīng)該響應(yīng)哪些域名的請(qǐng)求。通過(guò)正確配置 server_name,你可以在同一臺(tái)服務(wù)器上托管多個(gè)不同的網(wǎng)站,并確保每個(gè)域名的請(qǐng)求都能被正確處理。
DNS 解析的過(guò)程
客戶端發(fā)起請(qǐng)求:當(dāng)用戶在瀏覽器中輸入一個(gè)域名(如
example.com)時(shí),瀏覽器會(huì)向本地 DNS 服務(wù)器發(fā)送查詢請(qǐng)求。遞歸查詢:本地 DNS 服務(wù)器會(huì)檢查其緩存,如果找到了該域名對(duì)應(yīng)的 IP 地址,則直接返回給客戶端;如果沒(méi)有找到,則繼續(xù)向其他 DNS 服務(wù)器(如根 DNS 服務(wù)器、頂級(jí)域 DNS 服務(wù)器等)進(jìn)行遞歸查詢,直到找到目標(biāo) IP 地址。
返回結(jié)果:一旦找到目標(biāo) IP 地址,DNS 服務(wù)器會(huì)將結(jié)果返回給客戶端,瀏覽器就可以使用該 IP 地址與目標(biāo)服務(wù)器建立連接。
緩存結(jié)果:為了提高效率,DNS 服務(wù)器通常會(huì)緩存查詢結(jié)果一段時(shí)間(稱為 TTL,Time To Live),以便后續(xù)相同的查詢可以直接從緩存中獲取結(jié)果,而無(wú)需再次進(jìn)行完整的解析過(guò)程。
主機(jī)文件的作用
在開(kāi)發(fā)環(huán)境中,我們通常使用 主機(jī)文件(/etc/hosts 或 C:\Windows\System32\drivers\etc\hosts)來(lái)模擬 DNS 解析。主機(jī)文件允許我們?cè)诒镜貙⑻囟ǖ挠蛎成涞街付ǖ?IP 地址,而無(wú)需依賴外部 DNS 服務(wù)器。這對(duì)于測(cè)試和開(kāi)發(fā)非常有用,因?yàn)樗梢钥焖倥渲米远x域名,并且不會(huì)影響其他用戶的網(wǎng)絡(luò)環(huán)境。
例如,在主機(jī)文件中添加以下行:
192.168.154.101 admin.dhl101
這行配置表示,當(dāng)瀏覽器嘗試訪問(wèn) admin.dhl101 時(shí),它會(huì)直接解析為 IP 地址 192.168.154.101,而不會(huì)去查詢外部 DNS 服務(wù)器。
DNS 與 Nginx 的關(guān)系
Nginx 使用 server_name 指令來(lái)匹配 HTTP 請(qǐng)求中的 Host 頭字段,以確定哪個(gè) server 塊應(yīng)該處理該請(qǐng)求。因此,DNS 解析的結(jié)果(即域名對(duì)應(yīng)的 IP 地址)決定了請(qǐng)求會(huì)被發(fā)送到哪臺(tái)服務(wù)器,而 Nginx 則根據(jù) server_name 指令進(jìn)一步確定具體的處理邏輯。
例如,假設(shè)你有兩臺(tái)服務(wù)器,分別托管 example.com 和 admin.example.com。用戶在瀏覽器中輸入 admin.example.com,DNS 會(huì)將其解析為某臺(tái)服務(wù)器的 IP 地址,然后 Nginx 會(huì)根據(jù) server_name 指令判斷是否應(yīng)該由該服務(wù)器處理該請(qǐng)求。
server_name 的作用
server_name 指令告訴 Nginx,在接收到 HTTP 請(qǐng)求時(shí),如果請(qǐng)求頭中的 Host 字段匹配指定的域名,則該請(qǐng)求應(yīng)由這個(gè)特定的 server 塊來(lái)處理。這使得在同一臺(tái)服務(wù)器上托管多個(gè)不同域名的網(wǎng)站成為可能。
基本用法
最簡(jiǎn)單的 server_name 配置是為一個(gè)具體的域名指定一個(gè) server 塊。例如:
server {
listen 80;
server_name example.com;
root /var/www/example.com;
index index.html;
location / {
try_files $uri $uri/ =404;
}
}
在這個(gè)例子中,Nginx 將會(huì)檢查所有進(jìn)來(lái)的 HTTP 請(qǐng)求,并查看請(qǐng)求頭中的 Host 字段。如果 Host 字段的值是 example.com,那么 Nginx 就會(huì)使用這個(gè) server 塊中的配置來(lái)處理該請(qǐng)求。
通配符和正則表達(dá)式
server_name 支持通配符和正則表達(dá)式,以便更靈活地匹配域名。
通配符
前綴通配符:
*.example.com可以匹配任何以.example.com結(jié)尾的子域名,如sub1.example.com、sub2.example.com等。server { listen 80; server_name *.example.com; root /var/www/example.com; index index.html; location / { try_files $uri $uri/ =404; } }后綴通配符:Nginx 不直接支持后綴通配符,但可以通過(guò)正則表達(dá)式實(shí)現(xiàn)類似功能。
正則表達(dá)式
使用 ~ 開(kāi)頭的 server_name 可以包含正則表達(dá)式。例如:
server {
listen 80;
server_name ~^(?<sub>.+)\.example\.com$;
root /var/www/$sub.example.com;
index index.html;
location / {
try_files $uri $uri/ =404;
}
}
在這個(gè)例子中,(?<sub>.+) 是一個(gè)捕獲組,它允許你在后續(xù)配置中引用匹配到的子域名部分。
默認(rèn)服務(wù)器
如果你希望某個(gè) server 塊作為默認(rèn)服務(wù)器(即在沒(méi)有其他服務(wù)器塊匹配時(shí)處理請(qǐng)求),可以使用以下方式:
- 空字符串:
server_name "";表示這個(gè)server塊是默認(rèn)服務(wù)器。 - 下劃線:
server_name _;也可以表示默認(rèn)服務(wù)器。
例如:
server {
listen 80 default_server;
server_name _;
root /var/www/default;
index index.html;
location / {
try_files $uri $uri/ =404;
}
}
多域名配置
你可以為同一個(gè) server 塊指定多個(gè)域名,用空格分隔。例如:
server {
listen 80;
server_name example.com www.example.com;
root /var/www/example.com;
index index.html;
location / {
try_files $uri $uri/ =404;
}
}
這樣,Nginx 會(huì)將對(duì) example.com 和 www.example.com 的請(qǐng)求都路由到這個(gè) server 塊。
子域名配置
如果你想為 example.com 的子域名(如 api.example.com 和 admin.example.com)創(chuàng)建獨(dú)立的 server 塊,可以按照以下步驟進(jìn)行配置。
修改主機(jī)文件
首先,你需要在主機(jī)文件中為新的子域名添加條目。假設(shè)你已經(jīng)在主機(jī)文件中設(shè)置了 192.168.154.101 example.com,現(xiàn)在需要添加 api.example.com 和 admin.example.com。
Windows
- 打開(kāi)記事本(以管理員身份運(yùn)行),然后打開(kāi)
C:\Windows\System32\drivers\etc\hosts文件。 - 在文件末尾添加以下行:
192.168.154.101 api.example.com 192.168.154.101 admin.example.com
macOS 和 Linux
打開(kāi)終端,并使用文本編輯器(如 nano, vim, emacs 等)編輯
/etc/hosts文件。例如,使用 nano 編輯器,你可以運(yùn)行:sudo nano /etc/hosts
在文件末尾添加以下行:
192.168.154.101 api.example.com 192.168.154.101 admin.example.com
保存并退出編輯器(對(duì)于 nano,按
Ctrl + X,然后按Y確認(rèn)保存更改,最后按Enter退出)。
配置 Nginx
接下來(lái),我們需要在 Nginx 中為 api.example.com 和 admin.example.com 分別創(chuàng)建 server 塊。
# 主站配置
server {
listen 80;
server_name example.com www.example.com;
root /var/www/example.com;
index index.html;
location / {
try_files $uri $uri/ =404;
}
}
# API 子域名配置
server {
listen 80;
server_name api.example.com;
root /var/www/api.example.com;
index index.html;
location / {
try_files $uri $uri/ =404;
}
# 如果你有 API 服務(wù),可以添加以下配置
location /api {
proxy_pass http://localhost:3000; # 假設(shè) API 服務(wù)運(yùn)行在本地端口 3000
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
# Admin 子域名配置
server {
listen 80;
server_name admin.example.com;
root /var/www/admin.example.com;
index index.html;
location / {
try_files $uri $uri/ =404;
}
}
端口監(jiān)聽(tīng)與 server_name 結(jié)合
如果你希望 Nginx 在非標(biāo)準(zhǔn)端口(如 8082)上監(jiān)聽(tīng)請(qǐng)求,并且只處理特定域名的請(qǐng)求,可以在 listen 指令中明確指定 IP 地址和端口組合。
例如,假設(shè)你希望 Nginx 在 192.168.154.101 上監(jiān)聽(tīng)端口 8082,并且只處理 admin.dhl101 的請(qǐng)求:
server {
listen 192.168.154.101:8082;
server_name admin.dhl101;
root /var/www/login;
index index.html;
location / {
try_files $uri $uri/ =404;
}
}
主機(jī)文件配置
確保你的主機(jī)文件中有以下條目,以便瀏覽器能夠正確解析 admin.dhl101:
192.168.154.101 admin.dhl101
測(cè)試和驗(yàn)證
測(cè)試配置文件:
- 在修改完 Nginx 配置文件后,先測(cè)試配置文件是否有語(yǔ)法錯(cuò)誤:
sudo nginx -t
- 在修改完 Nginx 配置文件后,先測(cè)試配置文件是否有語(yǔ)法錯(cuò)誤:
重載 Nginx:
- 如果沒(méi)有問(wèn)題,重新加載 Nginx 使配置生效:或者,如果你的系統(tǒng)使用的是不同的初始化系統(tǒng),可能需要使用
sudo systemctl reload nginx
sudo service nginx reload。
- 如果沒(méi)有問(wèn)題,重新加載 Nginx 使配置生效:
訪問(wèn) URL:
- 打開(kāi)瀏覽器,訪問(wèn)
http://admin.dhl101:8082/,確認(rèn)是否能夠正常加載/var/www/login目錄下的內(nèi)容。
- 打開(kāi)瀏覽器,訪問(wèn)
其他注意事項(xiàng)
防火墻設(shè)置:確保你的防火墻允許通過(guò)端口 8082 的流量。你可以使用以下命令檢查和配置防火墻規(guī)則:
sudo ufw allow 8082/tcp # 對(duì)于 UFW sudo firewall-cmd --add-port=8082/tcp --permanent # 對(duì)于 firewalld sudo firewall-cmd --reload
SELinux 設(shè)置(適用于 CentOS/RHEL):如果你的系統(tǒng)啟用了 SELinux,確保 Nginx 有權(quán)限監(jiān)聽(tīng)非標(biāo)準(zhǔn)端口。你可以使用以下命令:
sudo semanage port -a -t http_port_t -p tcp 8082
HTTPS 配置:如果你希望為
admin.dhl101配置 HTTPS,可以使用 mkcert 工具生成自簽名證書(shū)。以下是 HTTPS 配置的示例:server { listen 192.168.154.101:8082 ssl; server_name admin.dhl101; ssl_certificate /path/to/admin.dhl101.pem; ssl_certificate_key /path/to/admin.dhl101-key.pem; root /var/www/login; index index.html; location / { try_files $uri $uri/ =404; } }
總結(jié)
通過(guò)正確配置 server_name,你可以在同一臺(tái)服務(wù)器上托管多個(gè)不同的網(wǎng)站,并確保每個(gè)域名的請(qǐng)求都能被正確處理。server_name 支持多種匹配方式,包括具體域名、通配符和正則表達(dá)式,可以根據(jù)實(shí)際需求靈活使用。此外,結(jié)合端口監(jiān)聽(tīng)和主機(jī)文件配置,你可以輕松實(shí)現(xiàn)復(fù)雜的域名和端口映射,滿足各種開(kāi)發(fā)和生產(chǎn)環(huán)境的需求。
如果你有更多問(wèn)題或需要進(jìn)一步的幫助,請(qǐng)隨時(shí)查閱 Nginx 官方文檔或?qū)で笊鐓^(qū)支持。
參考資料
希望這篇筆記能幫助你更好地理解和使用 Nginx 中的 server_name 指令。
到此這篇關(guān)于Nginx中server_name的文章就介紹到這了,更多相關(guān)Nginx中server_name使用內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Nginx配置負(fù)載均衡時(shí)訪問(wèn)地址無(wú)法生效的解決方法
本文主要介紹了Nginx配置負(fù)載均衡時(shí)訪問(wèn)地址無(wú)法生效的解決方法,例如負(fù)載均衡策略的設(shè)置是否正確、是否存在拼寫錯(cuò)誤等,下面就來(lái)詳細(xì)的介紹一下,感興趣的可以了解一下2023-09-09
Dockerfile打包nginx鏡像的實(shí)現(xiàn)步驟
本文主要介紹了Dockerfile打包nginx鏡像的實(shí)現(xiàn)步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-10-10
nginx centos 服務(wù)開(kāi)機(jī)啟動(dòng)設(shè)置實(shí)例詳解
這篇文章主要介紹了nginx centos 服務(wù)開(kāi)機(jī)啟動(dòng)設(shè)置實(shí)例詳解的相關(guān)資料,這里對(duì)服務(wù)開(kāi)機(jī)啟動(dòng)做了詳細(xì)的步驟介紹,需要的朋友可以參考下2016-11-11
nginx?location指令(匹配順序匹配沖突)實(shí)戰(zhàn)示例詳解
這篇文章主要介紹了nginx?location指令(實(shí)戰(zhàn)示例匹配順序匹配沖突)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-06-06
nginx+tomcat實(shí)現(xiàn)多級(jí)反向代理的示例代碼
本文介紹在CentOS系統(tǒng)下安裝Tomcat、配置虛擬主機(jī)多級(jí)目錄,并通過(guò)Nginx反向代理將請(qǐng)求轉(zhuǎn)發(fā)至指定IP,構(gòu)建多級(jí)代理拓?fù)鋵?shí)現(xiàn)負(fù)載均衡與訪問(wèn)控制,感興趣的可以了解一下2025-07-07
django8.5?項(xiàng)目部署Nginx的操作步驟
nginx是一個(gè)開(kāi)源的,支持高性能,高并發(fā)的www服務(wù)和代理服務(wù)軟件。它是一個(gè)俄羅斯人lgor sysoev開(kāi)發(fā)的,作者將源代碼開(kāi)源出來(lái)供全球使用,下面小編給大家?guī)?lái)了django8.5?項(xiàng)目部署Nginx的操作步驟,感興趣的朋友一起看看吧2022-01-01

