nginx學習筆記一:基礎概念
1、什么是nginx
Nginx (engine x) 是一個高性能的HTTP和反向代理web服務器,同時也提供了IMAP/POP3/SMTP服務。
特點:占用內存小、并發能力強。
2、nginx的基本概念:反向代理
正向代理:
- 比喻:你(客戶端)自己訂不到位置,于是你委托一個朋友(正向代理)幫你去訂座和取餐。餐廳(目標服務器)并不知道真正吃飯的人是你,它只認為是你的朋友在消費。
- 技術解釋:正向代理代表客戶端(你)去訪問外部網絡的服務器,客戶端明確知道自己要通過這個代理來發送請求
- 作用:①緩存加速 ②隱藏客戶端身份 ③訪問控制與過濾
- 代理對象是客戶端
反向代理:
- 比喻:那家餐廳(服務器)太火了,直接去門口會擠爆。于是餐廳設置了一個前臺接待員(反向代理)。你(客戶端)不需要知道后廚有多少廚師,你只需要把訂單給這個接待員。接待員會幫你把訂單分給不忙的廚師,最后把做好的菜送給你。對你來說,接待員就代表了整個餐廳。
- 技術解釋:反向代理是代表服務器接收客戶端的請求,客戶端以為反向代理就是真正的服務器,完全不知道背后還有一群服務器(服務器集群)
- 作用:①負載均衡 ②隱藏服務器身份 ③加密與SSL加速 ④緩存靜態內容 ⑤統一入口
- 代理對象是服務器
3、nginx的基本概念:負載均衡
當一臺服務器無法應對大量用戶請求時,我們會使用多臺服務器組成一個服務器集群(Cluster)。負載均衡器就是這個集群的“交通警察”或“調度員”,它坐在所有服務器前面,將涌入的請求智能地分發到各個服務器上,以避免任何一臺服務器過載。
- upstream模塊
在nginx中,負載均衡的核心配置是 upstream 模塊,你首先需要定義一個服務器組(也稱為“上游服務器”組)。

- 負載均衡算法/策略:Nginx支持多種分發請求的策略
- 輪詢:按順序逐一分配(默認)
- 權重:給服務器指定權重,權重越高,接收的請求越多

??3.IP哈希:根據客戶端的IP地址計算一個哈希指,將同一個IP請求轉發到同一后端服務器,可以解決會話保持的問題。

??4.最少連接:把請求轉發給連接數最少的那臺后端服務器,盡可能實現負載均衡

- 完整配置示例
將 upstream模塊和server模塊結合,配置反向代理,實現負載均衡

- 健康檢查
??Nginx 開源版默認通過被動健康檢查。如果它嘗試將請求轉發到一臺服務器失敗(連接超時、拒絕連接等),它會標記該服務器為故障狀態,并在一段時間內停止向它發送請求。
??商業版 Nginx Plus 提供了更強大的主動健康檢查功能,可以定期向后端服務器發送特定請求(如 /health)來檢查其健康狀況。
- 總結:Nginx是一個功能強大、性能極高的“流量分發器”,它讓你的web應用能夠輕松地橫向擴展,處理海量用戶請求,并保證服務的高可用性。
4、nginx的基本概念:動靜分離
1.什么是動靜分離
動靜分離指將網站中的靜態資源(如 HTML、CSS、JavaScript、圖片、字體、視頻等)與動態內容(由 PHP、Java、Python、Node.js 等程序生成的頁面)分開處理,使用不同的服務器或策略來提供服務。
- 靜態資源:內容固定,無論誰、在何時訪問,得到的文件都是一樣的。比如logo.png,style.css
- 動態內容:內容會根據用戶、時間、數據庫狀態等因素變化。比如淘寶的商品頁面、知乎的推薦流。
Nginx在其中扮演的核心角色是:做一個高效的“流量分揀員”和“靜態資源服務員”
2.為什么要做動靜分離
1)極大提升性能
- Nginx 處理靜態資源的效率極高,遠超任何應用服務器(如 Tomcat, Apache httpd with PHP, Django)。因為它專為 I/O 密集型操作優化,使用異步非阻塞模型。
- 讓應用服務器(如 Tomcat)只專注于處理動態請求和業務邏輯,減輕了其 I/O 壓力,使其能更高效地利用 CPU 和內存
2)降低應用負載
- 一個網站中通常 80% 以上的請求都是針對靜態資源的。如果所有這些請求都穿透到后端的 Tomcat/PHP,應用服務器需要耗費大量資源去讀取文件并輸出,這是一種巨大的浪費
- 動靜分離后,絕大部分請求被 Nginx 直接處理并返回,應用服務器的負載驟降
3)便于擴展和緩存
- 橫向擴展:靜態資源可以非常容易地部署在 CDN 上,或者使用獨立的、專門的文件服務器集群。
- 緩存優化:可以針對靜態資源設置非常長的緩存時間(如一年),通過Expires 或 Cache-Control 頭信息,讓瀏覽器主動緩存。這樣用戶再次訪問時甚至不需要發起請求,速度極快。
4)提升用戶體驗
- 頁面加載速度更快,特別是圖片、CSS等資源,直接決定了用戶感知到的速度
3.如何用Nginx實現動靜分離
Nginx實現動靜分離主要依靠 location 指令,通過匹配不同的文件后綴(如.jpg .css)將請求引導到不同的地方。
場景1:最簡單的分離(靜態資源存放在本地服務器)靜態文件和nginx在同一臺服務器上

工作流程:
- 用戶訪問 com/image/logo.png。
- Nginx 發現請求的 URL 匹配 .*\.png,進入第二個 location。
- Nginx 直接從本地磁盤的 /path/to/your/static/files/image/logo.png讀取文件。
- Nginx 將該文件發送給用戶,并告訴瀏覽器可以緩存 30 天。
場景二:更徹底的分離(靜態服務器存放在另一臺服務器)
為了更極致的性能和擴展性,可以把靜態資源放到完全獨立的服務器或存儲(如 NFS、對象存儲)上。這時 Nginx 的角色更像是反向代理。

4.一個比喻說明動靜分離:一個大型快遞分揀中心
- 所有包裹(用戶請求)先送到分揀中心(Nginx)
- 分揀機器人會掃描包裹地址
- 如果地址是動態生成部(如 /api/user),機器人就把包裹扔到通往“動態生成工廠”(Tomcat)的傳送帶上。工廠工人辛苦計算后,生成一個定制包裹,再通過分揀中心發回給用戶。
- 如果地址是“標準件倉庫”(如 /static/logo.png),機器人就直接從身后的標準件大倉庫(本地磁盤或文件服務器)里取出一個現成的包裹,直接發給用戶,速度極快。
這樣“動態生成工廠”的工人們就不用浪費時間跑去倉庫取標準件了,可以專心致志地做復雜的定制工作,整個系統的效率自然大大提高
總結:
??核心思想:讓專業的工具處理專業的事情,Nginx處理靜態,應用服務器處理動態
??實現方法:使用 location 指令根據URL后綴或路徑進行匹配和分流
??關鍵配置:root(指定本地路徑)proxy_pass(轉發請求)expires(設置瀏覽器緩存)
5、nginx在linux上的安裝(包管理器安裝)
1.更新系統包:sudo yum update -y
2.安裝nginx
??# 安裝EPEL倉庫:sudo yum install epel-release -y
??# 添加nginx官方倉庫:sudo vi /etc/yum.repos.d/nginx.repo 配置文件
??# 安裝:sudo yum install nginx -y
3.啟動nginx并設置開機自啟
??# 啟動 Nginx 服務:sudo systemctl start nginx
??# 設置開機自動啟動:sudo systemctl enable nginx
??# 查看服務狀態,驗證是否啟動成功:sudo systemctl status nginx
4.配置防火墻:開放HTTP(80)和HTTPS(443)端口
??# 開放 80 端口 (HTTP):sudo firewall-cmd --zone=public --add-port=80/tcp --permanent
??# 開放 443 端口 (HTTPS):sudo firewall-cmd --zone=public --add-port=443/tcp --permanent
??# 重新加載防火墻規則:sudo firewall-cmd --reload
5.驗證安裝:在瀏覽器中輸入你的服務器 IP 地址(如 http://你的服務器IP)。如果看到 Nginx 的默認歡迎頁面,說明安裝成功。
6、nginx常用命令
前提條件:進入nginx的目錄:/安裝目錄/nginx/sbin
- 查看nginx版本號:./nginx -v
- 啟動nginx:./nginx
- 關閉nginx:./nginx -s stop
- 重新加載nginx:./nginx -s reload 如修改conf需要生效但不想重啟時使用
7、nginx的配置文件
配置文件位置:/安裝目錄/nginx/conf/nginx.conf
Nginx配置文件的組成部分:
全局塊、events塊、http塊、server塊、location塊、upstream塊
- 全局塊
- 配置影響nginx整體運行的參數
- 常見指令:
- worker_processes:工作進程數,通常設置為 CPU 核心數或 auto。
- error_log:錯誤日志的位置和級別(如 debug, info, notice, warn, error, crit等)。
- pid:存儲 Nginx 主進程 ID 的文件路徑。
- events塊
- 配置網絡連接相關的參數,對性能影響較大
- 常見指令
- worker_connections:每個工作進程的最大連接數。
- use:指定使用的事件驅動模型,如 epoll(Linux 高效模型)。
- multi_accept:是否允許一個工作進程同時接受多個新連接,高并發時建議開啟。
- http塊
- 最常用的配置部分,代理、緩存、日志、第三方模塊都在此配置
- 常用指令
- include:引入其他配置文件,如 types(定義文件擴展名與 MIME 類型的映射)。
- default_type:設置默認的 MIME 類型。
- sendfile:是否啟用 sendfile 系統調用,用于高效傳輸文件,建議開啟。
- keepalive_timeout:設置客戶端連接保持活動狀態的時間。
- gzip:是否開啟 Gzip 壓縮以減少傳輸數據量。
- access_log 和 log_format:配置訪問日志的存儲路徑和格式。
- server塊
- 配置虛擬主機的參數,一個http塊可以包含多個server塊
- 常用指令
- listen:監聽的端口。
- server_name:虛擬主機名,用于匹配請求的 Host 頭。
- root:該 server 塊的根目錄。
- index:設置默認索引文件。
- Location塊
- 基于請求URI進行匹配,用于處理特定的請求
- 指令
- root:指定該 location 的根目錄(會覆蓋 server 塊的 root)。
- alias:定義路徑別名。
- proxy_pass:將請求反向代理到指定的上游服務器或協議地址。
- try_files:嘗試按順序查找文件,直到找到為止,常用于前端路由或重寫。
- location 的匹配規則和優先級很重要:
-
- = /path:精確匹配,優先級最高。
- ^~ /path/:前綴匹配,如果該規則匹配,則不再檢查正則表達式。
- ~ pattern:區分大小寫的正則表達式匹配。
- ~* pattern:不區分大小寫的正則表達式匹配。
- /path/:普通前綴匹配,優先級最低。
優先級順序一般為:精確匹配 (=) > 前綴匹配 (^~) > 正則匹配 (~, ~*) > 普通前綴匹配。
6.upsteam塊
-
- 定義后端服務器組,只要用于負載均衡配置
- 指令:
- server:定義后端服務器地址及其參數(如權重 weight)。
- ip_hash:實現會話保持,確保同一客戶端 IP 的請求分發到同一后端服務器。
- 負載均衡算法還包括輪詢(默認)、weight(權重)、least_conn(最少連接)等
8、nginx的配置示例
- 靜態資源服務:expires 指令告訴瀏覽器緩存這些文件30天

- 反向代理和負載均衡

upstream 塊定義了一組后端服務器,并設置了權重;
proxy_pass指令將所有匹配此 location 的請求轉發到 my_backend 服務器組;
proxy_set_header 指令確保后端服務器能獲取到客戶端的真實 IP 等信息
- 處理PHP請求

此配置匹配所有以.php結尾的請求,
fastcgi_pass 指令將請求轉發給處理 PHP 的 FastCGI 進程;
fastcgi_param 設置必要的參數,特別是 SCRIPT_FILENAME,告訴 PHP-FPM 要執行的文件路徑。
浙公網安備 33010602011771號