Nginx中server_name的超詳細使用指南
簡介
server_name
是 Nginx 配置文件中的一個重要指令,用于指定 Nginx 服務(wù)器塊(或虛擬主機)應(yīng)該響應(yīng)哪些域名的請求。通過正確配置 server_name
,你可以在同一臺服務(wù)器上托管多個不同的網(wǎng)站,并確保每個域名的請求都能被正確處理。
DNS 解析的過程
客戶端發(fā)起請求:當用戶在瀏覽器中輸入一個域名(如
example.com
)時,瀏覽器會向本地 DNS 服務(wù)器發(fā)送查詢請求。遞歸查詢:本地 DNS 服務(wù)器會檢查其緩存,如果找到了該域名對應(yīng)的 IP 地址,則直接返回給客戶端;如果沒有找到,則繼續(xù)向其他 DNS 服務(wù)器(如根 DNS 服務(wù)器、頂級域 DNS 服務(wù)器等)進行遞歸查詢,直到找到目標 IP 地址。
返回結(jié)果:一旦找到目標 IP 地址,DNS 服務(wù)器會將結(jié)果返回給客戶端,瀏覽器就可以使用該 IP 地址與目標服務(wù)器建立連接。
緩存結(jié)果:為了提高效率,DNS 服務(wù)器通常會緩存查詢結(jié)果一段時間(稱為 TTL,Time To Live),以便后續(xù)相同的查詢可以直接從緩存中獲取結(jié)果,而無需再次進行完整的解析過程。
主機文件的作用
在開發(fā)環(huán)境中,我們通常使用 主機文件(/etc/hosts
或 C:\Windows\System32\drivers\etc\hosts
)來模擬 DNS 解析。主機文件允許我們在本地將特定的域名映射到指定的 IP 地址,而無需依賴外部 DNS 服務(wù)器。這對于測試和開發(fā)非常有用,因為它可以快速配置自定義域名,并且不會影響其他用戶的網(wǎng)絡(luò)環(huán)境。
例如,在主機文件中添加以下行:
192.168.154.101 admin.dhl101
這行配置表示,當瀏覽器嘗試訪問 admin.dhl101
時,它會直接解析為 IP 地址 192.168.154.101
,而不會去查詢外部 DNS 服務(wù)器。
DNS 與 Nginx 的關(guān)系
Nginx 使用 server_name
指令來匹配 HTTP 請求中的 Host
頭字段,以確定哪個 server
塊應(yīng)該處理該請求。因此,DNS 解析的結(jié)果(即域名對應(yīng)的 IP 地址)決定了請求會被發(fā)送到哪臺服務(wù)器,而 Nginx 則根據(jù) server_name
指令進一步確定具體的處理邏輯。
例如,假設(shè)你有兩臺服務(wù)器,分別托管 example.com
和 admin.example.com
。用戶在瀏覽器中輸入 admin.example.com
,DNS 會將其解析為某臺服務(wù)器的 IP 地址,然后 Nginx 會根據(jù) server_name
指令判斷是否應(yīng)該由該服務(wù)器處理該請求。
server_name 的作用
server_name
指令告訴 Nginx,在接收到 HTTP 請求時,如果請求頭中的 Host
字段匹配指定的域名,則該請求應(yīng)由這個特定的 server
塊來處理。這使得在同一臺服務(wù)器上托管多個不同域名的網(wǎng)站成為可能。
基本用法
最簡單的 server_name
配置是為一個具體的域名指定一個 server
塊。例如:
server { listen 80; server_name example.com; root /var/www/example.com; index index.html; location / { try_files $uri $uri/ =404; } }
在這個例子中,Nginx 將會檢查所有進來的 HTTP 請求,并查看請求頭中的 Host
字段。如果 Host
字段的值是 example.com
,那么 Nginx 就會使用這個 server
塊中的配置來處理該請求。
通配符和正則表達式
server_name
支持通配符和正則表達式,以便更靈活地匹配域名。
通配符
前綴通配符:
*.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 不直接支持后綴通配符,但可以通過正則表達式實現(xiàn)類似功能。
正則表達式
使用 ~
開頭的 server_name
可以包含正則表達式。例如:
server { listen 80; server_name ~^(?<sub>.+)\.example\.com$; root /var/www/$sub.example.com; index index.html; location / { try_files $uri $uri/ =404; } }
在這個例子中,(?<sub>.+)
是一個捕獲組,它允許你在后續(xù)配置中引用匹配到的子域名部分。
默認服務(wù)器
如果你希望某個 server
塊作為默認服務(wù)器(即在沒有其他服務(wù)器塊匹配時處理請求),可以使用以下方式:
- 空字符串:
server_name "";
表示這個server
塊是默認服務(wù)器。 - 下劃線:
server_name _;
也可以表示默認服務(wù)器。
例如:
server { listen 80 default_server; server_name _; root /var/www/default; index index.html; location / { try_files $uri $uri/ =404; } }
多域名配置
你可以為同一個 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; } }
這樣,Nginx 會將對 example.com
和 www.example.com
的請求都路由到這個 server
塊。
子域名配置
如果你想為 example.com
的子域名(如 api.example.com
和 admin.example.com
)創(chuàng)建獨立的 server
塊,可以按照以下步驟進行配置。
修改主機文件
首先,你需要在主機文件中為新的子域名添加條目。假設(shè)你已經(jīng)在主機文件中設(shè)置了 192.168.154.101 example.com
,現(xiàn)在需要添加 api.example.com
和 admin.example.com
。
Windows
- 打開記事本(以管理員身份運行),然后打開
C:\Windows\System32\drivers\etc\hosts
文件。 - 在文件末尾添加以下行:
192.168.154.101 api.example.com 192.168.154.101 admin.example.com
macOS 和 Linux
打開終端,并使用文本編輯器(如 nano, vim, emacs 等)編輯
/etc/hosts
文件。例如,使用 nano 編輯器,你可以運行:sudo nano /etc/hosts
在文件末尾添加以下行:
192.168.154.101 api.example.com 192.168.154.101 admin.example.com
保存并退出編輯器(對于 nano,按
Ctrl + X
,然后按Y
確認保存更改,最后按Enter
退出)。
配置 Nginx
接下來,我們需要在 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ù)運行在本地端口 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)聽與 server_name 結(jié)合
如果你希望 Nginx 在非標準端口(如 8082)上監(jiān)聽請求,并且只處理特定域名的請求,可以在 listen
指令中明確指定 IP 地址和端口組合。
例如,假設(shè)你希望 Nginx 在 192.168.154.101
上監(jiān)聽端口 8082,并且只處理 admin.dhl101
的請求:
server { listen 192.168.154.101:8082; server_name admin.dhl101; root /var/www/login; index index.html; location / { try_files $uri $uri/ =404; } }
主機文件配置
確保你的主機文件中有以下條目,以便瀏覽器能夠正確解析 admin.dhl101
:
192.168.154.101 admin.dhl101
測試和驗證
測試配置文件:
- 在修改完 Nginx 配置文件后,先測試配置文件是否有語法錯誤:
sudo nginx -t
- 在修改完 Nginx 配置文件后,先測試配置文件是否有語法錯誤:
重載 Nginx:
- 如果沒有問題,重新加載 Nginx 使配置生效:或者,如果你的系統(tǒng)使用的是不同的初始化系統(tǒng),可能需要使用
sudo systemctl reload nginx
sudo service nginx reload
。
- 如果沒有問題,重新加載 Nginx 使配置生效:
訪問 URL:
- 打開瀏覽器,訪問
http://admin.dhl101:8082/
,確認是否能夠正常加載/var/www/login
目錄下的內(nèi)容。
- 打開瀏覽器,訪問
其他注意事項
防火墻設(shè)置:確保你的防火墻允許通過端口 8082 的流量。你可以使用以下命令檢查和配置防火墻規(guī)則:
sudo ufw allow 8082/tcp # 對于 UFW sudo firewall-cmd --add-port=8082/tcp --permanent # 對于 firewalld sudo firewall-cmd --reload
SELinux 設(shè)置(適用于 CentOS/RHEL):如果你的系統(tǒng)啟用了 SELinux,確保 Nginx 有權(quán)限監(jiān)聽非標準端口。你可以使用以下命令:
sudo semanage port -a -t http_port_t -p tcp 8082
HTTPS 配置:如果你希望為
admin.dhl101
配置 HTTPS,可以使用 mkcert 工具生成自簽名證書。以下是 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é)
通過正確配置 server_name
,你可以在同一臺服務(wù)器上托管多個不同的網(wǎng)站,并確保每個域名的請求都能被正確處理。server_name
支持多種匹配方式,包括具體域名、通配符和正則表達式,可以根據(jù)實際需求靈活使用。此外,結(jié)合端口監(jiān)聽和主機文件配置,你可以輕松實現(xiàn)復(fù)雜的域名和端口映射,滿足各種開發(fā)和生產(chǎn)環(huán)境的需求。
如果你有更多問題或需要進一步的幫助,請隨時查閱 Nginx 官方文檔或?qū)で笊鐓^(qū)支持。
參考資料
希望這篇筆記能幫助你更好地理解和使用 Nginx 中的 server_name
指令。
到此這篇關(guān)于Nginx中server_name的文章就介紹到這了,更多相關(guān)Nginx中server_name使用內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
nginx: [warn] "log_format" directive used only on "http" lev
這篇文章主要介紹了nginx: [warn] "log_format" directive used only on "http" level 解決方法,需要的朋友可以參考下2014-08-08分析nginx日志并屏蔽采集者ip(nginx屏蔽ip配置實例)
這篇文章主要介紹了分析nginx日志并屏蔽采集者ip(nginx屏蔽ip配置實例),本文先是講解了分析需要屏蔽日志的方法,然后講解了Nginx中屏蔽IP的配置方法,需要的朋友可以參考下2015-02-02nginx運行報錯:unknown directive “stream“的解決方案
這篇文章主要給大家介紹了nginx 運行報錯:unknown directive "stream"的原因,主要是因為沒有安裝stream模塊導(dǎo)致的,我們只需要編譯安裝一下stream模塊即可解決這個問題,文中有詳細的解決方案,需要的朋友可以參考下2023-09-09使用AWS的ELB服務(wù)時為Nginx啟用代理協(xié)議的步驟講解
這篇文章主要介紹了使用AWS的ELB服務(wù)時為Nginx啟用代理協(xié)議的步驟講解,ELB服務(wù)是亞馬遜服務(wù)器提供的常用的負載均衡方案,需要的朋友可以參考下2015-12-12Nginx 502 Bad Gateway錯誤的原因分析及解決方案
這篇文章主要介紹了Nginx 502 Bad Gateway錯誤的原因分析及解決方案,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2025-05-05