NGINX簡介
Nginx(發音為 “engine x”)是一款由俄羅斯程序員 Igor Sysoev 開發的?輕量級、高性能的 HTTP 和反向代理服務器,同時也是一個 IMAP/POP3/SMTP 代理服務器。自 2004 年首次發布以來,Nginx 憑借其?高并發處理能力、低內存消耗和穩定性,成為全球最受歡迎的 Web 服務器之一,廣泛應用于靜態資源服務、反向代理、負載均衡、API 網關等場景
NGINX安裝
源碼編譯
#解壓壓縮包
tar zxf nginx-1.24.0.tar.gzcd nginx-1.24.0
#編譯
./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_ssl_module --
with-http_v2_module --with-http_realip_module --with-http_stub_status_module --with-pcre --
with-stream --with-stream_ssl_module --with-stream_realip_module
make
make install
使用make和makeinstall編譯和安裝
驗證版本以及編譯參數
查看版本信息
自定義版本(在編譯前編輯文件)
#編輯版本相關文件
[root@Webserver nginx-1.26.1]# vim src/core/nginx.h#define NGINX_VERSION ""
#define NGINX_VER "xixihaha/" NGINX_VERSION
重新編譯后查看版本信息
平滑升級
服務器運行時要進行升級,此時不能停止服務器,我們可以進行平滑升級---即不停止服務器的情況下進行升級
將新版本編譯和make后不用makeinstall
[root@Nginx sbin]# cd /usr/local/nginx/sbin/
[root@Nginx sbin]# cp -p nginx nginx.old
[root@Nginx sbin]# /usr/bin/cp -f /mnt/nginx-1.26.1/objs/nginx /usr/local/nginx/sbin/nginx
[root@Nginx sbin]# ps aux | grep nginx
root 37705 0.0 0.1 9868 2052 ? Ss 16:04 0:00 nginx: master process ./nginx
nginx 37706 0.0 0.2 14200 5124 ? S 16:04 0:00 nginx: worker process
root 40854 0.0 0.1 6408 2304 pts/0 S+ 16:20 0:00 grep --color=auto nginx
[root@Nginx sbin]# kill -USR2 37705
[root@Nginx sbin]# kill -WINCH 37705
[root@Nginx sbin]# ps aux | grep nginx
root 37705 0.0 0.1 9868 2564 ? Ss 16:04 0:00 nginx: master process ./nginx
root 40857 0.0 0.3 9876 6528 ? S 16:20 0:00 nginx: master process ./nginx
nginx 40858 0.0 0.2 14208 4996 ? S 16:20 0:00 nginx: worker process
root 40862 0.0 0.1 6408 2304 pts/0 S+ 16:21 0:00 grep --color=auto nginx
[root@Nginx sbin]# nginx -V
nginx version: nginx/1.26.1
built by gcc 11.4.1 20231218 (Red Hat 11.4.1-3) (GCC)
built with OpenSSL 3.0.7 1 Nov 2022
TLS SNI support enabled
configure arguments: --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_ssl_module --with-http_v2_module ip_module --with-http_stub_status_module --with-http_gzip_static_module --with-pcre --with-stream --with-stream_ssl_modm_realip_module
使用sysstemctl控制nginx
#編輯/lib/systemd/system/nginx.service文件
[root@Webserver ~]# cd /lib/systemd/system
[root@Webserver system]# vim nginx.service
#配置文件內容
[Unit]
Description=The NGINX HTTP and reverse proxy server
After=syslog.target network.target remote-fs.target nss-lookup.target[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid #指定pid
ExecStartPre=/usr/local/nginx/sbin/nginx -t #在主服務啟動之前執行的命令
ExecStart=/usr/local/nginx/sbin/nginx #啟動服務的核心進程
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true[Install]
WantedBy=multi-user.target
NGINX核心配置
nginx主配置文件
main block:主配置段,即全局配置段#事件驅動相關的配置
event {
...
}#http/https 作為web服務器相關配置段
http {
...
}#默認配置文件不包括下面兩個部分
#mail 作為郵件服務器相關配置段
mail {
...
}#stream 反向代理相關配置段
stream {
...
}
全局配置參數
/usr/local/nginx/conf/nginx.conf
http塊參數
[root@nginx ~]# vim /usr/local/nginx/conf/nginx.conf
http {#在響應報文中將指定的文件擴展名映射至MIME對應的類型include mime.types; #可以識別文本,圖像,音頻,視頻等其他的數據default_type application/octet-stream; #沒有識別的默認類型,例如php,ngxin不識別需要安裝php才能渲染呈現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; #使用定義為main的日志格式,存放在根目錄的logs/access.log中sendfile on; #零拷貝功能,sendfile系統調用在兩個文件描述符之間直接傳遞數據(完全在內核中操作)#tcp_nopush on;#keepalive_timeout 0;keepalive_timeout 65; #長連接超時時間,單位是s#gzip on; #開啟壓縮功能server {#web服務配置}include "/usr/local/nginx/conf.d/*.conf"; #導入其他路徑的配置文件,子配置文件#要放在默認發布文件目錄下,不然會覆蓋默認
核心配置塊
c10k高并發
[root@Webserver ~]# vim /usr/local/nginx/conf/nginx.conf
[root@Webserver ~]#vim /usr/local/nginx/conf/nginx.conf
[root@Webserver ~]#vim /etc/security/limits.conf
安裝測試壓力工具以及測試
[root@Nginx sbin]# dnf install httpd-tools -y
[root@Nginx sbin]# ab -n 100000 -c 5000 http://172.25.254.10/index.html
基于域名的web站點發布
root和alias
root:指定web的家目錄,在定義location的時候,文件的絕對路徑等于 root+location
示例:
alias:定義路徑別名,會把訪問的路徑重新定義到其指定的路徑,文檔映射的另一種機制;僅能用于 location上下文,此指令使用較少
示例:
location詳細使用
location指令用于匹配請求 URI,其匹配規則可分為匹配模式和優先級兩部分
匹配模式 | 符號 | 規則 | 優先級 |
精確匹配 | = | 規則:僅匹配與uri 完全一致的請求,不包含子路徑 | 最優先 |
前綴匹配 | ^~ | 規則:匹配以uri 為前綴的請求,一旦匹配成功,不再檢查正則匹配 | 其次 |
正則匹配 | ~或~* ~是區分大小寫的 ~*是不區分大小寫的 | 規則:按正則表達式匹配 URI,僅匹配完整路徑中符合正則的部分 | 再其次 |
一般匹配 | 無符號 | 規則:匹配以uri 為前綴的請求,但優先級低于正則匹配,會先檢查正則匹配再判斷 | 最不優先 |
示例:
假設配置如下
location = / { ... } # 1. 精確匹配 /
location ^~ /static/ { ... } # 2. 前綴匹配 /static/ 及子路徑
location ~ \.php$ { ... } # 3. 正則匹配 .php 結尾的請求
location /test { ... } # 4. 普通前綴匹配 /test 及子路徑
當訪問/時匹配精準匹配
當訪問/static/css/style.css匹配前綴匹配
當訪問/index.php時會匹配正則匹配
當訪問/test/abc會匹配普通匹配
賬戶認證
賬戶認證是一種通過用戶名和密碼驗證訪問者身份的安全機制,常用于限制對特定網頁、目錄或整個網站的訪問,適用于內部系統、后臺管理界面等需要權限控制的場景
配置文件:
實驗效果:
自定義錯誤頁面
自定義錯誤頁面是指通過配置 Nginx,將默認的錯誤提示頁面(如 404、500 等)替換為自定義設計的頁面,以提升用戶體驗、保持網站風格一致性,甚至傳遞品牌信息或引導用戶操作
創建錯誤頁面
子配置文件內容:
效果:
自定義錯誤日志
自定義錯誤日志是指通過配置,對錯誤日志的存儲路徑、記錄格式、日志級別等進行個性化設置,以便更高效地監控、排查和分析服務器運行過程中出現的錯誤
配置文件:
效果:
檢測文件是否存在
當檢測的文件不存在時會顯示指定的內容
測試效果:
長連接
長連接(Persistent Connection)是指客戶端與服務器建立一次 TCP 連接后,可在該連接上發送多個 HTTP 請求,而無需每次請求都重新建立連接,從而減少連接建立 / 關閉的開銷,提升通信效率。這一機制在 HTTP/1.1 中默認啟用,是優化 Web 性能的重要手段
長連接一般在主配置文件中配置
NGINX高級配置
nginx狀態頁
狀態頁是 Nginx 提供的一個內置功能,用于展示當前 Nginx 服務器的實時運行狀態信息,如連接數、請求處理情況、worker 進程狀態等。它通過?ngx_http_stub_status_module
?模塊實現,是監控 Nginx 性能和排查問題的重要工具
[root@Webserver ~]# vim /usr/local/nginx/conf.d/jie.conf
location /status {stub_status;auth_basic "login pwsswd";auth_basic_user_file /usr/local/nginx/.htpasswd;}
測試:
壓縮功能
通過對發送給客戶端的數據進行壓縮,有效減少數據傳輸量,進而提升網站訪問速度,優化用戶體驗,同時還能降低服務器帶寬消耗
? [root@Webserver ~]# vim /usr/local/nginx/conf/nginx.confkeepalive_timeout ?60;keepalive_requests 120;gzip on;gzip_comp_level 4;gzip_disable "MSIE [1-6]\.";gzip_min_length 4k;gzip_vary on;
測試效果:
NGINX變量使用
使用nginx的變量需要在編譯時添加模塊
常用內置變量
$remote_addr | 客戶端的 IP 地址 |
$args | 請求中的查詢字符串(即 URL 中? 后面的部分) |
$document_root | 當前請求對應的 Nginx 配置中的root 指令指定的文檔根目錄 |
$document_uri | 與$request_uri 類似,是當前請求的 URI,不包含域名部分 |
$host | 請求頭中的Host 字段值 |
$http_user_agent | 客戶端的用戶代理字符串,包含客戶端的瀏覽器、操作系統等信息 |
$request_filename | 當前請求的文件路徑,結合root 或alias 指令生成 |
$scheme | 請求使用的協議,通常是http ?或?https |
$http_cookie | 客戶端發送的Cookie 請求頭內容 |
$cookie_key2 | 獲取客戶端Cookie 中名為key2 ?的值 |
$http_Accept | 客戶端發送的Accept 請求頭內容,表明客戶端能夠接受的響應內容類型 |
自定義變量
Nginx Rewrite相關功能
riwrite簡介
Nginx服務器利用 ngx_http_rewrite_module 模塊解析和處理rewrite請求
此功能依靠 PCRE(perl compatible regular expression),因此編譯之前要安裝PCRE庫
rewrite是nginx服務器的重要功能之一,用于實現URL的重寫,URL的重寫是非常有用的功能
比如它可以在我們改變網站結構之后,不需要客戶端修改原來的書簽,也無需其他網站修改我們的 鏈接,就可以設置為訪問
另外還可以在一定程度上提高網站的安全性。
ngx_http_rewrite_module 模塊指令
if
if
?指令用于根據指定條件執行一系列重寫或配置操作,類似于編程語言中的條件判斷語句。它允許根據請求的屬性(如 URL、請求頭、變量等)動態調整 Nginx 的處理邏輯,是實現 URL 重寫、訪問控制、動態配置等功能的核心工具
set
set
?指令用于定義或修改變量,這些變量可在后續的配置邏輯(如?if
?判斷、rewrite
?重寫、請求頭設置等)中引用,是實現動態配置和邏輯處理的重要工具
break
break
?指令用于終止當前作用域內的重寫規則(rewrite
)執行,并停止后續其他重寫相關指令的處理,直接按當前 URI 繼續處理請求。它的核心作用是控制重寫流程,避免不必要的規則重復執行
return
return
?指令用于直接終止請求處理流程,并向客戶端返回指定的 HTTP 狀態碼、重定向 URL 或響應內容。它是實現跳轉、訪問控制、錯誤處理等功能的常用指令,作用于請求處理的任意階段,一旦執行就會立即結束當前請求的處理
常用狀態碼:
200:成功(常用于返回簡單響應內容)
301:永久重定向(瀏覽器會緩存跳轉關系,適合永久遷移的 URL)
302:臨時重定向(默認,瀏覽器不緩存,適合臨時跳轉)
403:禁止訪問(常用于權限控制)
404:資源不存在(可自定義錯誤頁面或直接返回)
503:服務暫時不可用(常用于過載保護或維護)
示例:
強制使用加密的https
server {listen 80;server_name example.com;# 所有 HTTP 請求永久重定向到 HTTPSreturn 301 https://www.jie.org;
}
rewrite
通過正則表達式的匹配來改變URI,可以同時存在一個或多個指令,按照順序依次對URI進行匹配, rewrite主要是針對用戶請求的URL或者是URI做具體處理
正則表達式:
. #匹配除換行符以外的任意字符
\w #匹配字母或數字或下劃線或漢字
\s #匹配任意的空白符
\d #匹配數字
\b #匹配單詞的開始或結束
^ #匹配字付串的開始
$ #匹配字符串的結束
* #匹配重復零次或更多次
+ #匹配重復一次或更多次
? #匹配重復零次或一次
(n) #匹配重復n次
{n,} #匹配重復n次或更多次
{n,m} #匹配重復n到m次
*? #匹配重復任意次,但盡可能少重復
+? #匹配重復1次或更多次,但盡可能少重復
?? #匹配重復0次或1次,但盡可能少重復
{n,m}? #匹配重復n到m次,但盡可能少重復
{n,}? #匹配重復n次以上,但盡可能少重復
\W #匹配任意不是字母,數字,下劃線,漢字的字符
\S #匹配任意不是空白符的字符
\D #匹配任意非數字的字符
\B #匹配不是單詞開頭或結束的位置
[^x] #匹配除了x以外的任意字符
[^jie] #匹配除了jie 這幾個字母以外的任意字符
rewrite flag 使用介紹
用于控制重寫規則執行后的處理流程,決定是否繼續執行其他規則、是否重新匹配?location
?等。合理使用?flag
?可以精準控制 URL 重寫的邏輯,避免不必要的規則循環或錯誤跳轉
redirect;
#臨時重定向,重寫完成后以臨時重定向方式直接返回重寫后生成的新URL給客戶端
#由客戶端重新發起請求;使用相對路徑,或者http://或https://開頭,狀態碼:302permanent;
#重寫完成后以永久重定向方式直接返回重寫后生成的新URL給客戶端
#由客戶端重新發起請求,狀態碼:301break;
#重寫完成后,停止對當前URL在當前location中后續的其它重寫操作
#而后直接跳轉至重寫規則配置塊之后的其它配置,結束循環,建議在location中使用
#適用于一個URL一次重寫last;
#重寫完成后,停止對當前URI在當前location中后續的其它重寫操作,
#而后對新的URL啟動新一輪重寫檢查,不建議在location中使用
#適用于一個URL多次重寫,要注意避免出現超過十次以及URL重寫后返回錯誤的給用戶
redirect與permanent區別
redirect(臨時重定向)瀏覽器會臨時記錄新 URL,但下次請求原 URL 時,仍會向服務器確認最新地址。搜索引擎不會更新原 URL 的索引,仍會保留原 URL 的權重和排名。通常指HTTP 302 Found(或 307 Temporary Redirect)狀態碼,表示請求的資源臨時轉移到了新的 URL。
permanent(永久重定向)瀏覽器會永久緩存新 URL,下次請求原 URL 時,會直接跳轉到新地址,不再向服務器確認。搜索引擎會更新索引,將原 URL 的權重和排名轉移到新 URL,原 URL 會逐漸從搜索結果中消失。對應HTTP 301 Moved Permanently狀態碼,表示請求的資源永久轉移到了新的 URL。
動靜分離
兩臺后端服務器一臺靜態一臺動態
配置文件
緩存
配置方法:
測試效果:
緩存前:
緩存后:
二次開發
編譯 ??
[root@Webserver openresty-1.25.3.1]# ./configure --prefix=/usr/local/openresty --user=nginx --group=nginx --with-http_ssl_module --with-http_v2_module --with-http_realip_module --with-http_stub_status_module --with-http_gzip_static_module --with-pcre --with-stream --with-stream_ssl_module --with-stream_realip_module[root@Webserver openresty-1.25.3.1]# gmake && gmake install
訪問效果: