Nginx 配置與實(shí)戰(zhàn)
Nginx 是開(kāi)源、高性能、高可靠的 Web 和反向代理服務(wù)器,而且支持熱部署,幾乎可以做到 7 * 24 小時(shí)不間斷運(yùn)行,即使運(yùn)行幾個(gè)月也不需要重新啟動(dòng),還能在不間斷服務(wù)的情況下對(duì)軟件版本進(jìn)行熱更新。性能是 Nginx 最重要的考量,其占用內(nèi)存少、并發(fā)能力強(qiáng)、能支持高達(dá) 5w 個(gè)并發(fā)連接數(shù),最重要的是, Nginx 是免費(fèi)的并可以商業(yè)化,配置使用也比較簡(jiǎn)單。
Nginx特點(diǎn):
? 高并發(fā)、高性能;
? 模塊化架構(gòu)使得它的擴(kuò)展性非常好;
? 異步非阻塞的事件驅(qū)動(dòng)模型這點(diǎn)和 Node.js 相似;
? 相對(duì)于其它服務(wù)器來(lái)說(shuō)它可以連續(xù)幾個(gè)月甚至更長(zhǎng)而不需要重啟服務(wù)器使得它具有高可靠性;
? 熱部署、平滑升級(jí);
? 完全開(kāi)源,生態(tài)繁榮;
一、配置(nginx.conf)
nginx.conf 配置文件的語(yǔ)法規(guī)則:
? 配置文件由指令與指令塊構(gòu)成;
? 每條指令以;分號(hào)結(jié)尾,指令與參數(shù)間以空格符號(hào)分隔;
? 指令塊以{}大括號(hào)將多條指令組織在一起;
?include語(yǔ)句允許組合多個(gè)配置文件以提升可維護(hù)性;
? 通過(guò)#符號(hào)添加注釋?zhuān)岣呖勺x性;
? 通過(guò)$符號(hào)使用變量;
? 部分指令的參數(shù)支持正則表達(dá)式,例如常用的 location 指令.
Nginx 的典型配置示例:
202503112016964
? main 全局配置,對(duì)全局生效;
? events 配置影響 Nginx 服務(wù)器與用戶的網(wǎng)絡(luò)連接;
? http 配置代理,緩存,日志定義等絕大多數(shù)功能和第三方模塊的配置;
? server 配置虛擬主機(jī)的相關(guān)參數(shù),一個(gè) http 塊中可以有多個(gè) server 塊;
? location 用于配置匹配的 uri ;
? upstream 配置后端服務(wù)器具體地址,負(fù)載均衡配置不可或缺的部分;
| | | | --- | --- | | |#1. main段配置信息 | | | user nginx; #運(yùn)行用戶,默認(rèn)即是nginx,可以不進(jìn)行設(shè)置 | | | worker_processes auto; #Nginx 進(jìn)程數(shù),一般設(shè)置為和 CPU 核數(shù)一樣 | | | error_log /var/log/nginx/error.log warn; #Nginx 的錯(cuò)誤日志存放目錄 | | | pid /var/run/nginx.pid; #Nginx 服務(wù)啟動(dòng)時(shí)的 pid 存放位置 | | | | | |#2. events段配置信息 | | | events { | | | use epoll; #使用epoll的I/O模型(缺省會(huì)自動(dòng)選擇一個(gè)最適合你操作系統(tǒng)的) | | | worker_connections 1024; #每個(gè)進(jìn)程允許最大并發(fā)數(shù) | | | } | | | | | |#3. http段配置信息 | | |#配置使用最頻繁的部分,代理、緩存、日志定義等絕大多數(shù)功能和第三方模塊的配置都在這里設(shè)置 | | | http { | | |#設(shè)置日志模式 | | | 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 /var/log/nginx/access.log main; #Nginx訪問(wèn)日志存放位置 | | | | | | sendfile on; #開(kāi)啟高效傳輸模式 | | | tcp_nopush on; #減少網(wǎng)絡(luò)報(bào)文段的數(shù)量 | | | tcp_nodelay on; | | | keepalive_timeout 65; #保持連接的時(shí)間,也叫超時(shí)時(shí)間,單位秒 | | | types_hash_max_size 2048; | | | | | | include /etc/nginx/mime.types; #文件擴(kuò)展名與類(lèi)型映射表 | | | default_type application/octet-stream; #默認(rèn)文件類(lèi)型 | | | | | |#4. server段配置信息 | | | server { | | | listen 80; #配置監(jiān)聽(tīng)的端口 | | | server_name localhost; #配置的域名 | | | | | |#5. location段配置信息 | | | location / { | | | root /usr/share/nginx/html; #網(wǎng)站根目錄 | | | index index.html index.htm; #默認(rèn)首頁(yè)文件 | | | deny 172.168.22.11; #禁止訪問(wèn)的ip地址,可以為all | | | allow 172.168.33.44; #允許訪問(wèn)的ip地址,可以為all | | | } | | | | | | error_page 500 502 503 504 /50x.html; #默認(rèn)50x對(duì)應(yīng)的訪問(wèn)頁(yè)面 | | | error_page 400 404 error.html; #同上 | | | } | | | | | |#加載子配置項(xiàng) | | | include /etc/nginx/conf.d/*.conf; | | | } |
1.1 內(nèi)置變量
nginx 常用的內(nèi)置全局變量,你可以在配置中隨意使用,點(diǎn)此查看效果:內(nèi)置變量實(shí)例演示
| 變量 | 說(shuō)明 |
| $args | 請(qǐng)求中的參數(shù),例: baidu.com/?a=1&b=1 中的a和b |
| $content_length | HTTP 請(qǐng)求信息里的"Content-Length" |
| $content_type | HTTP 請(qǐng)求信息里的"Content-Type" |
| $document_root | nginx 虛擬主機(jī)配置文件中的 root 參數(shù)對(duì)應(yīng)的值 |
| $document_uri | 當(dāng)前請(qǐng)求中不包含指令的 URI |
| $host | 主機(jī)頭,也就是域名 |
| $http_user_agent | 客戶端的詳細(xì)信息,也就是瀏覽器的標(biāo)識(shí) |
| $http_cookie | 客戶端的 cookie 信息 |
| $limit_rate | 如果 nginx服務(wù)器使用limit_rate 配置了顯示網(wǎng)絡(luò)速率,則會(huì)顯示,如果沒(méi)有設(shè)置,則顯示0 |
| $remote_addr | 客戶端的公網(wǎng)ip |
| $remote_user | 如果 nginx有配置認(rèn)證,該變量代表客戶端認(rèn)證的用戶名 |
| $request_body_file | 做反向代理時(shí)發(fā)給后端服務(wù)器的本地資源的名稱 |
| $request_method | 請(qǐng)求資源的方式,GET /PUT /DELETE等 |
| $request_filename | 當(dāng)前請(qǐng)求的資源文件的路徑名稱 |
| $request_uri | 請(qǐng)求的鏈接,包括args |
| $scheme | 請(qǐng)求的協(xié)議,如ftp, http, https |
| $server_addr | 服務(wù)器IP地址 |
| $server_name | 服務(wù)器的主機(jī)名 |
| $server_port | 服務(wù)器的端口號(hào) |
1.2 全局配置
1.2.1 main 段核心參數(shù)
| | | | --- | --- | | |#1. user: 指定運(yùn)行 Nginx 的 woker 子進(jìn)程的屬主和屬組,其中組可以不指定。 | | |#語(yǔ)法:user USERNAME [GROUP] | | | user nginx lion; #用戶是nginx; 組是lion | | | | | |#2. pid: 指定運(yùn)行 Nginx master 主進(jìn)程的 pid 文件存放路徑。 | | | pid /opt/nginx/logs/nginx.pid; #master主進(jìn)程的的pid存放在nginx.pid的文件 | | | | | |#3. worker_rlimit_nofile_number: 指定worker子進(jìn)程可以打開(kāi)的最大文件句柄數(shù)。 | | | worker_rlimit_nofile 20480; #可以理解成每個(gè)worker子進(jìn)程的最大連接數(shù)量。 | | | | | |#4. worker_rlimit_core: 指定 worker 子進(jìn)程異常終止后的 core 文件,用于記錄分析問(wèn)題。 | | | worker_rlimit_core 50M; #存放大小限制 | | | working_directory /opt/nginx/tmp; #存放目錄 | | | | | |#5. worker_processes_number:指定 Nginx 啟動(dòng)的 worker 子進(jìn)程數(shù)量。 | | | worker_processes 4; #指定具體子進(jìn)程數(shù)量 | | | worker_processes auto; #與當(dāng)前cpu物理核心數(shù)一致 | | | | | |#6. worker_cpu_affinity:將每個(gè) worker 子進(jìn)程與我們的 cpu 物理核心綁定。 | | | worker_cpu_affinity 0001 0010 0100 1000; #4個(gè)物理核心,4個(gè)worker子進(jìn)程 | | | | | |#7. worker_priority: 指定 worker 子進(jìn)程的 nice 值,以調(diào)整運(yùn)行 Nginx 的優(yōu)先級(jí),通常設(shè)定為負(fù)值,以優(yōu)先調(diào)用 Nginx 。 | | | worker_priority -10; #120-10=110,110就是最終的優(yōu)先級(jí) | | |#Linux 默認(rèn)進(jìn)程的優(yōu)先級(jí)值是120,值越小越優(yōu)先; nice 值范圍為 -20 到 +19 。 | | | | | |#備注:應(yīng)用的默認(rèn)優(yōu)先級(jí)值是120加上 nice 值等于它最終的值,這個(gè)值越小,優(yōu)先級(jí)越高。 | | | | | |#8. worker_shutdown_timeout: 指定 worker 子進(jìn)程優(yōu)雅退出時(shí)的超時(shí)時(shí)間。 | | | worker_shutdown_timeout 5s; | | | | | |#9. timer_resolution: worker 子進(jìn)程內(nèi)部使用的計(jì)時(shí)器精度,調(diào)整時(shí)間間隔越大,系統(tǒng)調(diào)用越少,有利于性能提升;反之,系統(tǒng)調(diào)用越多,性能下降。 | | | timer_resolution 100ms; | | |#在 Linux 系統(tǒng)中,用戶需要獲取計(jì)時(shí)器時(shí)需要向操作系統(tǒng)內(nèi)核發(fā)送請(qǐng)求,有請(qǐng)求就必然會(huì)有開(kāi)銷(xiāo),因此這個(gè)間隔越大開(kāi)銷(xiāo)就越小。 | | | | | |#10. daemon: 指定 Nginx 的運(yùn)行方式,前臺(tái)還是后臺(tái),前臺(tái)用于調(diào)試,后臺(tái)用于生產(chǎn)。 | | | daemon off; #默認(rèn)是on,后臺(tái)運(yùn)行模式 |
worker_cpu_affinity:將每個(gè) worker 子進(jìn)程與特定 CPU 物理核心綁定,優(yōu)勢(shì)在于,避免同一個(gè) worker 子進(jìn)程在不同的 CPU 核心上切換,緩存失效,降低性能。但其并不能真正的避免進(jìn)程切換。

202503150320694
1.2.2 events 段核心參數(shù)
| | | | --- | --- | | |#1. use:Nginx 使用何種事件驅(qū)動(dòng)模型。 | | | use method; #不推薦配置它,讓nginx自己選擇 | | |#method 可選值為:select、poll、kqueue、epoll、/dev/poll、eventport | | | | | |#2. worker_connections:worker 子進(jìn)程能夠處理的最大并發(fā)連接數(shù)。 | | | worker_connections 1024; #每個(gè)子進(jìn)程的最大連接數(shù)為1024 | | | | | |#3. accept_mutex:是否打開(kāi)負(fù)載均衡互斥鎖。 | | | accept_mutex on; #默認(rèn)是off關(guān)閉的,這里推薦打開(kāi) |
1.3 常用配置
| 配置 | 位置 | 說(shuō)明 |
| worker_processes 8 | 開(kāi)始 | 工作進(jìn)程, 通常等于CPU數(shù)最或者2倍于CPU |
| include filename | 任意 | 用于引入其他文件 |
| worker_connections | events | 最大連接數(shù) |
| keepalive_timeout | http | 連接超時(shí)時(shí)間,默認(rèn)為75s |
| gzip on | http | 開(kāi)啟 gzip 壓縮 |
| client_header_buffer_size | http | 設(shè)定請(qǐng)求緩沖 |
| client_max_body_size | http | 上傳文件的大小限制,默認(rèn) 1m |
| keepalive_requests | server | 單連接請(qǐng)求上限次數(shù) |
| listen 80 | server | 監(jiān)聽(tīng) 80 端口 |
| server_name | server | 監(jiān)聽(tīng)地址 |
| error_page | server | 定義錯(cuò)誤提示界面 |
| set | server | 定義變量 |
| proxy_pass | location | 代理轉(zhuǎn)發(fā) |
| rewrite | location | 重定向 |
| return | location | 停止處理請(qǐng)求 |
1.3.1 server_name
指定虛擬主機(jī)域名
| | | | --- | --- | | |#語(yǔ)法:server_name[ ...] | | | server_name www.nginx.com; |
域名匹配的四種寫(xiě)法:
? 精確匹配:server_name www.nginx.com
? 左側(cè)通配:server_name *.nginx.com
? 右側(cè)統(tǒng)配:server_name www.nginx.*
? 正則匹配:server_name ~^www.nginx.*$匹配優(yōu)先級(jí):精確匹配 > 左側(cè)通配符匹配 > 右側(cè)通配符匹配 > 正則表達(dá)式匹配
點(diǎn)此查看:server_name實(shí)例演示
1.3.2 location
| | |
| --- | --- |
| |#配置 URL路徑 |
| | location [ = | ~ | ~* | ^~ ] uri { ... } |
匹配規(guī)則(點(diǎn)此查看:location實(shí)例演示):
?=精確匹配;
?~正則匹配,區(qū)分大小寫(xiě);
?~*正則匹配,不區(qū)分大小寫(xiě);
?^~匹配到即停止搜索; 匹配優(yōu)先級(jí):=>^~>~>~*>無(wú)符號(hào)
location 的末尾斜線/
| | |
| --- | --- |
| |#當(dāng)訪問(wèn) www.nginx-test.com/test 時(shí),location 中的是否有末尾反斜線,結(jié)果如下: |
| | location /test/ { ... } |
| |#末尾帶 / 時(shí),Nginx 只會(huì)找 test/index.html 文件。 |
| | |
| | location /test { ... } |
| |#末尾不帶 / 時(shí),Nginx 會(huì)先找 test/index.html 文件,沒(méi)有再找 test 文件。 |
| |##即:先找是否有 test 目錄,有則找 test 目錄下的 index.html ;沒(méi)有則會(huì)找是否有 test 文件。 |
1.3.3 root 與 alias
root 與 alias 都可以指定靜態(tài)資源目錄位置,兩者選其一即可
尋找資源時(shí):root 會(huì)將定義路徑與URI疊加,alias 則只取定義路徑
當(dāng)用戶訪問(wèn) http://www.test.com/image/1.png 時(shí),實(shí)際在服務(wù)器找的路徑是 /opt/nginx/static/image/1.png
? root:指定靜態(tài)資源目錄位置,可以寫(xiě)在 http、server、location 等配置中。
| | |
| --- | --- |
| |#語(yǔ)法:root path |
| | location /image { |
| | root /opt/nginx/static; |
| | } |
? alias:指定靜態(tài)資源目錄位置,只能寫(xiě)在 location 中,且資源路徑以/結(jié)尾。
| | |
| --- | --- |
| |#語(yǔ)法:root path/ |
| | location /image { |
| |alias/opt/nginx/static/image/; |
| | } |
1.3.4 proxy_pass 代理轉(zhuǎn)發(fā)
用于配置代理服務(wù)器,如:正向代理,反向代理(點(diǎn)擊即可查看演示)
| | | | --- | --- | | |#上下文:location、if、limit_except | | | | | |#語(yǔ)法:proxy_pass URL; | | | proxy_pass http://127.0.0.1:8081 | | | proxy_pass http://127.0.0.1:8081/proxy |
URL 參數(shù)原則:
? URL 必須以 http 或 https 開(kāi)頭;
? URL 中可以攜帶變量;
? URL 中是否帶 URI ,會(huì)直接影響發(fā)往上游請(qǐng)求的 URL ;
在配置代理時(shí),proxy_pass 有末尾 帶和 不帶 / 兩種用法,它們的區(qū)別可大了:proxy_pass實(shí)例演示
1.3.5 upstream 負(fù)載均衡
用于定義上游服務(wù)器(指的就是后臺(tái)提供的應(yīng)用服務(wù)器)的相關(guān)信息。

202503122011275
| | |
| --- | --- |
| |#上下文:http |
| | |
| |##語(yǔ)法 |
| |#upstream name { |
| |# server address [parameters] #定義上游服務(wù)器地址。 |
| |#} |
| | |
| |##配置示例 |
| | upstream back_end_server { |
| |#上游服務(wù)器 權(quán)重 最大連接數(shù) 判定失敗的超時(shí)時(shí)間 連接失敗數(shù) |
| | server 127.0.0.1:8081 weight=3 max_conns=1000 fail_timeout=10s max_fails=2; |
| | keepalive 32; |
| | keepalive_requests 50; |
| | keepalive_timeout 30s; |
| | } |
在 upstream 內(nèi)可使用的指令:
?zone#定義共享內(nèi)存,用于跨 worker 子進(jìn)程;
?keepalive
?keepalive_requests
?keepalive_timeout
?hash#哈希負(fù)載均衡算法;
?ip_hash#客戶端 ip 綁定策略:依據(jù) IP 進(jìn)行哈希計(jì)算,使來(lái)自同一個(gè) ip 的請(qǐng)求永遠(yuǎn)只分配一臺(tái)服務(wù)器。
?least_conn#最少連接數(shù)算法:將請(qǐng)求優(yōu)先分配給壓力較小的服務(wù)器。
?least_time#最短響應(yīng)時(shí)間算法:優(yōu)先分配給響應(yīng)時(shí)間最短的服務(wù)器。
?random#隨機(jī)負(fù)載均衡算法,random 還支持兩種可選的負(fù)載均衡模式如下:
1.random two:從后端服務(wù)器列表中,隨機(jī)選擇兩個(gè)服務(wù)器,然后根據(jù)配置的權(quán)重(weight)選擇其中一個(gè)。
2.random two least_conn:從后端服務(wù)器列表中,隨機(jī)選擇兩個(gè)服務(wù)器,然后選擇其中連接數(shù)較少的服務(wù)器。(結(jié)合了隨機(jī)性和最少連接數(shù)的優(yōu)點(diǎn))
?server
[parameters]#定義上游服務(wù)器地址,parameters 可選值:
1.weight=
2.max_conns=
3.fail_timeout=
4.max_fails=
5.backup#備份服務(wù)器,僅當(dāng)其他服務(wù)器都不可用時(shí)才會(huì)啟用;
6.down#標(biāo)記服務(wù)器長(zhǎng)期不可用,離線維護(hù);
點(diǎn)此查看:負(fù)載均衡演示
1.3.6 return
停止處理請(qǐng)求,直接返回響應(yīng)碼或重定向到其他 URL ;執(zhí)行 return 指令后, location 中后續(xù)指令將不會(huì)被執(zhí)行。
| | |
| --- | --- |
| |#語(yǔ)法: |
| |#return code [text]; |
| |#return code URL; |
| |#return URL; |
| | |
| |#例如: |
| | location / { |
| |return404; #直接返回狀態(tài)碼 |
| | } |
| | |
| | location / { |
| |return404"pages not found"; #返回狀態(tài)碼 + 一段文本 |
| | } |
| | |
| | location / { |
| |return302 /bbs; #返回狀態(tài)碼 + 重定向地址 |
| | } |
| | |
| | location / { |
| |returnhttps://www.baidu.com; #返回重定向地址 |
| | } |
1.3.7 rewrite
根據(jù)指定正則表達(dá)式匹配規(guī)則,重寫(xiě) URL 。
| | | | --- | --- | | |#上下文(標(biāo)簽):server、location、if | | | | | |#語(yǔ)法:rewrite <正則表達(dá)式> <要替換的內(nèi)容> [flag]; | | | rewirte /images/(.*.jpg)$ /pic/$1; #變量$1 是前面括號(hào)(.*.jpg)的反向引用 |
flag可選值的含義:
?last重寫(xiě)后的 URL 發(fā)起新請(qǐng)求,再次進(jìn)入 server 段,重試 location 的中的匹配;
?break直接使用重寫(xiě)后的 URL ,不再匹配其它 location 中語(yǔ)句;
?redirect返回 302 臨時(shí)重定向;
?permanent返回 301 永久重定向;
點(diǎn)此查看:rewrite實(shí)例演示
1.3.8 if
| | |
| --- | --- |
| |#上下文:server、location |
| | |
| |#語(yǔ)法:if (condition) { ... } |
| |if($http_user_agent~ Chrome) { |
| | rewrite /(.*) /browser/$1break; |
| | } |
| | |
| |#實(shí)例:當(dāng)訪問(wèn) localhost:8080/images/ 時(shí),會(huì)進(jìn)入 if 判斷里面,并執(zhí)行 rewrite 命令。 |
| | server { |
| | listen 8080; |
| | server_name localhost; |
| | root html; |
| | |
| | location / { |
| |if($uri="/images/") { |
| | rewrite (.*) /pics/break; |
| | } |
| | } |
| | } |
condition 判斷條件:
?$variable#僅為變量時(shí),值為空或以0開(kāi)頭,字符串都會(huì)被當(dāng)做 false 處理;
?=!=#相等或不等;
?~#正則匹配;
?~*#正則匹配,不區(qū)分大小寫(xiě);
?-f#檢測(cè) 文件 存在;
?-d#檢測(cè) 目錄 存在;
?-e#檢測(cè) 文件、目錄、符號(hào)鏈接 等存在;
?-x#檢測(cè)文件可以執(zhí)行;
?!#取反,非;如! ~非正則匹配;或! -f文件不存在
1.3.9 autoindex
用戶請(qǐng)求以 / 結(jié)尾時(shí),列出目錄結(jié)構(gòu),可以用于快速搭建靜態(tài)資源下載網(wǎng)站。

202503121927444
autoindex-nginx.conf 配置信息:
| | |
| --- | --- |
| |#當(dāng)訪問(wèn) fe.lion.com/download/ 時(shí),會(huì)把服務(wù)器 /opt/source/download/ 路徑下的文件展示出來(lái) |
| | server { |
| | listen 80; |
| | server_name fe.lion-test.club; |
| | |
| | location /download/ { |
| | root /opt/source; |
| | |
| | autoindex on; #打開(kāi) autoindex,可選參數(shù)有 on | off |
| | autoindex_exact_size on; #修改為off(默認(rèn)on),以bytes(KB、MB、GB)顯示出?件的確切?? |
| | autoindex_format html; #以html的方式進(jìn)行格式化,可選參數(shù)有 html | json | xml |
| | autoindex_localtime off; #顯示的?件時(shí)間為?件的服務(wù)器時(shí)間(默認(rèn)off)。顯示的?件時(shí)間為GMT時(shí)間 |
| | } |
| | } |
1.4 HTTPS
在學(xué)習(xí)如何配置 HTTPS 之前,我們先來(lái)簡(jiǎn)單回顧下 HTTPS 的工作流程是怎么樣的?它是如何進(jìn)行加密保證安全的?
1.4.1 HTTPS 工作流程
1. 客戶端(瀏覽器)訪問(wèn) https://www.baidu.com 百度網(wǎng)站;
2. 百度服務(wù)器返回 HTTPS 使用的 CA 證書(shū);
3. 瀏覽器驗(yàn)證 CA 證書(shū)是否為合法證書(shū);
4. 驗(yàn)證通過(guò),證書(shū)合法,生成一串隨機(jī)數(shù)并使用公鑰(證書(shū)中提供的)進(jìn)行加密;
5. 發(fā)送公鑰加密后的隨機(jī)數(shù)給百度服務(wù)器;
6. 百度服務(wù)器拿到密文,通過(guò)私鑰進(jìn)行解密,獲取到隨機(jī)數(shù)(公鑰加密,私鑰解密,反之也可以);
7. 百度服務(wù)器把要發(fā)送給瀏覽器的內(nèi)容,使用隨機(jī)數(shù)進(jìn)行加密后傳輸給瀏覽器;
8. 此時(shí)瀏覽器可以使用隨機(jī)數(shù)進(jìn)行解密,獲取到服務(wù)器的真實(shí)傳輸內(nèi)容;
這就是 HTTPS 的基本運(yùn)作原理,使用對(duì)稱加密和非對(duì)稱機(jī)密配合使用,保證傳輸內(nèi)容的安全性。
有興趣的可點(diǎn)此查看:《什么是 SSL、TLS 和 HTTPS?》
1.4.2 配置證書(shū)
下載證書(shū)的壓縮文件,里面有個(gè) Nginx 文件夾,把 xxx.crt 和 xxx.key 文件拷貝到服務(wù)器目錄,再進(jìn)行如下配置:
| | |
| --- | --- |
| | server { |
| | listen 443 ssl http2 default_server; #SSL 訪問(wèn)端口號(hào)為 443 |
| | server_name lion.club; #填寫(xiě)綁定證書(shū)的域名(我這里是隨便寫(xiě)的) |
| | ssl_certificate /etc/nginx/https/lion.club_bundle.crt; #證書(shū)地址 |
| | ssl_certificate_key /etc/nginx/https/lion.club.key; #私鑰地址 |
| | ssl_session_timeout 10m; |
| | ssl_protocols TLSv1 TLSv1.1 TLSv1.2; #支持ssl協(xié)議版本,默認(rèn)為后三個(gè),主流版本是[TLSv1.2] |
| | |
| | location / { |
| | root /usr/share/nginx/html; |
| | index index.html index.htm; |
| | } |
| | } |
注意:
? ssl_certificate證書(shū)的后綴不固定,目前知道的有有:.cer、.pem、.crt ;
? ssl_certificate_key的文件的后綴是固定的為.key
1.5 CORS 跨域配置
CORS(Cross-Origin Resource Sharing,跨源資源共享)是一種瀏覽器機(jī)制,允許網(wǎng)頁(yè)從不同的域(源)請(qǐng)求資源。它通過(guò)使用額外的 HTTP 頭來(lái)告訴瀏覽器,允許某個(gè)源(協(xié)議 + 域名 + 端口)訪問(wèn)資源,即使這些資源來(lái)自不同的源。
1.5.1 跨域的定義
同源策略限制了從同一個(gè)源加載的文檔或腳本如何與來(lái)自另一個(gè)源的資源進(jìn)行交互。
這是一個(gè)用于隔離潛在惡意文件的重要安全機(jī)制。通常不允許不同源間的讀操作。
1.5.2 同源的定義
如果兩個(gè)頁(yè)面的協(xié)議,域名和端口都相同,則兩個(gè)頁(yè)面具有相同的源。
與 URL http://store.company.com/dir/page.html 的源進(jìn)行對(duì)比的示例:
? http://store.company.com/dir2/other.html 同源
? https://store.company.com/secure.html 不同源:協(xié)議不同
? http://store.company.com:81/dir/etc.html 不同源:端口不同
? http://news.company.com/dir/other.html 不同源:主機(jī)不同
不同源會(huì)有如下限制:
? Web 數(shù)據(jù)層面:同源策略限制了不同源的站點(diǎn)讀取當(dāng)前站點(diǎn)的 Cookie 、 IndexDB 、 LocalStorage 等數(shù)據(jù)。
? DOM 層面:同源策略限制了來(lái)自不同源的 JavaScript 腳本對(duì)當(dāng)前 DOM 對(duì)象讀和寫(xiě)的操作。
? 網(wǎng)絡(luò)層面:同源策略限制了通過(guò) XMLHttpRequest 等方式將站點(diǎn)的數(shù)據(jù)發(fā)送給不同源的站點(diǎn)。
1.5.3 Nginx 跨域方案
例如:
? 前端服務(wù)的域名為: fe.server.com
? 后端服務(wù)的域名為: dev.server.com
現(xiàn)在我在 fe.server.com 對(duì) dev.server.com 發(fā)起請(qǐng)求一定會(huì)出現(xiàn)跨域。
1. 啟動(dòng)一個(gè) Nginx 服務(wù)器,將 server_name 設(shè)置為 fe.server.com
2. 設(shè)置相應(yīng)的 location 以攔截前端需要跨域的請(qǐng)求
3. 最后將請(qǐng)求代理回 dev.server.com
如下面的配置:
| | |
| --- | --- |
| | server { |
| | listen 80; |
| | server_name fe.server.com; |
| | location / { |
| | proxy_pass http://dev.server.com; |
| | } |
| | } |
這樣可以完美繞過(guò)瀏覽器的同源策略:
1. fe.server.com 訪問(wèn) Nginx 的 fe.server.com 屬于同源訪問(wèn),
2. 而 Nginx 對(duì)服務(wù)端轉(zhuǎn)發(fā)的請(qǐng)求不會(huì)觸發(fā)瀏覽器的同源策略。
1.6 gzip 壓縮
GZIP 是規(guī)定的三種標(biāo)準(zhǔn) HTTP 壓縮格式之一。目前絕大多數(shù)的網(wǎng)站都在使用 GZIP 傳輸 HTML、CSS、JavaScript 等資源文件。
對(duì)于文本文件, GZiP 的效果非常明顯,開(kāi)啟后傳輸所需流量大約會(huì)降至 1/4~1/3 。
啟用 gzip 同時(shí)需要客戶端和服務(wù)端的支持,然而并不是每個(gè)瀏覽器都支持 gzip 的。
可以通過(guò)請(qǐng)求頭中的 Accept-Encoding 來(lái)標(biāo)識(shí)對(duì)壓縮的支持,如圖:

202503150232712
如果客戶端支持 gzip 的解析,那么只要服務(wù)端能夠返回 gzip 的文件就可以啟用 gzip 了,
可以通過(guò) Nginx 的配置來(lái)讓服務(wù)端支持 gzip 。下面的 respone 中 content-encoding:gzip ,指服務(wù)端開(kāi)啟了 gzip 的壓縮方式。

202503150233152
| | | | --- | --- | | |#是否開(kāi)啟gzip | | | gzip on; #默認(rèn) off | | | | | |#采用 gzip 壓縮的 MIME 文件類(lèi)型,其中 text/html 被系統(tǒng)強(qiáng)制啟用; | | | gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript; | | | | | |#---- 以上兩個(gè)參數(shù)開(kāi)啟就可以支持Gzip壓縮了 ----# | | | | | |#該模塊啟用后,Nginx 首先檢查是否存在請(qǐng)求靜態(tài)文件的 gz 結(jié)尾的文件,如果有則直接返回該 .gz 文件內(nèi)容; | | | gzip_static on; #默認(rèn) off | | | | | |#nginx做為反向代理時(shí)啟用,用于設(shè)置"啟用或禁用"從代理服務(wù)器上收到相應(yīng)內(nèi)容 gzip 壓縮; | | | gzip_proxied any; #默認(rèn) off | | | | | |#用于在響應(yīng)消息頭中添加 Vary:Accept-Encoding,使代理服務(wù)器根據(jù)請(qǐng)求頭中的 Accept-Encoding 識(shí)別是否啟用 gzip 壓縮; | | | gzip_vary on; | | | | | |#gzip 壓縮比,壓縮級(jí)別是 1-9,級(jí)別越高壓縮率越大,壓縮時(shí)間越長(zhǎng);1 壓縮級(jí)別最低,9 最高,建議 4-6; | | | gzip_comp_level 6; | | | | | |#獲取多少內(nèi)存,用于緩存壓縮結(jié)果 | | | gzip_buffers 16 8k; #16 8k 表示以 8k*16 為單位獲得 | | | | | |#允許壓縮的頁(yè)面最小字節(jié)數(shù),頁(yè)面字節(jié)數(shù)從header頭中的 Content-Length 中進(jìn)行獲取。 | | |#建議設(shè)置成大于 1k 的字節(jié)數(shù),小于 1k 可能會(huì)越壓越大;(默認(rèn)值是 0,不管頁(yè)面多大都?jí)嚎s) | | | gzip_min_length 1k; | | | | | |#啟用 gzip 所需的 HTTP 最低版本; | | | gzip_http_version 1.1; #默認(rèn) 1.1 |
1.7 Nginx 配置黑/白名單
Nginx 利用 deny 和 allow 指令來(lái)實(shí)現(xiàn)黑 /白名單的配置,利用黑白名單進(jìn)行安全配置。
| | | | --- | --- | | |#上下文:http、server、location | | | | | |#語(yǔ)法 | | | allow address | CIDR | all; #允許訪問(wèn) | | | deny address | CIDR | all; #禁止訪問(wèn) |
參數(shù)說(shuō)明:
? address:具體的ip地址。
? CIDR:ip加掩碼形式地址。
? all:所有ip地址。
例子:
1. 黑名單: 配置禁止的ip訪問(wèn),允許其他所有的地址訪問(wèn)。
| | | | --- | --- | | | deny 192.168.1.234 | | | deny 192.168.1.235 | | | deny 192.168.1.236 | | | | | | allow all; |在這個(gè)配置下,234、235和236的ip訪問(wèn)不了服務(wù)器,會(huì)顯示403 Forbidden,而其他ip都可以訪問(wèn)。
2. 白名單: 配置允許的ip訪問(wèn),禁止其他所有的地址訪問(wèn)。
| | | | --- | --- | | | allow 192.168.1.234 | | | allow 192.168.1.235 | | | allow 192.168.1.236 | | | | | | deny all; |在這個(gè)配置下,234、235和236的ip可以訪問(wèn)服務(wù)器,而其他所有ip都不允許訪問(wèn),顯示403 Forbidden。
3. 配置禁止訪問(wèn)文件或文件夾
| | |
| --- | --- |
| | location ^~ /project/deny.txt {#明確請(qǐng)求是對(duì)其起作用的; |
| |alias /webroot/proj/; #解析到 /webroot/proj 目錄 |
| | deny all; #屏蔽任何來(lái)源 |
| | } |
也可以把 deny all 改換成 return 404,這樣將返回 404 而不是 403 Forbidden,更有“欺騙性”。
1.8 緩存配置
緩存可以非常有效的提升性能,因此不論是客戶端(瀏覽器),還是代理服務(wù)器( Nginx ),乃至上游服務(wù)器都多少會(huì)涉及到緩存??梢?jiàn)緩存在每個(gè)環(huán)節(jié)都是非常重要的。
存儲(chǔ)一些之前被訪問(wèn)過(guò)、而且可能將要被再次訪問(wèn)的資源,使用戶可以直接從代理服務(wù)器獲得,從而減少上游服務(wù)器的壓力,加快整個(gè)訪問(wèn)速度。
下面讓我們來(lái)學(xué)習(xí) Nginx 中如何設(shè)置緩存策略。
1.8.1 緩存文件設(shè)置
| | | | --- | --- | | |#上下文:http | | | | | |#### proxy_cache_path | | |#設(shè)置緩存文件的存放路徑。 | | | proxy_cache_path path [level=levels] ... #默認(rèn)值:proxy_cache off; |
參數(shù)含義:
? path #緩存文件的存放路徑;
? level #path的目錄層級(jí);
? keys_zone #設(shè)置共享內(nèi)存;
? inactive #在指定時(shí)間內(nèi)沒(méi)有被訪問(wèn),緩存會(huì)被清理,默認(rèn)10分鐘;
1.8.2 緩存條件設(shè)置
| | | | --- | --- | | |#上下文:http、server、location | | | | | |#### proxy_no_cache | | |#定義相應(yīng)保存到緩存的條件,如果字符串參數(shù)的至少一個(gè)值不為空且不等于 “0”,則將不保存該響應(yīng)到緩存。 | | |#語(yǔ)法:proxy_no_cache string; | | | proxy_no_cache$http_pragma$http_authorization; | | | | | |#### proxy_cache_bypass | | |#定義條件,在該條件下將不會(huì)從緩存中獲取響應(yīng)。 | | |#語(yǔ)法:proxy_cache_bypass string; | | | proxy_cache_bypass$http_pragma$http_authorization; |
1.8.3 緩存參數(shù)配置
| | | | --- | --- | | |#上下文:http、server、location | | | | | |#### proxy_cache | | |#緩存開(kāi)關(guān) | | | proxy_cache zone | off ; # zone 是共享內(nèi)存的名稱(默認(rèn)值:off;) | | | | | |#### proxy_cache_valid | | |#配置什么狀態(tài)碼可以被緩存,以及緩存時(shí)長(zhǎng)。 | | |#語(yǔ)法:proxy_cache_valid [code...] time; | | | proxy_cache_valid 200 304 2m; #說(shuō)明對(duì)于狀態(tài)為200和304的緩存文件的緩存時(shí)間是2分鐘 | | | | | |#### proxy_cache_key | | |#設(shè)置緩存文件的 key | | | proxy_cache_key #默認(rèn)值 $scheme$proxy_host$request_uri; |
upstream_cache_status變量,設(shè)置在響應(yīng)頭信息中,在調(diào)試中非常有用,它存儲(chǔ)了緩存是否命中的信息,如下:
?MISS: #未命中緩存
?HIT:: #命中緩存
?EXPIRED: #緩存過(guò)期
?STALE: #命中了陳舊緩存
?REVALIDDATED: #Nginx驗(yàn)證陳舊緩存依然有效
?UPDATING: #內(nèi)容陳舊,但正在更新
?BYPASS: #響應(yīng)從原始服務(wù)器獲取
1.8.4 緩存配置實(shí)例
上游服務(wù)器:121.42.11.34 ,配置如下:
| | |
| --- | --- |
| | server { |
| | listen 1010; |
| | root /usr/share/nginx/html/1010; |
| | location / { |
| | index index.html; |
| | } |
| | } |
| | |
| | server { |
| | listen 1020; |
| | root /usr/share/nginx/html/1020; |
| | location / { |
| | index index.html; |
| | } |
| | } |
代理服務(wù)器:121.5.180.193 ,配置如下:
| | |
| --- | --- |
| |# 緩存文件設(shè)置 |
| | proxy_cache_path /etc/nginx/cache_temp levels=2:2 keys_zone=cache_zone:30m max_size=2g inactive=60m use_temp_path=off; |
| | |
| | upstream cache_server { |
| | server 121.42.11.34:1010; |
| | server 121.42.11.34:1020; |
| | } |
| | |
| | server { |
| | listen 80; |
| | server_name cache.lion.club; |
| | location / { |
| | proxy_cache cache_zone; #設(shè)置緩存內(nèi)存,上面配置中已經(jīng)定義好的 |
| | proxy_cache_valid 200 5m; #緩存狀態(tài)為200的請(qǐng)求,緩存時(shí)長(zhǎng)為5分鐘 |
| | proxy_cache_key$request_uri; #緩存文件的key為請(qǐng)求的URI |
| | add_header Nginx-Cache-Status$upstream_cache_status #把緩存狀態(tài)設(shè)置為頭部信息,響應(yīng)給客戶端 |
| | proxy_pass http://cache_server; #代理轉(zhuǎn)發(fā) |
| | } |
| | } |
緩存就是這樣配置,我們可以在 /etc/nginx/cache_temp 路徑下找到相應(yīng)的緩存文件。
對(duì)于一些實(shí)時(shí)性要求非常高的頁(yè)面或數(shù)據(jù)來(lái)說(shuō),就不應(yīng)該去設(shè)置緩存,下面來(lái)看看如何配置不緩存的內(nèi)容。
添加過(guò)濾條件,過(guò)濾請(qǐng)求不緩存:
| | |
| --- | --- |
| |# 緩存文件設(shè)置 |
| | proxy_cache_path /etc/nginx/cache_temp levels=2:2 keys_zone=cache_zone:30m max_size=2g inactive=60m use_temp_path=off; |
| | |
| | upstream cache_server { |
| | server 121.42.11.34:1010; |
| | server 121.42.11.34:1020; |
| | } |
| | |
| | server { |
| | listen 80; |
| | server_name cache.lion.club; |
| |# URI 中后綴為 .txt 或 .text 的設(shè)置變量值為 "no cache" |
| |if($request_uri~ .(txt|text)$) { |
| |set$cache_name"no cache"|
| | } |
| | |
| | location / { |
| | proxy_no_cache$cache_name; #判斷該變量是否有值,如果有值則不進(jìn)行緩存,如果沒(méi)有值則進(jìn)行緩存 |
| | proxy_cache cache_zone; #設(shè)置緩存內(nèi)存 |
| | proxy_cache_valid 200 5m; #緩存狀態(tài)為200的請(qǐng)求,緩存時(shí)長(zhǎng)為5分鐘 |
| | proxy_cache_key$request_uri; #緩存文件的key為請(qǐng)求的URI |
| | add_header Nginx-Cache-Status$upstream_cache_status #把緩存狀態(tài)設(shè)置為頭部信息,響應(yīng)給客戶端 |
| | proxy_pass http://cache_server; #代理轉(zhuǎn)發(fā) |
| | } |
| | } |
二、栗子
rewrite實(shí)例演示
| | |
| --- | --- |
| | server{ |
| | listen 80; |
| | server_name fe.lion.club; #要在本地hosts文件進(jìn)行配置 |
| | root html; |
| | location /search { |
| | rewrite ^/(.*) https://www.baidu.com redirect; #返回 302 并臨時(shí)重定向到百度 |
| | } |
| | |
| | location /images { |
| | rewrite /images/(.*) /pics/$1; |
| | } |
| | |
| | location /pics { |
| | rewrite /pics/(.*) /photos/$1; |
| | } |
| | |
| | location /photos { |
| | |
| | } |
| | } |
按照這個(gè)配置我們來(lái)分析:
? 當(dāng)訪問(wèn) fe.lion.club/search 時(shí),自動(dòng)重定向到 https://www.baidu.com
? 當(dāng)訪問(wèn) fe.lion.club/images/1.jpg 時(shí):
1. 找到 /images 的 location ,然后重寫(xiě) URL 為 fe.lion.club/pics/1.jpg
2. 找到 /pics 的 location ,繼續(xù)重寫(xiě) URL 為 fe.lion.club/photos/1.jpg
3. 找到 /photos 的 location 后,去 html/photos 目錄下尋找 1.jpg 靜態(tài)資源。
負(fù)載均衡演示
配置負(fù)載均衡主要是要使用 upstream 指令。
我們把 121.42.11.34 服務(wù)器作為上游服務(wù)器,做如下配置:
| | |
| --- | --- |
| | server { |
| | listen 8020; |
| | location / { |
| |return200'return 8020
'; |
| | } |
| | } |
| | |
| | server { |
| | listen 8030; |
| | location / { |
| |return200'return 8030
'; |
| | } |
| | } |
| | |
| | server { |
| | listen 8040; |
| | location / { |
| |return200'return 8040
'; |
| | } |
| | } |
把 121.5.180.193 服務(wù)器作為代理服務(wù)器,做如下配置:
| | |
| --- | --- |
| |#1. 配置本地 hosts |
| |sudotee-a /etc/hosts <<-EOF |
| ? ? | 121.5.180.193 balance.lion.club |
| ? ? | EOF?|
| ? ? | ? ? |
| ? ? |?#2. 代理配置 |
| ? ? |?#/etc/nginx/conf.d/demo-nginx.conf |
| ? ? |?tee?/etc/nginx/conf.d/demo-nginx.conf <<-EOF |
| ? ? | upstream demo_server { |
| ? ? | server 121.42.11.34:8020; |
| ? ? | server 121.42.11.34:8030; |
| ? ? | server 121.42.11.34:8040; |
| ? ? | } ? |
| ? ? | ? ? |
| ? ? | server { |
| ? ? | listen 80; |
| ? ? | server_name balance.lion.club; |
| ? ? | ? ? |
| ? ? | location /balance/ { |
| ? ? | proxy_pass http://demo_server; |
| ? ? | } ? |
| ? ? | } ? |
| ? ? | ? ? |
配置完成后重啟 Nginx 服務(wù)器。并且在需要訪問(wèn)的客戶端配置好 ip 和域名的映射關(guān)系。
在客戶端機(jī)器執(zhí)行 curl http://balance.lion.club/balance/ 命令:

202503141712990
如圖所示:負(fù)載均衡的配置已經(jīng)生效了,通過(guò)簡(jiǎn)單的"輪詢策略"進(jìn)行上游服務(wù)器分發(fā),每次給我們分發(fā)的上游服務(wù)器都不一樣。
接下來(lái),我們?cè)賮?lái)了解下 Nginx 的其它分發(fā)策略:hash、ip_hash 和 least_conn最少連接數(shù)算法。
hash、ip_hash 和 least_conn
| | |
| --- | --- |
| |#### hash 算法 |
| |#通過(guò)指定關(guān)鍵字作為 hash-key ,基于 hash 算法映射到特定的上游服務(wù)器中。 |
| |#關(guān)鍵字可以包含有變量、字符串。 |
| | upstream demo_server { |
| |#表示使用 request_uri變量作為 hash的 key值,只要訪問(wèn)的 URI 保持不變,就會(huì)一直分發(fā)給同一臺(tái)服務(wù)器。 |
| |hash$request_uri; |
| | server 121.42.11.34:8020; |
| | server 121.42.11.34:8030; |
| | server 121.42.11.34:8040; |
| | } |
| | |
| |#### ip_hash 算法(可以有效解決后臺(tái)服務(wù)器 session 保持的問(wèn)題) |
| |#根據(jù)客戶端的請(qǐng)求 ip進(jìn)行判斷,只要 ip地址不變,就永遠(yuǎn)分配到同一臺(tái)主機(jī)。 |
| | upstream demo_server { |
| | ip_hash; |
| | server 121.42.11.34:8020; |
| | server 121.42.11.34:8030; |
| | server 121.42.11.34:8040; |
| | } |
| | |
| |#### least_conn最少連接數(shù)算法 |
| |#各個(gè) worker子進(jìn)程通過(guò)讀取共享內(nèi)存的數(shù)據(jù),獲取后端服務(wù)器的信息來(lái)挑選一臺(tái),當(dāng)前已建立“連接數(shù)最少”的服務(wù)器進(jìn)行分配請(qǐng)求。 |
| | upstream demo_server { |
| | zonetest10M; #zone可以設(shè)置共享內(nèi)存空間的名字和大小 |
| | least_conn; |
| | server 121.42.11.34:8020; |
| | server 121.42.11.34:8030; |
| | server 121.42.11.34:8040; |
| | } |
| | |
| | |
| | server { |
| | listen 80; |
| | server_name balance.lion.club; |
| | |
| | location /balance/ { |
| | proxy_pass http://demo_server; |
| | } |
| | } |
配置本地 hosts
| | | | --- | --- | | |sudotee-a /etc/hosts <<-EOF | | ? ? | 121.5.180.193 balance.lion.club | | ? ? | EOF?|
proxy_pass實(shí)例演示
用戶請(qǐng)求URL:/bbs/abc/test.html
1. 不帶 / 的用法:
| | |
| --- | --- |
| |#不帶 / 意味著 Nginx 不會(huì)修改用戶 URL ,而是直接透?jìng)鹘o上游的應(yīng)用服務(wù)器; |
| | location /bbs/ { |
| | proxy_pass http://127.0.0.1:8080; |
| | } |
分析:與 alias 相似
? 請(qǐng)求到達(dá) Nginx 的 URL:/bbs/abc/test.html
? 請(qǐng)求到達(dá)上游應(yīng)用服務(wù)器的 URL:/bbs/abc/test.html
? alias值=url: alias /$PATH/bbs/abc/
2. 帶 / 的用法:
| | |
| --- | --- |
| |#帶 / 意味著 Nginx 會(huì)修改用戶 URL ,修改方法是將 location 的參數(shù)從用戶 URL 中刪除; |
| | location /bbs/ { |
| | proxy_pass http://127.0.0.1:8080/; |
| | } |
分析:與 root 相似,沒(méi)有拼接上 location
? 請(qǐng)求到達(dá) Nginx 的 URL: /bbs/abc/test.html
? 請(qǐng)求到達(dá)上游應(yīng)用服務(wù)器的URL: /abc/test.html
? root值=url-location:root /$PATH/abc/
正向代理
如果把局域網(wǎng)外的Internet想象成一個(gè)巨大的資源庫(kù),則局域網(wǎng)中的客戶端要訪問(wèn)Internet,則需要通過(guò)代理服務(wù)器來(lái)訪問(wèn),這種代理服務(wù)就稱為正向代理。
Nginx正向代理涉及到的指令較少,只是對(duì)用戶的訪問(wèn)進(jìn)行一個(gè)轉(zhuǎn)發(fā),不做其他處理。配置如下:
| | |
| --- | --- |
| | server { |
| | resolver 192.168.1.1; #指定DNS服務(wù)器IP地址 |
| | listen 8080; |
| | location / { |
| |#設(shè)定代理服務(wù)器的協(xié)議和地址 |
| | proxy_pass http://$http_host$request_uri; |
| | } |
| | } |
其中:
? resolver 必須的,表示DNS服務(wù)器;
? listen 指定監(jiān)聽(tīng)端口號(hào)(不指定默認(rèn)監(jiān)聽(tīng) 80 端口);
? location 表示匹配用戶訪問(wèn)的資源,并作進(jìn)一步轉(zhuǎn)交和處理,可用正則表達(dá)式匹配;
? proxy_pass 表示需要代理的地址;
? $http_host 表示用戶訪問(wèn)資源的主機(jī)部分;
? $request_uri 表示用戶訪問(wèn)資源的URI部分。
如:http://nginx.org/download/nginx-1.6.3.tar.gz,則$http_host=nginx.org,$request_uri=/download/nginx-1.6.3.tar.gz
反向代理
為了演示更加接近實(shí)際,準(zhǔn)備了兩臺(tái)云服務(wù)器,分別是:121.42.11.34 與 121.5.180.193
我們把 121.42.11.34 服務(wù)器作為上游服務(wù)器,做如下配置:
| | | | --- | --- | | |#1. 頁(yè)面 index.html | | |tee/usr/share/nginx/html/proxy/index.html <<-EOF | | ? ? |121.42.11.34 proxy html
| | | EOF| | | | | |#2. 代理配置 | | |#/etc/nginx/conf.d/proxy-nginx.conf | | |tee/etc/nginx/conf.d/proxy-nginx.conf <<-EOF | | ? ? | server{ | | ? ? | listen 8080; | | ? ? | server_name localhost; | | ? ? | ? ? | | ? ? | location /proxy/ { | | ? ? | root /usr/share/nginx/html/proxy; | | ? ? | index index.html; | | ? ? | } ? | | ? ? | } ? | | ? ? | EOF?| | ? ? | ? ? | | ? ? |?#3. 配置完成后重新加載配置文件 | | ? ? | nginx -s reload |
把 121.5.180.193 服務(wù)器作為代理服務(wù)器,做如下配置:
| | |
| --- | --- |
| |#1. 配置本地 hosts |
| |sudotee-a /etc/hosts <<-EOF |
| ? ? | 121.5.180.193 proxy.lion.club |
| ? ? | EOF?|
| ? ? | ? ? |
| ? ? |?#2. 代理配置 |
| ? ? |?#/etc/nginx/conf.d/proxy-nginx.conf |
| ? ? |?tee?/etc/nginx/conf.d/proxy-nginx.conf <<-EOF |
| ? ? | upstream back_end { |
| ? ? | server 121.42.11.34:8080 weight=2 max_conns=1000 fail_timeout=10s max_fails=3; |
| ? ? | keepalive 32; |
| ? ? | keepalive_requests 80; |
| ? ? | keepalive_timeout 20s; |
| ? ? | } ? |
| ? ? | ? ? |
| ? ? | server { |
| ? ? | listen 80; |
| ? ? | server_name proxy.lion.club; |
| ? ? | location /proxy { |
| ? ? | proxy_pass http://back_end/proxy; |
| ? ? | } ? |
| ? ? | } ? |
| ? ? | EOF?|
分析:
? 當(dāng)訪問(wèn) proxy.lion.club/proxy 時(shí),通過(guò) upstream 的配置找到 121.42.11.34:8080 ;
? 因此訪問(wèn)地址變?yōu)?http://121.42.11.34:8080/proxy ;
? 連接到 121.42.11.34 服務(wù)器,找到 8080 端口提供的 server ;
? 通過(guò) server 找到 /usr/share/nginx/html/proxy/index.html 資源,最終展示出來(lái)。

202503141509395
location實(shí)例演示
| | |
| --- | --- |
| | server { |
| | listen 80; |
| | server_name www.nginx-test.com; |
| | |
| |#只有當(dāng)訪問(wèn) www.nginx-test.com/match_all/ 時(shí),才會(huì)匹配到/usr/share/nginx/html/match_all/index.html |
| | location = /match_all/ { |
| | root /usr/share/nginx/html |
| | index index.html |
| | } |
| | |
| |#當(dāng)訪問(wèn) www.nginx-test.com/1.jpg 等路徑時(shí),會(huì)去 /usr/share/nginx/images/1.jpg 找對(duì)應(yīng)的資源 |
| | location ~ .(jpeg|jpg|png|svg)$ { |
| | root /usr/share/nginx/images; |
| | } |
| | |
| |#當(dāng)訪問(wèn) www.nginx-test.com/bbs/ 時(shí),會(huì)匹配上 /usr/share/nginx/html/bbs/index.html |
| | location ^~ /bbs/ { |
| | root /usr/share/nginx/html; |
| | index index.html; |
| | } |
| | } |
server_name實(shí)例演示
因?yàn)樘摂M域名進(jìn)行測(cè)試,因此需要配置本地 DNS 解析,如果使用阿里云上購(gòu)買(mǎi)的域名,則需要在阿里云上設(shè)置好域名解析。
| | | | --- | --- | | |#配置本地 DNS 解析 hosts | | | 121.42.11.34 www.nginx-test.com | | | 121.42.11.34 www.nginx-test.org | | | 121.42.11.34 www.nginx-test.cn | | | 121.42.11.34 mail.nginx-test.com | | | 121.42.11.34 doc.nginx-test.com | | | 121.42.11.34 fe.nginx-test.club |
配置 nginx.conf 的 server 配置
| | |
| --- | --- |
| |# 完全匹配 |
| | server { |
| | listen 80; |
| | server_name www.nginx-test.com; |
| | root /usr/share/nginx/html/nginx-test/all-match/; |
| | location / { |
| | index index.html; |
| | } |
| | } |
| | |
| |# 左匹配 |
| | server { |
| | listen 80; |
| | server_name *.nginx-test.com; |
| | root /usr/share/nginx/html/nginx-test/left-match/; |
| | location / { |
| | index index.html; |
| | } |
| | } |
| | |
| |# 右匹配 |
| | server { |
| | listen 80; |
| | server_name www.nginx-test.*; |
| | root /usr/share/nginx/html/nginx-test/right-match/; |
| | location / { |
| | index index.html; |
| | } |
| | } |
| | |
| |# 正則匹配 |
| | server { |
| | listen 80; |
| | server_name ~^.*.nginx-test..*$; |
| | root /usr/share/nginx/html/nginx-test/reg-match/; |
| | location / { |
| | index index.html; |
| | } |
| | } |
訪問(wèn)分析
? 當(dāng)訪問(wèn)
? 當(dāng)訪問(wèn)
? 當(dāng)訪問(wèn)
? 當(dāng)訪問(wèn)
? 當(dāng)訪問(wèn)
? 當(dāng)訪問(wèn)
內(nèi)置變量實(shí)例演示
| | |
| --- | --- |
| | server{ |
| | listen 8081; |
| | server_name var.lion-test.club; |
| | root /usr/share/nginx/html; |
| | location / { |
| |return200" |
| | remote_addr:$remote_addr|
| | remote_port:$remote_port|
| | server_addr:$server_addr|
| | server_port:$server_port|
| | server_protocol:$server_protocol|
| | binary_remote_addr:$binary_remote_addr|
| | connection:$connection|
| | uri:$uri|
| | request_uri:$request_uri|
| | scheme:$scheme|
| | request_method:$request_method|
| | request_length:$request_length|
| | args:$args|
| | arg_pid:$arg_pid|
| | is_args:$is_args|
| | query_string:$query_string|
| | host:$host|
| | http_user_agent:$http_user_agent|
| | http_referer:$http_referer|
| | http_via:$http_via|
| | request_time:$request_time|
| | https:$https|
| | request_filename:$request_filename|
| | document_root:$document_root|
| | "; |
| | } |
| | } |
當(dāng)我們?cè)L問(wèn) http://var.lion-test.club:8081/test?pid=121414&cid=sadasd 時(shí),由于 Nginx 中寫(xiě)了 return 方法,因此 chrome 瀏覽器會(huì)默認(rèn)為我們下載一個(gè)文件,下面展示的就是下載的文件內(nèi)容:
| | | | --- | --- | | | remote_addr: 27.16.220.84 | | | remote_port: 56838 | | | server_addr: 172.17.0.2 | | | server_port: 8081 | | | server_protocol: HTTP/1.1 | | | binary_remote_addr: 茉 | | | connection: 126 | | | uri: /test/ | | | request_uri: /test/?pid=121414&cid=sadasd | | | scheme: http | | | request_method: GET | | | request_length: 518 | | | args: pid=121414&cid=sadasd | | | arg_pid: 121414 | | | is_args: ? | | | query_string: pid=121414&cid=sadasd | | | host: var.lion-test.club | | | http_user_agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.182 Safari/537.36 | | | http_referer: | | | http_via: | | | request_time: 0.000 | | | https: | | | request_filename: /usr/share/nginx/html/test/ | | | document_root: /usr/share/nginx/html |
鏈接:https://www.cnblogs.com/librarookie/p/18773209
-
Web
+關(guān)注
關(guān)注
2文章
1297瀏覽量
73263 -
服務(wù)器
+關(guān)注
關(guān)注
13文章
10013瀏覽量
90376 -
nginx
+關(guān)注
關(guān)注
0文章
180瀏覽量
12906
原文標(biāo)題:【全網(wǎng)瘋傳】Nginx配置終極指南:從入門(mén)到高并發(fā)優(yōu)化,流量翻倍實(shí)戰(zhàn)攻略
文章出處:【微信號(hào):magedu-Linux,微信公眾號(hào):馬哥Linux運(yùn)維】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
Linux下Nginx配置多個(gè)站點(diǎn)的實(shí)現(xiàn)方法?
nginx錯(cuò)誤頁(yè)面配置
主要學(xué)習(xí)下nginx的安裝配置
運(yùn)行nginx所需的最低配置
Nginx常用的配置和基本功能講解
Nginx的特點(diǎn)和作用 Nginx常用命令和核心配置
Nginx常用配置與命令
nginx負(fù)載均衡配置介紹
玩轉(zhuǎn)Nginx日志管理:高效排查問(wèn)題的終極指南
Nginx性能優(yōu)化終極指南

Nginx配置終極指南
評(píng)論