歡迎來到藍(lán)隊(duì)云小課堂
一、Nginx 介紹
Nginx 是一款輕量級的 Web 服務(wù)器 / 反向代理服務(wù)器及電子郵件(IMAP/POP3)代理服務(wù)器。它由俄羅斯的程序設(shè)計(jì)師 Igor Sysoev 所開發(fā),自 2004 年發(fā)布以來,憑借其高性能、低內(nèi)存消耗、高并發(fā)處理能力等特點(diǎn),迅速在 Web 服務(wù)器領(lǐng)域嶄露頭角。Nginx 可以高效地處理靜態(tài)資源,如 HTML、CSS、JavaScript 文件和圖片等,同時(shí)通過反向代理功能,將客戶端請求轉(zhuǎn)發(fā)到后端的應(yīng)用服務(wù)器,實(shí)現(xiàn)負(fù)載均衡,提高整個(gè)系統(tǒng)的可用性和性能。它廣泛應(yīng)用于各類大型網(wǎng)站、高流量應(yīng)用以及云服務(wù)平臺(tái)等場景。
二、Nginx 配置基礎(chǔ)
(一)配置文件結(jié)構(gòu)剖析
Nginx 的配置文件通常為nginx.conf,其結(jié)構(gòu)清晰,主要由以下幾個(gè)部分組成:
全局塊:從配置文件開始到events塊之間的部分,用于設(shè)置一些影響 Nginx 全局運(yùn)行的指令,如運(yùn)行用戶、工作進(jìn)程數(shù)等。
events 塊:主要用于配置 Nginx 的網(wǎng)絡(luò)連接相關(guān)的事件處理,如選擇事件驅(qū)動(dòng)模型、設(shè)置每個(gè)工作進(jìn)程的最大連接數(shù)等。
http 塊:這是 Nginx 配置中最為核心的部分,用于配置 HTTP 服務(wù)器相關(guān)的參數(shù),如文件類型映射、日志記錄、gzip 壓縮等。在http塊中還可以包含多個(gè)server塊。
server 塊:每個(gè)server塊代表一個(gè)虛擬主機(jī),用于配置特定網(wǎng)站或應(yīng)用的相關(guān)參數(shù),如監(jiān)聽端口、服務(wù)器名稱、訪問日志等。在server塊中又可以包含多個(gè)location塊。
location 塊:用于匹配特定的 URL 路徑,并對其進(jìn)行相應(yīng)的配置,如設(shè)置根目錄、代理轉(zhuǎn)發(fā)等。
(二)常用配置指令詳解
全局配置指令
user:指定 Nginx 工作進(jìn)程運(yùn)行的用戶和用戶組,例如user nginx nginx;,以確保服務(wù)器的安全性。
worker_processes:設(shè)置 Nginx 的工作進(jìn)程數(shù),一般建議設(shè)置為與服務(wù)器 CPU 核心數(shù)相同,以充分利用 CPU 資源,如worker_processes pid:指定 Nginx 進(jìn)程 ID 文件的路徑,方便管理和監(jiān)控 Nginx 進(jìn)程,如pid /var/run/nginx.pid;。
error_log:設(shè)置錯(cuò)誤日志的路徑和級別,有助于排查服務(wù)器運(yùn)行過程中出現(xiàn)的問題,如error_log /var/log/nginx/error.log warn;。
事件配置指令
use:選擇 Nginx 的事件驅(qū)動(dòng)模型,常見的有epoll(適用于 Linux 系統(tǒng))、kqueue(適用于 FreeBSD 等系統(tǒng))等,如use epoll;,以提高服務(wù)器的性能。
worker_connections:設(shè)置每個(gè)工作進(jìn)程能夠處理的最大連接數(shù),結(jié)合服務(wù)器性能和業(yè)務(wù)需求合理設(shè)置,如worker_connections 1024;。
accept_mutex:開啟或關(guān)閉 Nginx 的 “接受鎖”,防止多個(gè)工作進(jìn)程同時(shí)接受新連接時(shí)可能出現(xiàn)的 “驚群” 現(xiàn)象,默認(rèn)開啟,如accept_mutex on;。
HTTP 配置指令
include:用于包含其他配置文件,方便管理和維護(hù),如include /etc/nginx/mime.types;,引入文件類型映射表。
default_type:設(shè)置默認(rèn)的 MIME 類型,當(dāng)服務(wù)器無法識別文件類型時(shí)使用,如default_type application/octet-stream;。
sendfile:開啟高效的文件傳輸模式,減少磁盤 I/O 開銷,提高文件傳輸效率,如sendfile on;。
keepalive_timeout:設(shè)置客戶端與服務(wù)器之間的長連接超時(shí)時(shí)間,如keepalive_timeout 65;。
gzip:開啟 gzip 壓縮功能,減少數(shù)據(jù)傳輸量,提高網(wǎng)站訪問速度,如gzip on;,并可進(jìn)一步配置壓縮級別等參數(shù)。
Server 配置指令
listen:指定服務(wù)器監(jiān)聽的端口,如listen 80;,監(jiān)聽 HTTP 協(xié)議的 80 端口。
server_name:設(shè)置服務(wù)器的名稱,可以是域名或 IP 地址,如server_name example.com;。
access_log:指定訪問日志的路徑和格式,用于記錄客戶端的訪問信息,如access_log /var/log/nginx/access.log main;。
error_log:在server塊中設(shè)置的錯(cuò)誤日志,僅記錄當(dāng)前虛擬主機(jī)相關(guān)的錯(cuò)誤信息,覆蓋http塊中的全局錯(cuò)誤日志設(shè)置。
Location 配置指令
匹配規(guī)則:location通過不同的匹配符號來確定匹配規(guī)則。例如,=表示精確匹配,~表示區(qū)分大小寫的正則表達(dá)式匹配,~*表示不區(qū)分大小寫的正則表達(dá)式匹配,^~表示普通字符串匹配,且一旦匹配成功,不再進(jìn)行其他正則表達(dá)式匹配。
常用指令:
root:設(shè)置請求的根目錄,如root /usr/share/nginx/html;,當(dāng)訪問/路徑時(shí),會(huì)從該目錄下查找對應(yīng)的文件。
alias:用于替換路徑,與root略有不同,如alias /data/www/;,可以將特定的 URL 路徑映射到不同的文件目錄。
proxy_pass:實(shí)現(xiàn)代理轉(zhuǎn)發(fā)功能,將匹配的請求轉(zhuǎn)發(fā)到后端服務(wù)器,如proxy_pass http://www.tjdsmy.cn_server;。
三、Nginx 進(jìn)階配置實(shí)例
(一)反向代理配置
假設(shè)我們有一個(gè)后端應(yīng)用服務(wù)器運(yùn)行在www.tjdsmy.cn:8080,希望通過 Nginx 將對example.com的請求轉(zhuǎn)發(fā)到該后端服務(wù)器。配置如下:
server {
listen 80;
server_name example.com;
location / {
proxy_pass http://www.tjdsmy.cn:8080;
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;
}
}
在上述配置中,proxy_pass指令將請求轉(zhuǎn)發(fā)到http://www.tjdsmy.cn:8080,同時(shí)通過proxy_set_header指令設(shè)置了一些請求頭信息,以便后端服務(wù)器能夠正確處理請求。
(二)負(fù)載均衡配置
假設(shè)有三個(gè)后端服務(wù)器backend1、backend2、backend3,分別運(yùn)行在192.168.1.10:80、192.168.1.11:80、192.168.1.12:80,我們使用 Nginx 的輪詢負(fù)載均衡策略將請求分發(fā)到這三個(gè)服務(wù)器上。配置如下:
upstream backend_servers {
server 192.168.1.10:80;
server 192.168.1.11:80;
server 192.168.1.12:80;
}
server {listen 80;
server_name example.com;
location / {
proxy_pass http://www.tjdsmy.cn_servers;
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;
}
}
這里通過upstream指令定義了后端服務(wù)器集群,Nginx 會(huì)按照輪詢的方式依次將請求分發(fā)到各個(gè)后端服務(wù)器上。
(三)動(dòng)靜分離配置
為了提高網(wǎng)站性能,我們將靜態(tài)資源(如圖片、CSS、JavaScript 文件)和動(dòng)態(tài)請求(如 PHP、Python 等應(yīng)用程序的請求)分開處理。假設(shè)靜態(tài)資源存放在/var/www/static目錄下,動(dòng)態(tài)請求由后端的 FastCGI 服務(wù)器處理。配置如下:
server {
listen 80;
server_name example.com;
location /static/ {
root /var/www/;
expires 30d;
access_log off;
}
location / {
fastcgi_pass 127.0.0.1:9000;
fastcgi_param SCRIPT_FILENAME /var/www/html$fastcgi_script_name;
include fastcgi_params;
}
}
在上述配置中,/static/路徑下的請求會(huì)被 Nginx 直接從/var/www/static目錄中讀取靜態(tài)資源,并設(shè)置了緩存過期時(shí)間為 30 天,同時(shí)關(guān)閉了該路徑的訪問日志。而其他請求則通過fastcgi_pass轉(zhuǎn)發(fā)到后端的 FastCGI 服務(wù)器進(jìn)行處理。
(四)HTTPS 配置
為了實(shí)現(xiàn)網(wǎng)站的安全訪問,我們需要為 Nginx 配置 HTTPS。首先,需要獲取 SSL 證書,假設(shè)證書文件為example.com.crt和example.com.key,存放在/etc/nginx/ssl目錄下。配置如下:
server {
listen 443 ssl;
server_name example.com;
ssl_certificate /etc/nginx/ssl/example.com.crt;
ssl_certificate_key /etc/nginx/ssl/example.com.key;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
location / {
# 正常的業(yè)務(wù)邏輯配置
}
}
上述配置中,listen 443 ssl表示監(jiān)聽 443 端口并啟用 SSL 加密,ssl_certificate和ssl_certificate_key指定了證書文件的路徑,同時(shí)通過ssl_protocols和ssl_ciphers指令設(shè)置了支持的 SSL 協(xié)議版本和加密算法。
四、Nginx 配置優(yōu)化技巧
(一)性能優(yōu)化
調(diào)整工作進(jìn)程數(shù):根據(jù)服務(wù)器的 CPU 核心數(shù)合理設(shè)置worker_processes,充分利用 CPU 資源,提高并發(fā)處理能力。
優(yōu)化連接數(shù):通過合理設(shè)置worker_connections,增加每個(gè)工作進(jìn)程能夠處理的最大連接數(shù),同時(shí)結(jié)合keepalive_timeout等參數(shù),優(yōu)化連接的復(fù)用和管理,減少連接建立和銷毀的開銷。
啟用高效文件傳輸:開啟sendfile指令,采用高效的文件傳輸模式,減少磁盤 I/O 操作,提高文件傳輸效率。
啟用 gzip 壓縮:根據(jù)業(yè)務(wù)需求合理配置gzip指令,對傳輸?shù)臄?shù)據(jù)進(jìn)行壓縮,減少網(wǎng)絡(luò)帶寬消耗,加快頁面加載速度。
(二)安全優(yōu)化
關(guān)閉版本信息顯示:在http塊中添加server_tokens off;指令,避免在響應(yīng)頭中暴露 Nginx 的版本信息,降低被攻擊的風(fēng)險(xiǎn)。
設(shè)置訪問控制:通過location塊結(jié)合allow和deny指令,限制特定 IP 或 IP 段的訪問,如只允許某些內(nèi)部 IP 訪問管理后臺(tái)頁面。
防止惡意請求:利用limit_req和limit_conn指令,設(shè)置請求頻率限制和連接數(shù)限制,防止惡意用戶通過大量請求對服務(wù)器進(jìn)行攻擊。
五、Nginx 配置常見問題與解決
配置文件語法錯(cuò)誤:在修改 Nginx 配置文件后,使用nginx -t命令檢查語法是否正確。如果出現(xiàn)語法錯(cuò)誤,根據(jù)錯(cuò)誤提示信息仔細(xì)檢查配置文件中的指令拼寫、符號使用等問題。
服務(wù)器無法啟動(dòng):可能是端口被占用、配置文件錯(cuò)誤或權(quán)限不足等原因?qū)е?。使用netstat -tlnp命令檢查端口占用情況,確保 Nginx 監(jiān)聽的端口未被其他程序占用。同時(shí),檢查配置文件的權(quán)限是否正確,確保 Nginx 進(jìn)程有足夠的權(quán)限讀取配置文件和訪問相關(guān)資源。
代理轉(zhuǎn)發(fā)異常:如果代理轉(zhuǎn)發(fā)出現(xiàn)問題,檢查proxy_pass指令的目標(biāo)地址是否正確,后端服務(wù)器是否正常運(yùn)行。同時(shí),注意檢查proxy_set_header設(shè)置的請求頭信息是否符合后端服務(wù)器的要求。
藍(lán)隊(duì)云官網(wǎng)上擁有完善的技術(shù)支持庫可供參考,大家可自行查閱,更多技術(shù)問題,可以直接咨詢。同時(shí),藍(lán)隊(duì)云整理了運(yùn)維必備的工具包免費(fèi)分享給大家使用,需要的朋友可以直接咨詢。
更多技術(shù)知識,藍(lán)隊(duì)云期待與你一起探索。