Nginx超詳細(xì)實(shí)戰(zhàn)詳解教程
Java進(jìn)階全套教程(九)—— Nginx超詳細(xì)實(shí)戰(zhàn)詳解教程
一、Nginx核心概述
1.1 什么是Nginx
Nginx是一款高性能、輕量級(jí)、開源免費(fèi)的HTTP和反向代理服務(wù)器,同時(shí)兼具郵件代理服務(wù)器、通用TCP/UDP代理服務(wù)器功能。由俄羅斯工程師Igor Sysoev開發(fā),專為高并發(fā)、低資源消耗場(chǎng)景設(shè)計(jì),徹底解決了傳統(tǒng)Apache服務(wù)器高并發(fā)卡頓、內(nèi)存占用過高的痛點(diǎn)。
相較于傳統(tǒng)Web服務(wù)器,Nginx核心優(yōu)勢(shì)突出:內(nèi)存占用極低、毫秒級(jí)啟動(dòng)、支持?jǐn)?shù)萬(wàn)級(jí)并發(fā)連接,依托異步非阻塞、事件驅(qū)動(dòng)的核心運(yùn)行模型,成為互聯(lián)網(wǎng)企業(yè)Web服務(wù)、反向代理、負(fù)載均衡的首選中間件,廣泛應(yīng)用于電商、直播、門戶、微服務(wù)架構(gòu)等場(chǎng)景。
1.2 主流Web服務(wù)器對(duì)比
目前企業(yè)常用的Web服務(wù)器包含Apache、Tomcat、Nginx、IIS,四款服務(wù)器定位與適用場(chǎng)景差異顯著:
- Apache:老牌開源服務(wù)器,基于同步阻塞模型,穩(wěn)定性極強(qiáng),但并發(fā)能力弱,資源開銷大,適合靜態(tài)網(wǎng)站、低并發(fā)傳統(tǒng)項(xiàng)目,現(xiàn)已逐步被Nginx替代。
- Tomcat:Java專屬應(yīng)用服務(wù)器,支持JSP、Servlet運(yùn)行,主打動(dòng)態(tài)Java項(xiàng)目解析,并發(fā)性能一般,僅用于Java后端服務(wù)部署,不擅長(zhǎng)靜態(tài)資源處理。
- IIS:微軟自帶服務(wù)器,適配Windows系統(tǒng),兼容性強(qiáng),多用于Windows平臺(tái).NET項(xiàng)目,跨平臺(tái)性差、性能較弱。
- Nginx:跨平臺(tái)高性能服務(wù)器,兼顧靜態(tài)資源處理、反向代理、負(fù)載均衡,支持高并發(fā)、熱部署,無(wú)平臺(tái)限制,是目前企業(yè)主流首選。
1.3 Nginx核心運(yùn)行模型
Nginx核心采用異步非阻塞事件驅(qū)動(dòng)模型,這是其高并發(fā)能力的核心原理。區(qū)別于同步阻塞模型(一個(gè)請(qǐng)求占用一個(gè)線程,線程阻塞等待響應(yīng)),Nginx通過單個(gè)工作線程輪詢處理多個(gè)客戶端請(qǐng)求,無(wú)線程阻塞、無(wú)頻繁線程創(chuàng)建銷毀開銷。
在Linux系統(tǒng)中,Nginx默認(rèn)采用epoll高效事件池,能夠監(jiān)聽海量文件描述符,官方基準(zhǔn)測(cè)試可支撐5萬(wàn)+瞬時(shí)并發(fā)連接,生產(chǎn)環(huán)境穩(wěn)定承載2-4萬(wàn)并發(fā),且內(nèi)存占用僅為Apache的1/5左右。
二、Nginx四大核心應(yīng)用場(chǎng)景
2.1 靜態(tài)資源HTTP服務(wù)器
Nginx原生優(yōu)化了靜態(tài)資源(HTML、CSS、JS、圖片、視頻)的解析與傳輸能力,無(wú)需依賴后端程序,可獨(dú)立部署靜態(tài)網(wǎng)站。相較于Tomcat、Apache,Nginx對(duì)靜態(tài)文件的讀取、緩存、壓縮效率更高,響應(yīng)速度提升3-10倍。
適用場(chǎng)景:純靜態(tài)官網(wǎng)、資源托管服務(wù)器、前端項(xiàng)目打包部署(Vue/React靜態(tài)產(chǎn)物)。
2.2 反向代理(核心高頻場(chǎng)景)
反向代理是Nginx最核心、使用最廣泛的功能。客戶端僅訪問Nginx服務(wù)器,由Nginx代為轉(zhuǎn)發(fā)請(qǐng)求至后端真實(shí)業(yè)務(wù)服務(wù)器,處理完成后再由Nginx將結(jié)果返回客戶端。
核心價(jià)值:隱藏后端真實(shí)服務(wù)器IP與架構(gòu)、抵御網(wǎng)絡(luò)攻擊、統(tǒng)一入口管理請(qǐng)求、實(shí)現(xiàn)請(qǐng)求統(tǒng)一攔截與處理,保障后端服務(wù)安全。
正向代理與反向代理核心區(qū)別:正向代理代理客戶端(如VPN),反向代理代理服務(wù)端(Nginx核心場(chǎng)景)。
2.3 負(fù)載均衡
當(dāng)后端單臺(tái)服務(wù)器無(wú)法承載高并發(fā)請(qǐng)求時(shí),可部署多臺(tái)業(yè)務(wù)服務(wù)器集群,通過Nginx負(fù)載均衡策略,將客戶端請(qǐng)求均勻分發(fā)至集群節(jié)點(diǎn),避免單節(jié)點(diǎn)壓力過載。
核心價(jià)值:解決單機(jī)并發(fā)瓶頸、實(shí)現(xiàn)服務(wù)水平擴(kuò)容、通過節(jié)點(diǎn)故障自動(dòng)剔除實(shí)現(xiàn)服務(wù)高可用,提升項(xiàng)目整體吞吐量與穩(wěn)定性。
2.4 動(dòng)靜分離
動(dòng)靜分離是Web性能優(yōu)化的核心方案,核心思路是拆分動(dòng)態(tài)資源與靜態(tài)資源請(qǐng)求:Nginx直接處理靜態(tài)資源請(qǐng)求(圖片、樣式、腳本),動(dòng)態(tài)請(qǐng)求(JSP、接口請(qǐng)求)轉(zhuǎn)發(fā)至Tomcat、SpringBoot等后端服務(wù)。
核心價(jià)值:減輕后端業(yè)務(wù)服務(wù)器壓力、靜態(tài)資源可配置緩存與壓縮、大幅提升頁(yè)面加載速度,是企業(yè)Web項(xiàng)目性能優(yōu)化的標(biāo)配方案。
三、Nginx選型與技術(shù)優(yōu)勢(shì)
3.1 技術(shù)選型背景
傳統(tǒng)單機(jī)Tomcat架構(gòu)存在嚴(yán)重性能瓶頸:Tomcat默認(rèn)配置僅支持150左右并發(fā)連接,即便優(yōu)化硬件與JVM參數(shù),并發(fā)上限也難以突破1000。在互聯(lián)網(wǎng)高并發(fā)場(chǎng)景下,單機(jī)架構(gòu)極易出現(xiàn)請(qǐng)求超時(shí)、服務(wù)宕機(jī)問題,因此必須引入Nginx作為前置網(wǎng)關(guān),實(shí)現(xiàn)請(qǐng)求分流與性能優(yōu)化。
3.2 Nginx核心優(yōu)勢(shì)(企業(yè)選型核心原因)
- 高并發(fā)高性能:基于epoll事件模型,支持?jǐn)?shù)萬(wàn)級(jí)并發(fā),請(qǐng)求處理效率遠(yuǎn)超傳統(tǒng)服務(wù)器。
- 極低資源消耗:?jiǎn)?dòng)后常駐內(nèi)存極小,千級(jí)并發(fā)場(chǎng)景下內(nèi)存占用不足10M,CPU利用率極低。
- 開源免費(fèi)商用:完全開源,無(wú)版權(quán)費(fèi)用,對(duì)比F5、NetScaler等十萬(wàn)級(jí)硬件負(fù)載設(shè)備,大幅降低企業(yè)成本。
- 智能健康檢查:自動(dòng)檢測(cè)后端集群節(jié)點(diǎn)狀態(tài),宕機(jī)節(jié)點(diǎn)自動(dòng)剔除,恢復(fù)后自動(dòng)重新納入集群,不影響前端訪問。
- 帶寬優(yōu)化:原生支持Gzip壓縮、資源緩存,減少網(wǎng)絡(luò)傳輸數(shù)據(jù)量,節(jié)省服務(wù)器帶寬資源。
- 高穩(wěn)定性:反向代理與負(fù)載均衡場(chǎng)景下,宕機(jī)概率極低,可常年不間斷運(yùn)行。
- 熱部署熱更新:支持不停機(jī)加載配置、升級(jí)版本,實(shí)現(xiàn)業(yè)務(wù)零中斷維護(hù)。
四、Nginx環(huán)境準(zhǔn)備與依賴安裝
4.1 基礎(chǔ)環(huán)境要求
本次實(shí)戰(zhàn)基于CentOS 7.9 X64系統(tǒng),適配所有CentOS7系列版本,同時(shí)兼容主流Linux發(fā)行版(Ubuntu、Debian)。安裝前需完成四項(xiàng)環(huán)境校驗(yàn),規(guī)避安裝報(bào)錯(cuò):
- 網(wǎng)絡(luò)連通性:服務(wù)器可正常訪問外網(wǎng),用于下載依賴與Nginx源碼
- YUM源可用:配置官方Y(jié)UM源或阿里云鏡像源,保證依賴安裝正常
- 防火墻策略:關(guān)閉防火墻或放行80、443、自定義業(yè)務(wù)端口
- SELinux狀態(tài):關(guān)閉SELinux安全限制,避免權(quán)限攔截
4.2 環(huán)境校驗(yàn)實(shí)操命令
# 1. 校驗(yàn)網(wǎng)絡(luò)連通性 ping -c 4 www.baidu.com # 2. 校驗(yàn)YUM可用性 yum clean all && yum makecache # 3. 關(guān)閉防火墻(臨時(shí)+永久) systemctl stop firewalld systemctl disable firewalld # 4. 關(guān)閉SELinux(臨時(shí)+永久) setenforce 0 sed -i 's/^SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
4.3 核心依賴安裝
Nginx編譯安裝需依賴四大核心庫(kù),缺一不可,所有依賴可通過YUM一鍵安裝:
- gcc/gcc-c++:C語(yǔ)言編譯環(huán)境,用于編譯Nginx源碼
- pcre/pcre-devel:正則表達(dá)式庫(kù),支持Nginx rewrite規(guī)則解析
- zlib/zlib-devel:壓縮庫(kù),支撐Gzip壓縮功能實(shí)現(xiàn)
- openssl/openssl-devel:加密庫(kù),支持HTTPS、SSL證書配置
# 一鍵安裝所有編譯依賴 yum -y install gcc gcc-c++ make automake pcre pcre-devel zlib zlib-devel openssl openssl-devel
五、Nginx源碼編譯安裝(企業(yè)生產(chǎn)標(biāo)準(zhǔn))
5.1 版本選型規(guī)范
Nginx官網(wǎng)提供三類版本,生產(chǎn)與開發(fā)環(huán)境嚴(yán)格區(qū)分:
- Mainline Version(主線版):最新功能版,未經(jīng)過充分生產(chǎn)測(cè)試,禁止生產(chǎn)使用,僅用于功能測(cè)試
- Stable Version(穩(wěn)定版):經(jīng)過大規(guī)模生產(chǎn)驗(yàn)證,企業(yè)生產(chǎn)首選,本次選用1.24.0穩(wěn)定版
- Legacy Version(舊版):老舊維護(hù)版本,僅用于老舊項(xiàng)目兼容
5.2 源碼下載與目錄規(guī)劃
企業(yè)規(guī)范:所有源碼統(tǒng)一存放至/opt/apps目錄,安裝程序部署至/usr/local/nginx/目錄,統(tǒng)一服務(wù)器文件規(guī)范。
# 1. 創(chuàng)建源碼存放目錄 mkdir -p /opt/apps cd /opt/apps # 2. 下載Nginx1.24.0穩(wěn)定版源碼 wget http://nginx.org/download/nginx-1.24.0.tar.gz # 3. 解壓源碼包 tar -zxvf nginx-1.24.0.tar.gz cd nginx-1.24.0
5.3 編譯參數(shù)配置(完整版企業(yè)參數(shù))
編譯參數(shù)用于指定Nginx安裝路徑、日志路徑、模塊功能、運(yùn)行用戶等核心配置,以下為生產(chǎn)環(huán)境通用完整參數(shù),包含SSL、Gzip、靜態(tài)資源優(yōu)化等必備模塊:
# 創(chuàng)建臨時(shí)緩存目錄(必須手動(dòng)創(chuàng)建,否則啟動(dòng)報(bào)錯(cuò))
mkdir -p /var/temp/nginx/{client,proxy,fastcgi,uwsgi,scgi}
# 完整編譯配置命令
./configure \
--prefix=/usr/local/nginx \
--sbin-path=/usr/local/nginx/sbin/nginx \
--conf-path=/usr/local/nginx/conf/nginx.conf \
--pid-path=/usr/local/nginx/logs/nginx.pid \
--error-log-path=/usr/local/nginx/logs/error.log \
--http-log-path=/usr/local/nginx/logs/access.log \
--lock-path=/usr/local/nginx/logs/nginx.lock \
--http-client-body-temp-path=/var/temp/nginx/client \
--http-proxy-temp-path=/var/temp/nginx/proxy \
--http-fastcgi-temp-path=/var/temp/nginx/fastcgi \
--http-uwsgi-temp-path=/var/temp/nginx/uwsgi \
--http-scgi-temp-path=/var/temp/nginx/scgi \
--user=nginx \
--group=nginx \
--with-http_ssl_module \
--with-http_gzip_module \
--with-http_gzip_static_module \
--with-http_stub_status_module \
--with-http_realip_module5.4 編譯與安裝
configure執(zhí)行無(wú)報(bào)錯(cuò)后,執(zhí)行編譯安裝命令,僅首次安裝執(zhí)行make install,后續(xù)新增模塊僅需make編譯,無(wú)需重裝。
# 編譯+安裝(分步執(zhí)行,便于排查報(bào)錯(cuò)) make make install # 創(chuàng)建Nginx運(yùn)行用戶與用戶組 useradd -s /sbin/nologin nginx
六、Nginx目錄結(jié)構(gòu)詳解
安裝完成后,Nginx主目錄為/usr/local/nginx,核心四大目錄各司其職,是運(yùn)維與配置的核心重點(diǎn):
6.1 conf 配置目錄(核心目錄)
存放所有Nginx配置文件,nginx.conf為主配置文件,所有服務(wù)規(guī)則、代理、負(fù)載均衡、緩存策略均在此配置,其余為模板配置文件。
6.2 html 站點(diǎn)目錄
默認(rèn)靜態(tài)資源根目錄,包含兩個(gè)默認(rèn)頁(yè)面:index.html(默認(rèn)訪問首頁(yè))、50x.html(服務(wù)器異常報(bào)錯(cuò)頁(yè)面),可自定義靜態(tài)頁(yè)面替換。
6.3 logs 日志目錄
存放運(yùn)行日志與進(jìn)程文件,啟動(dòng)Nginx后自動(dòng)生成:access.log(正常訪問日志)、error.log(錯(cuò)誤日志)、nginx.pid(主進(jìn)程ID文件),是排查線上問題的核心依據(jù)。
6.4 sbin 命令目錄
存放Nginx可執(zhí)行程序,所有啟停、重載、校驗(yàn)命令均基于該目錄下的nginx程序執(zhí)行。
七、Docker快速部署Nginx(容器化方案)
Docker部署無(wú)需編譯環(huán)境,一鍵部署、快速擴(kuò)容,適合測(cè)試環(huán)境與容器化生產(chǎn)環(huán)境,支持目錄掛載、配置持久化。
7.1 基礎(chǔ)容器部署
# 拉取官方最新穩(wěn)定鏡像 docker pull nginx:stable # 啟動(dòng)基礎(chǔ)Nginx容器 docker run -d \ --name nginx-base \ --rm \ -p 8080:80 \ nginx:stable
7.2 持久化掛載部署(生產(chǎn)可用)
通過掛載本地目錄,實(shí)現(xiàn)配置文件、靜態(tài)資源、日志持久化,刪除容器不丟失數(shù)據(jù):
# 創(chuàng)建本地持久化目錄
mkdir -p /docker/nginx/{conf,html,logs}
# 臨時(shí)啟動(dòng)容器,拷貝默認(rèn)配置文件
docker run -d --name nginx-tmp nginx:stable
docker cp nginx-tmp:/etc/nginx/nginx.conf /docker/nginx/conf/
docker cp nginx-tmp:/etc/nginx/conf.d /docker/nginx/conf/
docker stop nginx-tmp && docker rm nginx-tmp
# 啟動(dòng)持久化Nginx容器
docker run -d \
--name nginx-prod \
-p 80:80 \
-p 443:443 \
-v /docker/nginx/conf/nginx.conf:/etc/nginx/nginx.conf \
-v /docker/nginx/conf/conf.d:/etc/nginx/conf.d \
-v /docker/nginx/html:/usr/share/nginx/html \
-v /docker/nginx/logs:/var/log/nginx \
--restart always \
nginx:stable八、Nginx服務(wù)啟停與核心命令
8.1 核心命令參數(shù)
# 查看Nginx版本 /usr/local/nginx/sbin/nginx -v # 查看詳細(xì)版本與編譯參數(shù) /usr/local/nginx/sbin/nginx -V # 校驗(yàn)配置文件語(yǔ)法(核心!修改配置后必執(zhí)行) /usr/local/nginx/sbin/nginx -t # 靜默校驗(yàn)配置(僅輸出錯(cuò)誤信息) /usr/local/nginx/sbin/nginx -q
8.2 啟停與重載操作
Nginx支持熱重載,無(wú)需停機(jī)即可更新配置,保障業(yè)務(wù)零中斷:
# 啟動(dòng)Nginx /usr/local/nginx/sbin/nginx # 快速停止(強(qiáng)制終止所有請(qǐng)求,不推薦生產(chǎn)使用) /usr/local/nginx/sbin/nginx -s stop # 平緩?fù)V梗ㄌ幚硗戤?dāng)前請(qǐng)求后關(guān)閉,生產(chǎn)推薦) /usr/local/nginx/sbin/nginx -s quit # 熱重載配置(修改配置后必用,零停機(jī)更新) /usr/local/nginx/sbin/nginx -s reload # 重啟日志文件 /usr/local/nginx/sbin/nginx -s reopen
九、Nginx核心配置塊詳解
Nginx主配置文件nginx.conf分為四大核心塊,優(yōu)先級(jí)與作用域逐層遞減,是所有功能配置的基礎(chǔ):全局塊、events塊、http塊、server塊、location塊。
9.1 全局塊(頂級(jí)作用域)
作用于整個(gè)Nginx服務(wù),配置全局運(yùn)行參數(shù),核心指令如下:
# 定義運(yùn)行Nginx的用戶與組 user nginx nginx; # 工作進(jìn)程數(shù),建議與CPU核心數(shù)一致(auto自動(dòng)適配) worker_processes auto; # 錯(cuò)誤日志路徑與日志級(jí)別(debug/info/warn/error/crit) error_log /usr/local/nginx/logs/error.log error; # 主進(jìn)程PID文件路徑 pid /usr/local/nginx/logs/nginx.pid; # 最大文件打開數(shù) worker_rlimit_nofile 65535;
9.2 events塊(事件驅(qū)動(dòng)配置)
配置Nginx工作模式與連接上限,直接決定并發(fā)能力:
events {
# 啟用Linux高效epoll事件模型
use epoll;
# 單個(gè)工作進(jìn)程最大連接數(shù)
worker_connections 10240;
# 開啟多進(jìn)程accept鎖
accept_mutex on;
# 批量接收新連接
multi_accept on;
}并發(fā)計(jì)算公式:最大并發(fā)數(shù) = worker_processes * worker_connections,反向代理場(chǎng)景需除以4(經(jīng)驗(yàn)值)。
9.3 HTTP塊(全局Web配置)
配置HTTP協(xié)議通用參數(shù)、日志格式、壓縮、超時(shí)、MIME類型等全局Web規(guī)則:
http {
# 引入資源類型配置
include mime.types;
default_type application/octet-stream;
# 自定義日志格式
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 /usr/local/nginx/logs/access.log main;
# 開啟零拷貝傳輸
sendfile on;
tcp_nopush on;
tcp_nodelay on;
# 連接超時(shí)時(shí)間
keepalive_timeout 120s 100s;
# 請(qǐng)求緩沖區(qū)配置
client_header_buffer_size 16k;
large_client_header_buffers 4 64k;
# 開啟Gzip全局壓縮
gzip on;
gzip_min_length 1k;
gzip_buffers 4 16k;
gzip_http_version 1.1;
gzip_comp_level 6;
gzip_types text/plain text/css text/js application/json application/javascript;
gzip_disable "MSIE [1-6]\.";
}9.4 Server虛擬主機(jī)塊
一個(gè)server塊對(duì)應(yīng)一個(gè)虛擬站點(diǎn),支持多站點(diǎn)共存,核心配置監(jiān)聽端口、域名、站點(diǎn)根目錄:
server {
listen 80;
server_name www.demo.com demo.com;
root /usr/local/nginx/html/demo;
index index.html index.htm index.php;
access_log /usr/local/nginx/logs/demo-access.log main;
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}9.5 Location路由匹配塊
Nginx核心路由規(guī)則,用于匹配客戶端請(qǐng)求URL,支持多種匹配模式,優(yōu)先級(jí)從高到低:
精準(zhǔn)匹配(=) > 前綴鎖定(^~) > 大小寫正則(~) > 忽略大小寫正則(~*) > 通用匹配(/)
# 精準(zhǔn)匹配根路徑
location = / {
index index.html;
}
# 鎖定靜態(tài)資源前綴,停止后續(xù)匹配
location ^~ /static/ {
root /usr/local/nginx/html;
expires 30d;
}
# 正則匹配圖片資源(區(qū)分大小寫)
location ~ \.(jpg|png|gif|ico)$ {
expires 7d;
add_header Cache-Control "public";
}
# 通用匹配所有請(qǐng)求
location / {
proxy_pass http://127.0.0.1:8080;
}十、三大虛擬主機(jī)實(shí)戰(zhàn)配置
10.1 基于IP的虛擬主機(jī)
單網(wǎng)卡綁定多IP,不同IP訪問不同站點(diǎn),適合內(nèi)網(wǎng)業(yè)務(wù)隔離場(chǎng)景:
# 1. 網(wǎng)卡配置多IP(CentOS7)
vim /etc/sysconfig/network-scripts/ifcfg-ens33
BOOTPROTO="static"
IPADDR=192.168.66.100
IPADDR1=192.168.66.101
NETMASK=255.255.255.0
GATEWAY=192.168.66.2
# 重啟網(wǎng)絡(luò)
systemctl restart network
# 2. Nginx虛擬主機(jī)配置
server {
listen 80;
server_name 192.168.66.100;
root /usr/local/nginx/html/ip100;
index index.html;
}
server {
listen 80;
server_name 192.168.66.101;
root /usr/local/nginx/html/ip101;
index index.html;
}10.2 基于域名的虛擬主機(jī)(生產(chǎn)主流)
同一IP、同一端口,通過不同域名區(qū)分站點(diǎn),適用于多官網(wǎng)、多業(yè)務(wù)部署:
# hosts域名映射(本地測(cè)試)
192.168.66.100 www.frontend.com
192.168.66.100 www.backend.com
# 前端站點(diǎn)配置
server {
listen 80;
server_name www.frontend.com;
root /usr/local/nginx/html/frontend;
index index.html;
}
# 后端站點(diǎn)配置
server {
listen 80;
server_name www.backend.com;
root /usr/local/nginx/html/backend;
index index.html;
}10.3 基于端口的虛擬主機(jī)
同一IP、不同端口部署不同服務(wù),適合內(nèi)部測(cè)試系統(tǒng)、后臺(tái)管理系統(tǒng):
server {
listen 8088;
server_name 192.168.66.100;
root /usr/local/nginx/html/test8088;
index index.html;
}
server {
listen 9099;
server_name 192.168.66.100;
root /usr/local/nginx/html/test9099;
index index.html;
}十一、Nginx核心模塊實(shí)戰(zhàn)
11.1 Rewrite地址重寫模塊
通過正則匹配實(shí)現(xiàn)URL重定向、域名跳轉(zhuǎn)、地址標(biāo)準(zhǔn)化,支持301永久重定向、302臨時(shí)重定向:
# 1. 舊域名永久跳轉(zhuǎn)新域名
server {
listen 80;
server_name old.com www.old.com;
rewrite ^/(.*)$ https://www.new.com/$1 permanent;
}
# 2. 偽靜態(tài)配置(動(dòng)態(tài)URL轉(zhuǎn)靜態(tài)URL)
location / {
rewrite ^/article-(\d+)\.html$ /article.php?id=$1 last;
}
# 3. 目錄跳轉(zhuǎn)
location /admin {
rewrite ^/admin$ /admin/index.html redirect;
}11.2 If條件判斷模塊
支持基于IP、請(qǐng)求方式、瀏覽器標(biāo)識(shí)、參數(shù)的條件攔截與定制化配置:
# 禁止POST請(qǐng)求訪問靜態(tài)資源
location ~ \.(html|js|css)$ {
if ($request_method = POST) {
return 405;
}
}
# 攔截指定IP訪問
if ($remote_addr = "192.168.66.200") {
return 403;
}
# 攔截爬蟲訪問
if ($http_user_agent ~* (spider|crawler)) {
return 403;
}11.3 瀏覽器緩存優(yōu)化
通過expires與Cache-Control配置靜態(tài)資源緩存,減少重復(fù)請(qǐng)求,提升訪問速度:
server {
listen 80;
server_name www.demo.com;
# 圖片、視頻緩存30天
location ~ \.(jpg|png|gif|mp4|ico)$ {
expires 30d;
add_header Cache-Control "max-age=2592000, public";
}
# JS、CSS緩存7天
location ~ \.(js|css)$ {
expires 7d;
add_header Cache-Control "max-age=604800, public";
}
# HTML禁止緩存,保證實(shí)時(shí)更新
location ~ \.(html|htm)$ {
add_header Cache-Control "no-cache, no-store, must-revalidate";
add_header Pragma "no-cache";
expires -1;
}
}11.4 防盜鏈配置
基于Referer請(qǐng)求頭攔截非法盜鏈,保護(hù)服務(wù)器資源,防止流量被盜用:
location ~ \.(jpg|png|gif|js|css)$ {
# 允許空Referer、本機(jī)、合法域名訪問
valid_referers none blocked www.demo.com demo.com 192.168.66.100;
# 非法請(qǐng)求返回403
if ($invalid_referer) {
return 403;
}
}11.5 跨域問題解決
前端跨域請(qǐng)求報(bào)錯(cuò)核心解決方案,配置全局跨域響應(yīng)頭:
location / {
add_header Access-Control-Allow-Origin *;
add_header Access-Control-Allow-Methods GET,POST,PUT,DELETE,OPTIONS;
add_header Access-Control-Allow-Headers DNT,X-Requested-With,Content-Type,Authorization;
# 處理預(yù)檢請(qǐng)求
if ($request_method = OPTIONS) {
return 204;
}
proxy_pass http://127.0.0.1:8080;
}十二、Nginx高階企業(yè)實(shí)戰(zhàn)場(chǎng)景
12.1 動(dòng)靜分離實(shí)戰(zhàn)
分離靜態(tài)、動(dòng)態(tài)請(qǐng)求,Nginx處理靜態(tài)資源,Tomcat處理動(dòng)態(tài)接口,極致優(yōu)化性能:
upstream tomcat_cluster {
server 192.168.66.102:8080 weight=5;
server 192.168.66.103:8080 weight=5;
}
server {
listen 80;
server_name www.demo.com;
# 靜態(tài)資源直接由Nginx處理
location ~ \.(html|js|css|jpg|png|gif|ico)$ {
root /usr/local/nginx/static;
expires 10d;
}
# 動(dòng)態(tài)請(qǐng)求轉(zhuǎn)發(fā)至Tomcat集群
location ~ \.(jsp|do|action)$ {
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_pass http://tomcat_cluster;
}
# 通用接口請(qǐng)求轉(zhuǎn)發(fā)
location /api/ {
proxy_pass http://tomcat_cluster;
}
}12.2 負(fù)載均衡完整配置
支持權(quán)重、IP哈希、故障轉(zhuǎn)移,實(shí)現(xiàn)后端服務(wù)高可用:
http {
# 定義后端服務(wù)集群
upstream backend_cluster {
# 權(quán)重配置,weight越大分發(fā)請(qǐng)求越多
server 192.168.66.102:8080 weight=3 max_fails=3 fail_timeout=10s;
server 192.168.66.103:8080 weight=2 max_fails=3 fail_timeout=10s;
# 備用節(jié)點(diǎn),主節(jié)點(diǎn)全部故障時(shí)啟用
server 192.168.66.104:8080 backup;
}
server {
listen 80;
server_name www.demo.com;
location / {
# 轉(zhuǎn)發(fā)請(qǐng)求至集群
proxy_pass http://backend_cluster;
# 保留真實(shí)客戶端信息
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# 超時(shí)配置
proxy_connect_timeout 5s;
proxy_send_timeout 10s;
proxy_read_timeout 10s;
# 故障轉(zhuǎn)移
proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
}
}
}12.3 限流防護(hù)實(shí)戰(zhàn)
基于漏桶算法實(shí)現(xiàn)請(qǐng)求速率限流、并發(fā)連接限流,防護(hù)突發(fā)流量與CC攻擊:
http {
# 速率限流:?jiǎn)蜪P每秒1次請(qǐng)求,緩沖區(qū)5個(gè)
limit_req_zone $binary_remote_addr zone=req_limit:10m rate=1r/s;
# 并發(fā)限流:?jiǎn)蜪P最大10個(gè)并發(fā)連接
limit_conn_zone $binary_remote_addr zone=conn_limit:10m;
server {
listen 80;
server_name www.demo.com;
location / {
# 啟用速率限流
limit_req zone=req_limit burst=5 nodelay;
# 啟用并發(fā)限流
limit_conn conn_limit 10;
proxy_pass http://backend_cluster;
}
}
}12.4 緩存加速實(shí)戰(zhàn)
配置Nginx代理緩存,緩存后端接口響應(yīng)數(shù)據(jù),大幅提升重復(fù)請(qǐng)求響應(yīng)速度:
http {
# 緩存路徑、層級(jí)、內(nèi)存空間、過期時(shí)間
proxy_cache_path /var/nginx/cache levels=1:2 keys_zone=api_cache:100m inactive=7d max_size=5G;
server {
listen 80;
server_name www.demo.com;
location /api/data/ {
# 啟用緩存
proxy_cache api_cache;
# 200/304狀態(tài)碼緩存10分鐘
proxy_cache_valid 200 304 10m;
# 自定義緩存key
proxy_cache_key "$host$request_uri$args";
# 緩存狀態(tài)響應(yīng)頭
add_header Nginx-Cache "$upstream_cache_status";
proxy_pass http://backend_cluster;
}
# 手動(dòng)清理緩存接口(僅本機(jī)訪問)
location /purge/cache {
allow 127.0.0.1;
deny all;
proxy_cache_purge api_cache $host$request_uri$args;
}
}
}十三、Nginx高可用架構(gòu)(Nginx+Keepalived)
13.1 架構(gòu)原理
單臺(tái)Nginx存在單點(diǎn)故障風(fēng)險(xiǎn),通過Keepalived實(shí)現(xiàn)雙機(jī)熱備:主節(jié)點(diǎn)正常工作,備節(jié)點(diǎn)待命,主節(jié)點(diǎn)故障時(shí),虛擬VIP自動(dòng)漂移至備節(jié)點(diǎn),實(shí)現(xiàn)服務(wù)無(wú)感知切換。
13.2 環(huán)境規(guī)劃
- 主Nginx:192.168.66.100(MASTER)
- 備Nginx:192.168.66.101(BACKUP)
- 虛擬VIP:192.168.66.99
13.3 Keepalived核心配置
主節(jié)點(diǎn)配置 /etc/keepalived/keepalived.conf:
! Configuration File for keepalived
global_defs {
router_id nginx_master
}
# Nginx狀態(tài)檢測(cè)腳本
vrrp_script chk_nginx {
script "/etc/keepalived/nginx_check.sh"
interval 2
weight -20
}
vrrp_instance VI_1 {
state MASTER
interface ens33
virtual_router_id 120
priority 100
advert_int 1
nopreempt
authentication {
auth_type PASS
auth_pass 123456
}
track_script {
chk_nginx
}
virtual_ipaddress {
192.168.66.99/24
}
}備節(jié)點(diǎn)配置僅修改 state BACKUP、priority 80,其余參數(shù)與主節(jié)點(diǎn)一致。
13.4 健康檢測(cè)腳本
創(chuàng)建 /etc/keepalived/nginx_check.sh,實(shí)現(xiàn)Nginx宕機(jī)自動(dòng)切換:
#!/bin/bash
# 統(tǒng)計(jì)Nginx進(jìn)程數(shù)
NGINX_NUM=$(ps -C nginx --no-header | wc -l)
# 無(wú)進(jìn)程則重啟Nginx
if [ $NGINX_NUM -eq 0 ];then
/usr/local/nginx/sbin/nginx
sleep 2
# 重啟失敗則關(guān)閉keepalived,觸發(fā)VIP漂移
if [ $(ps -C nginx --no-header | wc -l) -eq 0 ];then
systemctl stop keepalived
fi
fi腳本授權(quán):chmod 755 /etc/keepalived/nginx_check.sh
十四、Nginx HTTPS證書企業(yè)級(jí)配置實(shí)戰(zhàn)
14.1 HTTPS核心原理與前置準(zhǔn)備
HTTPS基于SSL/TLS協(xié)議對(duì)HTTP數(shù)據(jù)加密傳輸,端口默認(rèn)443,可解決明文傳輸、數(shù)據(jù)篡改、中間人劫持問題,是網(wǎng)站合規(guī)、瀏覽器安全訪問的必備配置。Nginx實(shí)現(xiàn)HTTPS依賴編譯時(shí)的openssl模塊,前文編譯流程已默認(rèn)集成,無(wú)需重新編譯。
證書類型分為兩類:免費(fèi)域名證書(Let’s Encrypt、阿里云免費(fèi)證書,適合中小企業(yè)官網(wǎng))、付費(fèi)OV/EV證書(適合金融、電商等高危場(chǎng)景),證書文件核心包含.pem/.crt公鑰文件、.key私鑰文件。
前置準(zhǔn)備:域名已完成備案、服務(wù)器防火墻放行443端口、證書文件上傳至服務(wù)器固定目錄。
14.2 證書目錄規(guī)范與文件部署
企業(yè)統(tǒng)一規(guī)范:在Nginx配置目錄下創(chuàng)建ssl專屬目錄,統(tǒng)一存放所有域名證書,便于管理和續(xù)期:
# 創(chuàng)建證書統(tǒng)一存放目錄 mkdir -p /usr/local/nginx/conf/ssl # 上傳證書文件(示例:域名demo.com) # 上傳后目錄包含:demo.com.pem(公鑰)、demo.com.key(私鑰) # 授權(quán)證書目錄權(quán)限,防止權(quán)限過高報(bào)錯(cuò) chmod 600 /usr/local/nginx/conf/ssl/* chown nginx:nginx /usr/local/nginx/conf/ssl/*
14.3 完整HTTPS站點(diǎn)配置(生產(chǎn)最優(yōu))
配置包含SSL加密參數(shù)優(yōu)化、兼容主流瀏覽器、開啟會(huì)話復(fù)用、強(qiáng)制HTTPS跳轉(zhuǎn),適配生產(chǎn)環(huán)境所有場(chǎng)景:
# 80端口強(qiáng)制跳轉(zhuǎn)HTTPS
server {
listen 80;
server_name www.demo.com demo.com;
# 301永久重定向,SEO友好
return 301 https://$host$request_uri;
}
# 443 HTTPS核心配置
server {
listen 443 ssl;
server_name www.demo.com demo.com;
root /usr/local/nginx/html/demo;
index index.html index.htm;
# 配置證書公鑰、私鑰路徑
ssl_certificate /usr/local/nginx/conf/ssl/demo.com.pem;
ssl_certificate_key /usr/local/nginx/conf/ssl/demo.com.key;
# SSL性能與安全優(yōu)化參數(shù)(生產(chǎn)必配)
ssl_protocols TLSv1.2 TLSv1.3; # 禁用老舊不安全協(xié)議
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
ssl_prefer_server_ciphers on; # 優(yōu)先使用服務(wù)器加密套件
ssl_session_cache shared:SSL:10m; # 開啟SSL會(huì)話緩存
ssl_session_timeout 10m; # 會(huì)話緩存過期時(shí)間
ssl_buffer_size 4k; # 優(yōu)化傳輸緩沖區(qū)大小
# 瀏覽器HTTPS安全強(qiáng)化
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
add_header X-Frame-Options DENY; # 防止頁(yè)面被嵌套劫持
add_header X-Content-Type-Options nosniff;
# 日志配置
access_log /usr/local/nginx/logs/https-demo-access.log main;
error_log /usr/local/nginx/logs/https-demo-error.log error;
# 靜態(tài)資源緩存、反向代理等業(yè)務(wù)配置沿用原有規(guī)則
location ~ \.(jpg|png|gif|js|css)$ {
expires 10d;
}
}14.4 多域名HTTPS共存配置
單服務(wù)器多域名獨(dú)立HTTPS證書部署,互不沖突,適配多站點(diǎn)業(yè)務(wù)場(chǎng)景:
# 站點(diǎn)1:www.frontend.com
server {
listen 80;
server_name www.frontend.com;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl;
server_name www.frontend.com;
ssl_certificate /usr/local/nginx/conf/ssl/frontend.com.pem;
ssl_certificate_key /usr/local/nginx/conf/ssl/frontend.com.key;
# 通用SSL優(yōu)化參數(shù)省略,同上
}
# 站點(diǎn)2:www.backend.com
server {
listen 80;
server_name www.backend.com;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl;
server_name www.backend.com;
ssl_certificate /usr/local/nginx/conf/ssl/backend.com.pem;
ssl_certificate_key /usr/local/nginx/conf/ssl/backend.com.key;
# 通用SSL優(yōu)化參數(shù)省略,同上
}14.5 證書自動(dòng)續(xù)期方案(免費(fèi)證書必備)
Let’s Encrypt等免費(fèi)證書有效期僅90天,需配置定時(shí)任務(wù)自動(dòng)續(xù)期,避免證書過期導(dǎo)致網(wǎng)站無(wú)法訪問:
# 1. 安裝續(xù)期工具 yum install -y certbot # 2. 手動(dòng)續(xù)期測(cè)試 certbot renew --dry-run # 3. 配置定時(shí)任務(wù),每日凌晨2點(diǎn)自動(dòng)檢測(cè)續(xù)期 crontab -e # 寫入以下內(nèi)容 0 2 * * * /usr/bin/certbot renew && /usr/local/nginx/sbin/nginx -s reload
十五、Nginx線上高頻報(bào)錯(cuò)排查方案
本節(jié)匯總生產(chǎn)環(huán)境最常見的Nginx報(bào)錯(cuò),包含報(bào)錯(cuò)現(xiàn)象、根因分析、完整解決辦法,覆蓋啟動(dòng)報(bào)錯(cuò)、訪問異常、HTTPS報(bào)錯(cuò)、代理轉(zhuǎn)發(fā)報(bào)錯(cuò)四大類場(chǎng)景。
15.1 啟動(dòng)/重載報(bào)錯(cuò)
報(bào)錯(cuò)1:nginx: [emerg] mkdir() “/var/temp/nginx/client” failed (2: No such file or directory)
報(bào)錯(cuò)原因:編譯配置中指定的臨時(shí)緩存目錄不存在,首次安裝后未手動(dòng)創(chuàng)建目錄。
解決方案:執(zhí)行命令批量創(chuàng)建所需臨時(shí)目錄,重新重載配置:
mkdir -p /var/temp/nginx/{client,proxy,fastcgi,uwsgi,scgi}
/usr/local/nginx/sbin/nginx -t
/usr/local/nginx/sbin/nginx -s reload報(bào)錯(cuò)2:nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
報(bào)錯(cuò)原因:80端口被Nginx殘留進(jìn)程、Apache、httpd等服務(wù)占用,端口沖突。
解決方案:排查端口占用、終止殘留進(jìn)程:
# 查看80端口占用進(jìn)程 netstat -tulpn | grep 80 # 強(qiáng)制終止占用進(jìn)程 kill -9 進(jìn)程ID # 關(guān)閉沖突服務(wù) systemctl stop httpd && systemctl disable httpd # 重啟Nginx /usr/local/nginx/sbin/nginx
報(bào)錯(cuò)3:nginx: [emerg] user “nginx” does not exist
報(bào)錯(cuò)原因:配置文件中指定的nginx運(yùn)行用戶未創(chuàng)建。
解決方案:創(chuàng)建無(wú)登錄權(quán)限的系統(tǒng)用戶:
useradd -s /sbin/nologin nginx /usr/local/nginx/sbin/nginx -s reload
15.2 HTTPS專屬報(bào)錯(cuò)
報(bào)錯(cuò)1:nginx: [emerg] SSL_CTX_use_certificate_file(…) failed (SSL: error:02001002:system library:fopen:No such file or directory)
報(bào)錯(cuò)原因:證書文件路徑錯(cuò)誤、文件缺失、文件名大小寫不匹配、證書目錄權(quán)限不足。
解決方案:核對(duì)配置文件證書路徑、檢查文件完整性、修正權(quán)限:
# 核對(duì)證書文件是否存在 ls /usr/local/nginx/conf/ssl/ # 修正目錄與文件權(quán)限 chmod 600 /usr/local/nginx/conf/ssl/* chown nginx:nginx /usr/local/nginx/conf/ssl/* # 重載配置 nginx -s reload
報(bào)錯(cuò)2:瀏覽器提示“您的連接不是私密連接”/證書已過期
報(bào)錯(cuò)原因:證書過期、域名不匹配、服務(wù)器系統(tǒng)時(shí)間錯(cuò)誤、證書鏈不完整。
解決方案:1. 核對(duì)證書有效期,過期則重新上傳新證書并重載;2. 確保配置域名與證書綁定域名一致;3. 同步服務(wù)器時(shí)間;4. 補(bǔ)充完整證書鏈文件。
# 同步系統(tǒng)時(shí)間 ntpdate time.aliyun.com
報(bào)錯(cuò)3:nginx: [emerg] unknown directive “ssl” in nginx.conf
報(bào)錯(cuò)原因:Nginx編譯時(shí)未添加--with-http_ssl_module模塊,不支持HTTPS功能。
解決方案:重新編譯Nginx,新增SSL模塊,保留原有配置:
復(fù)用前文5.3節(jié)完整編譯參數(shù),執(zhí)行make編譯,無(wú)需make install,編譯完成后替換二進(jìn)制文件即可。
15.3 訪問狀態(tài)異常報(bào)錯(cuò)
報(bào)錯(cuò)1:403 Forbidden 訪問禁止
常見原因:1. 站點(diǎn)目錄權(quán)限不足,nginx用戶無(wú)讀取權(quán)限;2. 目錄無(wú)默認(rèn)首頁(yè)文件;3. SELinux未關(guān)閉;4. 防盜鏈規(guī)則攔截。
解決方案:逐層排查修復(fù):
# 1. 關(guān)閉SELinux(永久生效) sed -i 's/^SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config && setenforce 0 # 2. 修正站點(diǎn)目錄權(quán)限 chmod -R 755 /usr/local/nginx/html chown -R nginx:nginx /usr/local/nginx/html # 3. 檢查是否存在index.html默認(rèn)文件 #
到此這篇關(guān)于Nginx超詳細(xì)實(shí)戰(zhàn)詳解教程的文章就介紹到這了,更多相關(guān)Nginx實(shí)戰(zhàn)詳解內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Nginx反向代理實(shí)現(xiàn)支持長(zhǎng)連接詳解
這篇文章主要給大家介紹了關(guān)于Nginx反向代理實(shí)現(xiàn)支持長(zhǎng)連接的相關(guān)資料,文字介紹的非常詳細(xì),對(duì)大家具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面跟著小編一起來(lái)學(xué)習(xí)學(xué)習(xí)吧。2017-06-06
nginx轉(zhuǎn)發(fā)內(nèi)網(wǎng)圖片的代碼示例
這篇文章主要給大家介紹了nginx轉(zhuǎn)發(fā)內(nèi)網(wǎng)圖片,文章通過代碼示例介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作有一定的幫助,感興趣的小伙伴可以自己動(dòng)手試一下2023-10-10
Nginx服務(wù)器中強(qiáng)制使用緩存的配置及緩存優(yōu)先級(jí)的講解
這篇文章主要介紹了Nginx服務(wù)器中強(qiáng)制使用緩存的配置及緩存優(yōu)先級(jí)的講解,一定程度上可以幫助大家解決Nginx不緩存或緩存失效的問題,需要的朋友可以參考下2016-01-01
使用nginx+tomcat+keepalived實(shí)現(xiàn)高可用的詳細(xì)步驟
這篇文章主要介紹了nginx+tomcat+keepalived實(shí)現(xiàn)高可用,包括安裝nginx服務(wù)的步驟,詳細(xì)介紹了安裝keepalived的方法,對(duì)nginx+tomcat+keepalived高可用相關(guān)知識(shí)感興趣的朋友一起看看吧2022-03-03

