Nginx配置文件解析與虛擬主機搭建過程
前言
Nginx 是一款高性能的 Web 服務(wù)器,就像網(wǎng)站的“大門守衛(wèi)”——不僅能高效接收用戶的訪問請求,還能靈活分配資源、保障服務(wù)穩(wěn)定。對于運維和開發(fā)來說,學(xué)會 Nginx 的配置和虛擬主機搭建,是實現(xiàn)多站點部署、優(yōu)化服務(wù)性能的關(guān)鍵。
這篇文章會從 Nginx 的核心配置文件入手,一步步拆解每個參數(shù)的作用,再詳細(xì)講解虛擬主機的三種搭建方案和實用安全功能。內(nèi)容通俗易懂,每個步驟都附帶具體操作和效果說明,無論是新手還是有基礎(chǔ)的用戶,都能跟著落地實踐。
一、Nginx 配置文件
Nginx 的所有功能都依賴主配置文件 nginx.conf,它的路徑通常是 /usr/local/nginx/conf/nginx.conf。我們可以用 vim /usr/local/nginx/conf/nginx.conf 命令編輯它,核心配置分為五大模塊,每個模塊各司其職。
1.1 全局配置
全局配置是 Nginx 的“整體設(shè)置”,位于配置文件最外層,不包含在任何 http“server”或“location”塊內(nèi),直接影響服務(wù)器的整體運行。
#user nobody; # 運行用戶,編譯時未指定則默認(rèn)是 nobody,可改為 nginx worker_processes 4; # 工作進程數(shù)量,建議設(shè)為服務(wù)器內(nèi)核數(shù)×2,訪問量小時設(shè)1即可 #error_log logs/error.log; # 錯誤日志存放路徑,默認(rèn)在 logs 目錄下 #pid logs/nginx.pid; # PID 文件路徑,記錄 Nginx 進程 ID
- worker_processes:相當(dāng)于“干活的工人數(shù)量”,數(shù)量越多,能同時處理的請求越多。比如服務(wù)器是 2 核 CPU,設(shè)為 4 就很合適,既不浪費資源也不擁擠。
- error_log:記錄 Nginx 運行中的錯誤,比如配置出錯、服務(wù)異常,排查問題時全靠它。
- pid:記錄 Nginx 主進程的 ID,方便管理服務(wù)(比如重啟、停止)。
1.2 I/O 事件配置
I/O 事件配置負(fù)責(zé)優(yōu)化 Nginx 處理網(wǎng)絡(luò)連接的方式,直接決定服務(wù)的并發(fā)能力,核心是 events 塊內(nèi)的參數(shù)。
events {
use epoll; # 使用 epoll 模型,Linux 2.6 及以上內(nèi)核優(yōu)先選它
worker_connections 4096; # 每個工作進程最多處理 4096 個連接
}- use epoll:epoll 是 Linux 系統(tǒng)的高效 I/O 模型,能在大量并發(fā)連接中快速響應(yīng)活躍請求,比默認(rèn)模型節(jié)省 CPU 資源。
- worker_connections:每個“工人”能同時接待的“客戶數(shù)”。如果有 8 個工作進程,總并發(fā)連接數(shù)就是 4096×8=32768(實際還要看服務(wù)器硬件和帶寬)。
- 補充操作:要讓并發(fā)連接數(shù)生效,需執(zhí)行
ulimit -n 65535臨時修改系統(tǒng)限制(每個 TCP 連接對應(yīng)一個文件句柄,默認(rèn)限制可能不夠)。
1.3 HTTP 配置
HTTP 配置是 Nginx 的“核心功能區(qū)”,用 http { } 包裹,控制所有 Web 服務(wù)的基礎(chǔ)行為,大部分配置會嵌套在子塊 server { } 中。
http {
include mime.types; # 加載文件擴展名與類型的映射表
default_type application/octet-stream; # 默認(rèn)文件類型(未識別時按二進制下載)
# 日志格式設(shè)定(默認(rèn)注釋,解開可啟用)
#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
# '$status $body_bytes_sent "$http_referer" '
# '"$http_user_agent" "$http_x_forwarded_for"';
#access_log logs/access.log main; # 訪問日志存放路徑
sendfile on; # 開啟高效文件傳輸模式,提升下載速度
#tcp_nopush on; # 配合 sendfile 使用,發(fā)送前先緩存數(shù)據(jù)
keepalive_timeout 65; # 連接保持超時時間,65秒內(nèi)無請求則斷開
#gzip on; # 開啟 gzip 壓縮,減小傳輸數(shù)據(jù)量(可提升頁面加載速度)
}- include mime.types:告訴 Nginx 不同后綴的文件是什么類型,比如
.html是網(wǎng)頁文件,.jpg是圖片文件,避免瀏覽器識別錯誤。 - sendfile on:相當(dāng)于“快遞加急”,直接通過內(nèi)核傳輸文件,不用經(jīng)過應(yīng)用層,傳輸速度更快。
- keepalive_timeout:用戶打開網(wǎng)頁后,短時間內(nèi)再次點擊鏈接不用重新建立連接,節(jié)省時間和資源。
1.4 Web 服務(wù)的監(jiān)聽配置
每個 server { } 塊代表一個獨立的 Web 服務(wù)(或虛擬主機),負(fù)責(zé)監(jiān)聽特定的端口和域名,處理對應(yīng)的請求。
server {
listen 80; # 監(jiān)聽的端口(默認(rèn) HTTP 端口是 80)
server_name www.kgc.com; # 綁定的域名,可填多個(用空格分隔)
charset utf-8; # 網(wǎng)頁默認(rèn)字符集,避免中文亂碼
# 核心請求處理規(guī)則
location / {
root html; # 網(wǎng)頁文件存放的根目錄(默認(rèn)是 /usr/local/nginx/html)
index index.html index.php; # 默認(rèn)首頁文件名,優(yōu)先加載 index.html
}
# 錯誤頁面配置(500/502/503/504 是服務(wù)器錯誤)
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html; # 錯誤頁面存放目錄
}
}- listen 80:用戶訪問網(wǎng)站時不用輸端口(瀏覽器默認(rèn)訪問 80 端口),如果改寫成 8080,訪問時就要加
:8080(比如http://www.kgc.com:8080)。 - server_name:相當(dāng)于網(wǎng)站的“門牌號”,比如
www.kgc.com,用戶輸入這個域名就能找到對應(yīng)的服務(wù)。 - location /:匹配所有請求,
root指定網(wǎng)頁文件存在哪里,index是打開網(wǎng)站時默認(rèn)顯示的文件。
1.5 其他配置(擴展)
這部分是實用擴展配置,主要包括日志格式詳解和 location 核心指令區(qū)別,幫你解決實際配置中的“坑”。
日志格式變量說明
日志格式中的每個變量都有特定含義,解開 log_format 注釋后,訪問日志會記錄這些信息:
$remote_addr:客戶端的 IP 地址(比如用戶的電腦 IP)。$remote_user:訪問網(wǎng)站的用戶名(如果開啟了認(rèn)證,會記錄登錄名)。$time_local:訪問時間和時區(qū)(比如10/Oct/2025:13:55:36 +0800)。$request:用戶的請求信息(比如GET /index.html HTTP/1.1,表示請求首頁)。$status:請求狀態(tài)碼(比如 200 是成功,404 是找不到頁面)。$http_user_agent:用戶的瀏覽器信息(比如 Chrome、Firefox)。
location 三大指令區(qū)別
root、alias、proxy_pass 是 location 中最常用的指令,用法差異很大,用例子說明更清楚:
- root(根路徑配置):比如
root /var/www/html,當(dāng)用戶請求www.kgc.com/test/1.html時,Nginx 會去/var/www/html/test/1.html找文件(拼接請求路徑)。 - alias(別名配置):比如
alias /var/www/html,當(dāng)用戶請求www.kgc.com/test/1.html時,Nginx 會直接去/var/www/html/1.html找文件(不拼接路徑)。 - proxy_pass(反向代理配置):比如
proxy_pass http://127.0.0.1:8080,會把用戶的請求轉(zhuǎn)發(fā)到本地 8080 端口的服務(wù)(比如 Tomcat),適合動態(tài)頁面處理。
二、Nginx 虛擬主機
虛擬主機就像“服務(wù)器里的隔間”,能讓一臺物理服務(wù)器同時運行多個網(wǎng)站(比如同時部署 www.yjs.com 和 www.simoncwh.com),不用額外買服務(wù)器,節(jié)省資源。Nginx 支持三種虛擬主機搭建方式,下面逐一詳細(xì)講解。
2.1 訪問狀態(tài)統(tǒng)計配置
通過 HTTP_STUB_STATUS 模塊,能實時查看 Nginx 的運行狀態(tài)(比如活躍連接數(shù)、處理的請求數(shù)),方便監(jiān)控服務(wù)。
2.1.1 查看已安裝的所有模塊
首先確認(rèn) Nginx 是否安裝了統(tǒng)計模塊,執(zhí)行命令:
/usr/local/nginx/sbin/nginx -V
如果輸出中包含 --with-http_stub_status_module,說明模塊已安裝;也可以用 cat /opt/nginx-1.20.2/auto/options | grep YES 查看所有已安裝模塊。
2.1.2 修改 nginx.conf 配置文件
- 先備份配置文件(防止改錯):
cd /usr/local/nginx/conf cp nginx.conf nginx.conf.bak
- 編輯配置文件,在
server { }塊中添加統(tǒng)計配置:
vim /usr/local/nginx/conf/nginx.conf
http {
server {
listen 80;
server_name localhost;
charset utf-8;
location / {
root html;
index index.html index.php;
}
# 添加狀態(tài)統(tǒng)計配置
location /status {
stub_status on; # 開啟統(tǒng)計功能
access_log off; # 關(guān)閉該路徑的日志記錄(減少冗余)
}
}
}2.1.3 重載服務(wù),訪問測試
- 重載 Nginx 配置(不用重啟服務(wù),不影響運行):
systemctl reload nginx
- 測試訪問:在瀏覽器輸入
http://192.168.10.110/status(把 IP 換成你的服務(wù)器 IP),會看到以下信息:
Active connections: 2 # 當(dāng)前活躍連接數(shù) server accepts handled requests: 100 98 200 # 已處理連接數(shù)、成功握手?jǐn)?shù)、已處理請求數(shù) Reading: 0 Writing: 1 Waiting: 1 # 讀取請求數(shù)、發(fā)送響應(yīng)數(shù)、等待連接數(shù)
也可以用命令 curl -s http://192.168.10.110/status 查看,方便腳本監(jiān)控。
2.2 基于授權(quán)的訪問控制
給網(wǎng)站加“密碼鎖”,用戶訪問時需要輸入用戶名和密碼才能進入,適合內(nèi)部網(wǎng)站或敏感資源。
2.2.1 生成用戶密碼認(rèn)證文件
- 安裝生成密碼的工具(httpd-tools):
yum install -y httpd-tools
- 生成密碼文件(創(chuàng)建用戶
zhangsan,密碼文件存放在/usr/local/nginx/passwd.db):
htpasswd -c /usr/local/nginx/passwd.db zhangsan
執(zhí)行后會提示輸入密碼,重復(fù)輸入即可(密碼不會顯示,放心輸入)。
3. 修改密碼文件權(quán)限(保證 Nginx 能讀取,且其他人無法修改):
chown nginx /usr/local/nginx/passwd.db chmod 400 /usr/local/nginx/passwd.db
2.2.2 修改主配置文件相對應(yīng)目錄,添加認(rèn)證配置項
編輯 nginx.conf,在需要認(rèn)證的 location / { } 中添加認(rèn)證參數(shù):
vim /usr/local/nginx/conf/nginx.conf
server {
location / {
root html;
index index.html index.php;
auth_basic "請輸入用戶名密碼"; # 登錄提示框文字
auth_basic_user_file /usr/local/nginx/passwd.db; # 密碼文件路徑
}
}2.2.3 重啟服務(wù),訪問測試
- 檢查配置文件是否正確(避免語法錯誤):
nginx -t
輸出 syntax is ok 和 test is successful 說明沒問題。
2. 重啟 Nginx:
systemctl restart nginx
- 測試:訪問網(wǎng)站時,瀏覽器會彈出登錄框,輸入用戶名
zhangsan和設(shè)置的密碼,才能看到頁面;密碼錯誤會提示“401 未授權(quán)”。
2.3 基于客戶端IP的訪問控制
設(shè)置“黑白名單”,只允許特定 IP 訪問,拒絕其他 IP,適合限制內(nèi)部服務(wù)只對公司內(nèi)網(wǎng)開放。
訪問控制規(guī)則很簡單:
allow IP/IP 段:允許某個 IP 或 IP 段訪問。deny IP/IP 段:拒絕某個 IP 或 IP 段訪問。- 規(guī)則從上到下執(zhí)行,匹配到就停止(比如先允許再拒絕,以允許為準(zhǔn))。
配置步驟:
- 編輯
nginx.conf,在location / { }中添加規(guī)則:
vim /usr/local/nginx/conf/nginx.conf
server {
location / {
root html;
index index.html index.php;
allow 192.168.10.123; # 允許這個 IP 訪問
deny all; # 拒絕其他所有 IP
}
}- 重啟 Nginx:
systemctl restart nginx
- 測試:
- 用
192.168.10.123訪問:能正常打開頁面。 - 用其他 IP 訪問:會提示“403 禁止訪問”。
2.4 基于域名的 Nginx 虛擬主機
多個域名指向同一臺服務(wù)器的同一個 IP,通過域名區(qū)分不同網(wǎng)站(比如 www.yjs.com 和 www.simoncwh.com 都指向 192.168.10.110,但顯示不同內(nèi)容)。
2.4.1 為虛擬主機提供域名解析
讓服務(wù)器識別域名,編輯 /etc/hosts 文件(本地解析,不用改 DNS):
echo "192.168.10.110 www.yjs.com www.simoncwh.com" >> /etc/hosts
執(zhí)行后,服務(wù)器會把這兩個域名映射到 192.168.10.110。
2.4.2 為虛擬主機準(zhǔn)備網(wǎng)頁文檔
創(chuàng)建兩個網(wǎng)站的網(wǎng)頁目錄,分別存放不同的首頁:
# 創(chuàng)建目錄 mkdir -p /usr/local/nginx/html/yjs mkdir -p /usr/local/nginx/html/simoncwh # 生成首頁內(nèi)容 echo "<h1>歡迎訪問 www.yjs.com</h1>" > /usr/local/nginx/html/yjs/index.html echo "<h1>歡迎訪問 www.simoncwh.com</h1>" > /usr/local/nginx/html/simoncwh/index.html
2.4.3 修改 nginx.conf 配置文件
在 http { } 塊中添加兩個 server { } 塊,分別對應(yīng)兩個域名:
vim /usr/local/nginx/conf/nginx.conf
http {
# 第一個虛擬主機:www.yjs.com
server {
listen 80;
server_name www.yjs.com; # 綁定域名
charset utf-8;
access_log logs/www.yjs.access.log; # 單獨的訪問日志
location / {
root /usr/local/nginx/html/yjs; # 網(wǎng)頁目錄
index index.html index.php;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
# 第二個虛擬主機:www.simoncwh.com
server {
listen 80;
server_name www.simoncwh.com; # 綁定域名
charset utf-8;
access_log logs/www.simoncwh.access.log; # 單獨的訪問日志
location / {
root /usr/local/nginx/html/simoncwh; # 網(wǎng)頁目錄
index index.html index.php;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}2.4.4 重啟服務(wù),訪問測試
- 重啟 Nginx:
systemctl restart nginx
- 測試:
- 瀏覽器輸入
http://www.yjs.com:顯示“歡迎訪問 www.yjs.com”。 - 瀏覽器輸入
http://www.simoncwh.com:顯示“歡迎訪問 www.simoncwh.com”。
兩個域名共用一個 IP 和 80 端口,卻展示不同內(nèi)容,虛擬主機配置成功。
2.5 基于IP 的 Nginx 虛擬主機
給服務(wù)器配置多個 IP,每個 IP 對應(yīng)一個網(wǎng)站(比如 192.168.10.110 對應(yīng) www.yjs.com,192.168.10.40 對應(yīng) www.simoncwh.com)。
2.5.1 配置 server1
給服務(wù)器添加第二個 IP(臨時生效,重啟網(wǎng)卡后消失;想永久生效可修改網(wǎng)卡配置文件):
ifconfig ens33:0 192.168.10.40 netmask 255.255.255.0
執(zhí)行后,服務(wù)器有兩個 IP:192.168.10.110(原 IP)和 192.168.10.40(新 IP)。
編輯 nginx.conf,添加第一個 server { } 塊:
vim /usr/local/nginx/conf/nginx.conf
http {
server {
listen 192.168.10.110:80; # 監(jiān)聽第一個 IP 的 80 端口
server_name www.yjs.com;
charset utf-8;
access_log logs/www.yjs.access.log;
location / {
root /usr/local/nginx/html/yjs;
index index.html index.php;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}2.5.2 配置 server2
在 http { } 塊中添加第二個 server { } 塊,對應(yīng)新 IP:
http {
# 第二個虛擬主機
server {
listen 192.168.10.40:80; # 監(jiān)聽第二個 IP 的 80 端口
server_name www.simoncwh.com;
charset utf-8;
access_log logs/www.simoncwh.access.log;
location / {
root /usr/local/nginx/html/simoncwh;
index index.html index.php;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}2.5.3 重啟服務(wù),測試訪問
- 重啟 Nginx:
systemctl restart nginx
- 測試:
- 訪問
http://192.168.10.110:顯示www.yjs.com的首頁。 - 訪問
http://192.168.10.40:顯示www.simoncwh.com的首頁。
不同 IP 對應(yīng)不同網(wǎng)站,實現(xiàn)基于 IP 的虛擬主機。
2.6 基于端口的 Nginx 虛擬主機
同一 IP 下,用不同端口區(qū)分不同網(wǎng)站(比如 192.168.10.110:8080 對應(yīng) www.yjs.com,192.168.10.110:8888 對應(yīng) www.simoncwh.com)。
2.6.1 配置端口1
編輯 nginx.conf,添加第一個 server { } 塊,監(jiān)聽 8080 端口:
vim /usr/local/nginx/conf/nginx.conf
http {
server {
listen 192.168.10.110:8080; # 監(jiān)聽 8080 端口
server_name www.yjs.com;
charset utf-8;
access_log logs/www.yjs.access.log;
location / {
root /usr/local/nginx/html/yjs;
index index.html index.php;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}2.6.2 配置端口2
添加第二個 server { } 塊,監(jiān)聽 8888 端口:
http {
server {
listen 192.168.10.110:8888; # 監(jiān)聽 8888 端口
server_name www.simoncwh.com;
charset utf-8;
access_log logs/www.simoncwh.access.log;
location / {
root /usr/local/nginx/html/simoncwh;
index index.html index.php;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}2.6.3 重啟服務(wù),測試訪問
- 重啟 Nginx:
systemctl restart nginx
- 測試:
- 訪問
http://192.168.10.110:8080:顯示www.yjs.com的首頁。 - 訪問
http://192.168.10.110:8888:顯示www.simoncwh.com的首頁。
同一 IP 不同端口對應(yīng)不同網(wǎng)站,適合測試環(huán)境或不需要域名的場景。
總結(jié)
一、Nginx 核心配置解析
Nginx 的配置文件 nginx.conf 是功能實現(xiàn)的核心,關(guān)鍵要掌握三點:
- 全局配置:
worker_processes匹配服務(wù)器內(nèi)核,決定并發(fā)處理的“基礎(chǔ)能力”。 - I/O 事件配置:
epoll模型 +worker_connections組合,優(yōu)化并發(fā)連接處理效率。 - HTTP 與 location 配置:
root/alias/proxy_pass區(qū)分清楚,server塊綁定端口和域名,是 Web 服務(wù)的“核心規(guī)則”。
二、虛擬主機與實用功能
虛擬主機讓一臺服務(wù)器“變身”多臺,三種方式各有適用場景:
- 基于域名:最常用,適合生產(chǎn)環(huán)境(比如多個業(yè)務(wù)網(wǎng)站共用服務(wù)器)。
- 基于 IP:適合需要獨立 IP 的場景(比如 SSL 證書綁定 IP)。
- 基于端口:適合測試或內(nèi)部服務(wù)(不用申請域名,直接用端口訪問)。
此外,訪問狀態(tài)統(tǒng)計、IP 授權(quán)、密碼認(rèn)證等功能,能幫你監(jiān)控服務(wù)、保障安全。掌握這些配置后,就能靈活應(yīng)對大部分 Web 服務(wù)部署需求。
到此這篇關(guān)于Nginx配置文件解析與虛擬主機搭建過程的文章就介紹到這了,更多相關(guān)Nginx配置文件與虛擬主機搭建內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
基于nginx設(shè)置瀏覽器協(xié)商緩存過程詳解
這篇文章主要介紹了基于nginx設(shè)置瀏覽器協(xié)商緩存過程詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2019-12-12
nginx-ingress-controller部署配置詳解
這篇文章主要為大家介紹了nginx ingress controller的部署配置,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-11-11
nginx location中多個if里面proxy_pass的方法
這篇文章主要介紹了nginx location中多個if里面proxy_pass的方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11
Centos7.3 安裝部署Nginx并配置https的方法步驟
這篇文章主要介紹了Centos7.3 安裝部署Nginx并配置https的方法步驟,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-04-04

