1. ?nginx復雜跳轉
- 客戶端ip不是內網(172.16/192.168)ip時,維護文件存在時,返回503或者錯誤頁面
1.1. 📝修改配置文件
server {listen 80;server_name re.linux.cn; root /app/code/re/;set $flag 0;if ( $remote_addr !~* "^172.16|^192.168" ) {set $flag 1;}if ( -f /etc/nginx/weihu.txt ) {set $flag ${flag}1; }if ( $flag = 11 ) {return 503;#return 302 http://re.oldboy.cn/error.html;}if ( $request_method !~* "GET|POST|HEAD" ) {return 405;}location / {index index.html;}
}
1.2. 📁創建維護文件
touch /etc/nginx/weihu.txt
1.3. 🔄重啟服務
nginx -t
systemctl reload nginx
1.4. 🌏使用10網段訪問
2. ?nginx中的case語句
- map類似shell中的case語句
- 問題:配置nginx負載均衡監控檢查功能check,后端web節點會產生大量的檢查日志(訪問日志)
- 解決:web服務器上配置根據不同的UA進行判斷
-
- 如果UA是lb_check則不記錄訪問日志
- 如果UA是其他的則記錄訪問日志
- map做判斷,access_log有個if選項
access_log /var/log/nginx/lb_access.log main if=0或1; 0不記錄
2.1. 📌map用法
map $源變量 $目標變量 {default 值;條件1 值1;條件2 值2;...
}
- map 必須寫在 http 塊中。
- $源變量 可以是任何內置變量或之前定義的變量(如 $host, $http_user_agent, $request_method 等)。
- $目標變量 是你自定義的新變量名。
- default 表示默認值,當沒有匹配時使用。
2.2. 📝修改配置文件
- 判斷UA
map $http_user_agent $log {"~*lb_check|curl|wget" 0;default 1;
}server {listen 80;server_name lb.linux.cn;root /app/code/lb/;access_log /var/log/nginx/lb-access.log main if=$log;error_log /var/log/nginx/lb-error.log notice;location / {index index.html;}
}
2.3. 🔄重啟服務
nginx -t
systemctl reload nginx
2.4. 🔍測試
1.web02上測試
curl -A lb_check -H Host:lb.oldboy.cn http://10.0.0.7
curl -A lb -H Host:lb.oldboy.cn http://10.0.0.72.web01上查看日志
tail -f /var/log/nginx/lb-access.log
3. ?rewrite
- 功能與return類似
在 Nginx 中,return
和 rewrite
都可以用于實現URL 重定向或跳轉,但它們的功能、行為和適用場景完全不同。下面詳細對比它們的區別:
3.1. 🧩基本概念
特性 |
|
|
類型 | 控制流指令 | URL 重寫指令 |
是否發送 HTTP 響應 | 是(直接返回響應) | 否(修改請求后繼續處理) |
主要用途 | 立即返回狀態碼或跳轉到新地址 | 修改 URL 路徑,內部跳轉或外部重定向 |
支持的狀態碼 | 支持所有標準 HTTP 狀態碼(如 200, 301, 302, 403, 404 等) | 僅支持 301、302、303、307、308 的跳轉 |
3.2. 📌 用法詳解與示例
3.2.1. 🔹 return
:立即返回指定的 HTTP 響應
3.2.1.1. 語法:
return [狀態碼] [重定向地址];
3.2.1.2. 示例 1:返回錯誤頁面
location /error {return 404;
}
3.2.1.3. 示例 2:301 永久重定向
location = /old-page {return 301 https://example.com/new-page;
}
3.2.1.4. 示例 3:直接返回字符串內容(常用于調試)
location /hello {return 200 "Hello World!";
}
3.2.1.5. 實例 4:return + 變量
server {listen 80;server_name baidu.linux.cn;return 301 http://www.baidu.cn$request_uri;
}
?? 注意:return
一旦執行,Nginx 就不會再處理后續的邏輯,而是立即返回響應。
3.2.2. 🔹 rewrite
:重寫 URL,控制請求路徑
3.2.2.1. 語法:
rewrite 正則表達式 替換內容 [flag];
- 支持正則匹配
- 可以配合
break
,last
,redirect
,permanent
等 flag 使用
rewrite標記(flag) | |
redirect | 302臨時跳轉,新舊地址都可以用 |
permanent | 301永久跳轉,舊地址SEO排名取消,只用新地址 |
break | 類似exit,后面還有其他的可以匹配location不會繼續匹配 |
last | 類似continue結束當前匹配,進行下個location匹配 |
3.2.2.2. 示例 1:內部重寫(不改變瀏覽器地址)
rewrite ^/user/(\d+)$ /profile.php?id=$1 break;
- 瀏覽器看到的是
/user/123
,服務器實際處理的是/profile.php?id=123
3.2.2.3. 示例 2:302 臨時重定向
rewrite ^/old-path$ /new-path redirect;
- 返回 302,瀏覽器地址欄會變成
/new-path
3.2.2.4. 示例 3:301 永久重定向
rewrite ^/old-blog/(.*)$ https://blog.example.com/$1 permanent;
- 返回 301,適合 SEO 權重轉移
3.3. 🧠 核心區別總結
對比項 |
|
|
是否中斷請求處理 | ? 是,立即返回響應 | ? 否,繼續處理新的 URL |
是否可帶響應體 | ? 可以自定義內容 | ? 不行,只能跳轉或改寫 URL |
是否支持正則 | ? 不支持 | ? 支持 |
是否可用于 URL 重寫 | ? 不可做內部重寫 | ? 可以做內部重寫 |
是否更高效 | ? 更快,因為不繼續處理 | ? 相對慢一點(需要重新匹配 location) |
3.4. 💡 使用建議
場景 | 推薦使用 |
需要立即返回錯誤或內容 |
|
需要做復雜的 URL 匹配和重寫 |
|
做 SEO 友好的永久跳轉 |
|
臨時跳轉測試 |
|
內部路徑映射(瀏覽器地址不變) |
|
3.5. 🔍 綜合對比示例
配置 | 行為 |
| 立即返回 301,瀏覽器跳轉 |
| 返回 302,跳轉到 |
| 不跳轉,內部將 |
| 立即返回 403 錯誤 |
| 內部重寫 API 路徑,瀏覽器無感知 |
4. ?https(數字證書)
- https == http over tls進行你加密
- 網站,申請https證書文件.(公鑰(證書),私鑰)
- 對外:一般申請/購買使用(網站,app,小程序)
- 對內:自己創建
4.1. ??申請證書方式
- 通過命令創建(自建證書),其他人訪問,提示網站不安全.
- 申請免費證書(有效期是3個月);阿里云,Let's Encrypt
- 正式:購買
- 證書根據加密與安全方式分類
4.2. 🌏阿里云上申請ssl證書
4.2.1. 在數字證書管理服務中選擇ssl證書管理,點擊立即購買
4.2.2. 選擇個人測試證書,點擊立即購買
4.2.3. 支付
4.2.4. 登錄管理控制臺
4.2.5. 創建證書
4.2.6. 輸入域名,選擇快速簽發,提交審核
4.2.7. 審核通過后選擇證書下載到電腦上
4.3. 🚀部署ssl證書
4.3.1. 將ssl證書存放到/etc/nginx/keys/目錄下
4.3.2. 修改nginx配置文件
server {listen 80;server_name www.zhubl.xyz;return 302 https://www.zhubl.xyz$request_uri;access_log off;
}
server {listen 443 ssl http2;server_name www.zhubl.xyz ;ssl_certificate /etc/nginx/keys/zhubl.xyz.pem;ssl_certificate_key /etc/nginx/keys/zhubl.xyz.key;root /app/code/ssl/;location / {index index.html;}
}
4.3.3. 重啟nginx服務
#檢查配置文件
nginx -t#重啟
systemctl reload nginx#檢查端口
ss -lntup | grep nginx
4.3.4. 瀏覽器訪問
http://www.zhubl.xyz
自動跳轉
https://www.zhubl.xyz
4.4. 🔍監控
- https證書是否過期,30天
#1.獲取過期日期,轉換為秒
date_expire=`curl -s -v -o /dev/null https://www.jd.com|& grep 'expire date'|awk -F: '{print $2}'`
date_expire_seconds=`date +%s -d "$date_expire"`
date_now_seconds=`date +%s`
days_left=`echo "($date_expire_seconds - $date_now_seconds )/86400 "|bc `
4.5. 🌈自建證書
#創建私鑰 私鑰server.key
openssl genrsa -idea -out server.key 2048 #根據私鑰創建 證書 server.crt .pem證書
openssl req -days 36500 -x509 -sha256 - nodes -newkey rsa:2048 -keyout server.key - out server.crt
5. ?nginx配置優化
server {listen 443 ssl;keepalive_timeout 70;#指定ssl加密協議的版本 不要 加上TLSv1.0不安全. ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;#加密算法. 需要排除不安全的算法#排除null空算法, md5算法 ssl_ciphers AES128- SHA:AES256-SHA:RC4-SHA:DES-CBC3-SHA:RC4- MD5:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5;ssl_certificate /usr/local/nginx/conf/cert.pem;ssl_certificate_key /usr/local/nginx/conf/cert.key;#設置https 會話緩存 10MB大小的空間用于 存儲緩存. ssl_session_cache shared:SSL:10m;#超時時間 10分鐘ssl_session_timeout 10m;
}