Nginx 簡介
什么是Nignx服務器
- 官網:http://nginx.org/
- 是一個高性能的HTTP和反向代理web服務器
- Nginx代碼完全用C語言從頭寫成
- 適合系統:Mac/Windows/Linux
為什么要用這個
- 社區活躍
- 高性能-支持單機千萬級連接
- 強大的第三方庫支持
- 功能強大:負載均衡、靜態文件服務器、支持多種協議https、POP3等等
什么是正向代理服務器和反向代理服務器
正向代理服務器
-
客戶端和目標服務器之間的服務器,客戶端向代理發送一個請求指定目標服務器,然后代理向目標服務器請求并獲得內容,并返回給客戶端,平時說的代理服務器一般是正向代理服務器
-
核心:用戶知道自己訪問的目標服務器
-
場景:跳板機、堡壘機、訪問原來無法訪問的網站, 比如國外的一些站點
反向代理服務器(如Nginx)
- 客戶端和目標服務器之間的服務器,客戶端向代理發送一個請求,然后代理向目標服務器請求并獲得內容,并返回給客戶端。反向代理隱藏了真實的服務器
- 核心:客戶端不知道要訪問的目標服務器是哪臺服務器,代理會根據一定的策略選擇一個真實的服務器進行請求
- 場景:訪問淘寶,知道訪問的域名是taobao.com, 但是后面提供數據的具體是什么域名或ip我們是不知道的
阿里云服務器登錄使用和常見終端工具
- 控制臺修改阿里云遠程連接密碼
- windows工具 putty,xshell, security CRT
- 蘋果系統MAC : 通過終端登錄
- ssh root@ip 回車后輸入密碼
- ssh [email protected]
- linux圖形操作工具(用于遠程連接上傳文件)
mac: filezilla
sftp://39.95.62.131
windows: winscp
nginx下載和阿里快速安裝
- 下載壓縮包 并上傳
http://nginx.org/en/download.html
- 安裝依賴
yum -y install gcc zlib zlib-devel pcre-devel openssl openssl-devel
- 創建一個文件夾,上傳本地提供的nginx包
tar -zxvf nginx-1.18.0.tar.gz
//執行命令
./configure
make
make install
- 默認安裝路徑
/usr/local/nginx
- 訪問配置
cd /usr/local/nginx/sbin
// 啟動Nginx
./nginx
- 防火墻開放端口,阿里云網絡安全組配置80端口
應用部署到可以公網訪問需要知道的常識
- 一個http請求基本流程
客戶端通過發起域名資源請求 -> DNS解析獲得IP -> 尋找服務器獲得資源
- 域名和ip的關系,DNS作用
DNS:Domain Name Server 域名服務器
域名雖然便于人們記憶,但網絡中的計算機之間只能互相認識IP地址,它們之間的轉換工作稱為域名解析,域名解析需要由專門的域名解析服務器來完成,DNS 就是進行域名解析的服務器
- 什么是cname和a記錄
a記錄
用戶可以在此設置域名并指向到自己的目標主機地址上,從而實現通過域名找到服務器(也叫ip指向域名配置)vincent.com -> 39.95.62.131
cname
別名指向,可以為一個主機設置別名。比如設置vincent1024.com,用來指向一個主機 vincent.com 那么以后就可以用vincent1024.com來代替訪問 vincent.net 了
- 購買域名,備案
阿里云 備案地址:https://beian.aliyun.com/
- 安裝項目依賴的基本環境,比如java、nginx等軟件
- 配置域名解析到服務器,nginx是80端口,解析到80端口就行
Nginx目錄文件講解
- 源碼編譯安裝后,默認目錄
/usr/local/nginx
- 目錄核心介紹
conf #所有配置文件目錄
nginx.conf #默認的主要的配置文件
nginx.conf.default #默認模板
?
html # 這是編譯安裝時Nginx的默認站點目錄
50x.html #錯誤頁面
index.html #默認首頁
logs # nginx默認的日志路徑,包括錯誤日志及訪問日志
error.log #錯誤日志
nginx.pid #nginx啟動后的進程id
access.log #nginx訪問日志
?
sbin #nginx命令的目錄
nginx #啟動命令
- 常見命令
./nginx #默認配置文件啟動
?
./nginx -s reload #重啟,加載默認配置文件
?
./nginx -c /usr/local/nginx/conf/nginx.conf #啟動指定某個配置文件
?
./nginx -s stop #停止./nginx -t #測試配置文件是否有語法錯誤
?
#關閉進程,nginx有master process 和worker process,關閉master即可
ps -ef | grep "nginx"
kill -9 PID
Nginx核心知識之默認配置文件講解
- 全局配置
- server 主機設置
- location(URL匹配特定位置的設置)
# 每個配置項由配置指令和指令參數 2 個部分構成
#user nobody; # 指定Nginx Worker進程運行以及用戶組
worker_processes 1; #
?
#error_log logs/error.log; # 錯誤日志的存放路徑 和錯誤日志
#error_log logs/error.log notice;
#error_log logs/error.log info;
?
#pid logs/nginx.pid; # 進程PID存放路徑
?
?
# 事件模塊指令,用來指定Nginx的IO模型,Nginx支持的有select、poll、kqueue、epoll 等。不同的是epoll用在Linux平臺上,而kqueue用在BSD系統中,對于Linux系統,epoll工作模式是首選
events {
use epoll;
# 定義Nginx每個進程的最大連接數, 作為服務器來說: worker_connections * worker_processes,
# 作為反向代理來說,最大并發數量應該是worker_connections * worker_processes/2。因為反向代理服務器,每個并發會建立與客戶端的連接和與后端服務的連接,會占用兩個連接
worker_connections 1024;
}
?
?
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 logs/access.log main;
?
# 是否開啟高效傳輸模式 on開啟 off關閉
sendfile on;
#減少網絡報文段的數量
#tcp_nopush on;
?
#keepalive_timeout 0;
# 客戶端連接保持活動的超時時間,超過這個時間之后,服務器會關閉該連接
keepalive_timeout 65;
?
#gzip on;
# 虛擬主機的配置
server {
listen 80; # 虛擬主機的服務端口
server_name localhost; #用來指定IP地址或域名,多個域名之間用空格分開
?
#charset koi8-r;
?
#access_log logs/host.access.log main;
?
#URL地址匹配
location / {
root html; # 服務默認啟動目錄
index index.html index.htm; #默認訪問文件,按照順序找
}
?
#error_page 404 /404.html; #錯誤狀態碼的顯示頁面
?
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
?
# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
#location ~ \.php$ {
# proxy_pass http://127.0.0.1;
#}
?
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
#location ~ \.php$ {
# root html;
# fastcgi_pass 127.0.0.1:9000;
# fastcgi_index index.php;
# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
# include fastcgi_params;
#}
?
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
#location ~ /\.ht {
# deny all;
#}
}
?
?
# another virtual host using mix of IP-, name-, and port-based configuration
#
#server {
# listen 8000;
# listen somename:8080;
# server_name somename alias another.alias;
?
# location / {
# root html;
# index index.html index.htm;
# }
#}
?
?
# HTTPS server
#
#server {
# listen 443 ssl;
# server_name localhost;
?
# ssl_certificate cert.pem;
# ssl_certificate_key cert.key;
?
# ssl_session_cache shared:SSL:1m;
# ssl_session_timeout 5m;
?
# ssl_ciphers HIGH:!aNULL:!MD5;
# ssl_prefer_server_ciphers on;
?
# location / {
# root html;
# index index.html index.htm;
# }
#}
}
Nginx配置虛擬主機,搭建前端靜態資源服務器
- 什么是虛擬主機
指在一臺物理主機服務器上劃分出多個磁盤空間,每個磁盤空間都是一個虛擬主機,每臺虛擬主機都可以對外提供Web服務,并且互不干擾,就類似虛擬機
利用虛擬主機把多個不同域名的網站部署在同一臺服務器上,節省了服務器硬件成本和相關的維護費用
- 【注意】配置之前,拷貝一份默認的出來,nginx配置容易出錯且肉眼難看出來,要仔細核對
- Nginx虛擬主機配置
server {
listen 80;
server_name 9527abc.com;
?
location / {
root /usr/local/nginx/html;
index vincent.html;
}
}
server {
listen 80;
server_name 2459527.com;
location / {
root html;
index vincent.html index.htm;
}
}
Nginx搭建圖片-文件服務器
- 圖片服務器
學javaweb、或者其他基礎web項目,基本都是圖片上傳到項目本身,這個是生成很少用
公司一般會使用圖片服務器或者云廠商提供的CDN
- 使用流程
前端提交圖片->后端處理->存儲到圖片服務器->拼接好訪問路徑存儲到數據庫和范圍前端
- 本地圖片上傳上去,配置專屬訪問路徑
server {
listen 80;
server_name vincent9527.com;
location /app/img {
alias /usr/local/software/img/;
}
}
- 注意
在location / 中配置root目錄
在location /path中配置alias虛擬目錄, 目錄后面的"/"符號一定要帶上
Nginx訪問日志的用處
- access.log日志用處
- 統計站點訪問ip來源、某個時間段的訪問頻率
- 查看訪問最頻的頁面、Http響應狀態碼、接口性能
- 接口秒級訪問量、分鐘訪問量、小時和天訪問量
- 默認配置解析
#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
# '$status $body_bytes_sent "$http_referer" '
# '"$http_user_agent" "$http_x_forwarded_for"';
- 案例
61.140.75.5 - - [04/Sept/2020:14:46:48 +0800] "GET /user/api/v1/product/order/query_state?product_id=1&token=vincenteyJhbGciOJE HTTP/1.1" 200 48 "https://vincent.com/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.89 Safari/537.36"
- 解析
$remote_addr 對應的是真實日志里的61.140.75.5,即客戶端的IP。
?
$remote_user 對應的是第二個中杠“-”,沒有遠程用戶,所以用“-”填充。
?
[$time_local]對應的是[04/Sept/2020:14:46:48 +0800]。
?
“$request”對應的是"GET /user/api/v1/product/order/query_state?product_id=1&token=vincenteyJhbGciOJE HTTP/1.1"。
?
$status對應的是200狀態碼,200表示正常訪問。
?
$body_bytes_sent對應的是48字節,即響應body的大小。
?
“$http_referer” 對應的是”https://vincent.com/“,若是直接打開域名瀏覽的時,referer就會沒有值,為”-“。
?
“$http_user_agent” 對應的是”Mozilla/5.0 (Macintosh; Intel Mac OS X 10.12; rv:56.0) Gecko/20100101 Firefox/56.0”。
?
“$http_x_forwarded_for” 對應的是”-“或者空。
Nginx統計站點訪問量、高頻url統計
- 查看訪問最頻繁的前100個IP
awk '{print $1}' access_temp.log | sort -n |uniq -c | sort -rn | head -n 100
- 統計訪問最多的url 前20名
cat access_temp.log |awk '{print $7}'| sort|uniq -c| sort -rn| head -20 | more
- 基礎命令
awk 是文本處理工具,默認按照空格切分,$N 是第切割后第N個,從1開始
?
?
sort命令用于將文本文件內容加以排序,-n 按照數值排,-r 按照倒序來排
案例的sort -n 是按照第一列的數值大小進行排序,從小到大,倒序就是 sort -rn
?
uniq 去除重復出現的行列, -c 在每列旁邊顯示該行重復出現的次數
自定義日志格式,統計接口響應耗時
- 日志格式增加 $request_time
從接受用戶請求的第一個字節到發送完響應數據的時間,即包括接收請求數據時間、程序響應時間、輸出響應數據時間
?
$upstream_response_time:指從Nginx向后端建立連接開始到接受完數據然后關閉連接為止的時間
?
$request_time一般會比upstream_response_time大,因為用戶網絡較差,或者傳遞數據較大時,前者會耗時大很多
- 配置自定義日志格式
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for" $request_time';
?
?
server {
listen 80;
server_name vincent9527.com;
?
location / {
root /usr/local/nginx/html;
index vincent.html;
}
#charset koi8-r;
#
access_log logs/host.access.log main;
}
- 統計耗時接口, 列出傳輸時間超過 2 秒的接口,顯示前5條
cat time_temp.log|awk '($NF > 2){print $7}'|sort -n|uniq -c|sort -nr|head -5
?
備注:$NF 表示最后一列, awk '{print $NF}'
Nginx的upstream模板介紹
- 負載均衡(Load Balance)
- 分布式系統中一個非常重要的概念,當訪問的服務具有多個實例時,需要根據某種“均衡”的策略決定請求發往哪個節點,這就是所謂的負載均衡
- 原理是:將數據流量分攤到多個服務器執行,減輕每臺服務器的壓力,從而提高了數據的吞吐量
- 負載均衡的種類
- 通過硬件來進行解決,常見的硬件有NetScaler、F5、Radware和Array等商用的負載均衡器,但比較昂貴的
- 通過軟件來進行解決,常見的軟件有LVS、Nginx等,它們是基于Linux系統并且開源的負載均衡策略
- 目前性能和成本來看,Nginx是目前多數公司選擇使用的
- 配置案例
upstream lbs {
server 192.168.0.106:8080;
server 192.168.0.106:8081;
}
?
location /api/ {
proxy_pass http://lbs;
proxy_redirect default;
}
Nginx常見的負載均衡策略解析
- 節點輪詢(默認)
簡介:每個請求按順序分配到不同的后端服務器
場景:會造成可靠性低和負載分配不均衡,適合靜態文件服務器
- weight 權重配置
簡介:weight和訪問比率成正比,數字越大,分配得到的流量越高
場景:服務器性能差異大的情況使用
upstream lbs {
server 192.168.159.133:8080 weight=5;
server 192.168.159.133:8081 weight=10;
}
- ip_hash(固定分發)
簡介:根據請求按訪問ip的hash結果分配,這樣每個用戶就可以固定訪問一個后端服務器
場景:服務器業務分區、業務緩存、Session需要單點的情況
upstream lbs {
ip_hash;
server 192.168.159.133:8080;
server 192.168.159.133:8081;
}
- upstream還可以為每個節點設置狀態值
down 表示當前的server暫時不參與負載
server 192.168.159.133:8080 down;
backup 其它所有的非backup機器down的時候,會請求backup機器,這臺機器壓力會最輕,配置也會相對低
server 192.168.159.133:8080 backup;
Nginx探測后端節點可用性和配置
- 如果某個應用掛了,請求不應該繼續分發過去
max_fails 允許請求失敗的次數,默認為1.當超過最大次數時就不會請求
fail_timeout : max_fails次失敗后,暫停的時間,默認:fail_timeout為10s
參數解釋:
- max_fails=N 設定Nginx與后端節點通信的嘗試失敗的次數
- 在fail_timeout參數定義的時間內,如果失敗的次數達到此值,Nginx就這個節點不可用
- 在下一個fail_timeout時間段到來前,服務器不會再被嘗試
- 失敗的嘗試次數默認是1,如果設為0就會停止統計嘗試次數,認為服務器是一直可用的
什么是nginx認為的失敗呢
可以通過指令proxy_next_upstream來配置什么是失敗的嘗試
注意默認配置時,http_404狀態不被認為是失敗的嘗試
- 配置實操
upstream lbs {
server 192.168.0.106:8080 max_fails=2 fail_timeout=60s ;
server 192.168.0.106:8081 max_fails=2 fail_timeout=60s;
}
?
?
location /api/ {
proxy_pass http://lbs;
proxy_next_upstream error timeout http_500 http_503 http_404;
}
- 案例實操
暫停一個后節點,然后訪問接口大于10次,Nginx會把這個節點剔除
重啟這個節點,在fail_timeout周期里面不會再獲取流量
Nginx自定義全局異常json數據
- 任何接口都是可能出錯,4xx、5xx等
- 如果業務沒有做好統一的錯誤管理,直接暴露給用戶,無疑是看不懂
- 所以假如后端某個業務出錯,nginx層也需要進行轉換
- 讓前端知道Http響應是200,其實是將錯誤的狀態碼定向至200,返回了全局兜底數據
location / {
proxy_pass http://lbs;
proxy_redirect default;
# 存放用戶的真實ip
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_next_upstream error timeout http_503 non_idempotent;
?
#開啟錯誤攔截配置,一定要開啟
proxy_intercept_errors on;
}
?
# 不加 =200,則返回的就是原先的http錯誤碼;配上后如果出現500等錯誤都返回給用戶200狀態,并跳轉至/default_api
error_page 404 500 502 503 504 =200 /default_api;
location = /default_api {
default_type application/json;
return 200 '{"code":"-1","msg":"invoke fail, not found "}';
}
Nginx封禁惡意IP
網絡攻擊時有發生,TCP洪水攻擊、注入攻擊、DOS等,比較難防的有DDOS等
數據安全,防止對手爬蟲惡意爬取,封禁IP
- 采取措施一般就是封禁ip
linux server的層面封IP:iptables
nginx的層面封IP ,方式多種 (但 req還是會打進來, 讓nginx 返回 403, 占用資源)
- Nginx作為網關,可以有效的封禁ip
單獨網站屏蔽IP的方法,把include xxx; 放到網址對應的在server{}語句塊,虛擬主機
所有網站屏蔽IP的方法,把include xxx; 放到http {}語句塊。
?
nginx配置如下:
?
http{
# ....
include blacklist.conf;
}
?
location / {
proxy_pass http://lbs;
proxy_redirect default;
}
?
?
#blacklist.conf目錄下文件內容
deny 192.168.159.2;
deny 192.168.159.32;
- ./nginx -s reload #重新加載配置,不中斷服務
- 自動化封禁思路
- 編寫shell腳本
- awk 統計access.log,記錄每秒訪問超過60次的ip,然后配合nginx或者iptables進行封禁
- crontab定時跑腳本
Nginx配置解決瀏覽器跨域
- 跨域:瀏覽器同源策略 1995年,同源政策由 Netscape 公司引入瀏覽器。目前,所有瀏覽器都實行這個政策。 最初,它的含義是指,A網頁設置的 Cookie,B網頁不能打開,除非這兩個網頁"同源"。所謂"同源"指的是"三個相同"
協議相同 http https
域名相同 www.baidu.com
端口相同 80 81
一句話:瀏覽器從一個域名的網頁去請求另一個域名的資源時,域名、端口、協議任一不同,都是跨域
瀏覽器控制臺跨域提示:
No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'null' is therefore not allowed access.
- 解決方法
- JSONP
- Http響應頭配置允許跨域
- nginx層配置
- 程序代碼中處理通過攔截器配置
- Nginx開啟跨域配置
location下配置
location / {
add_header 'Access-Control-Allow-Origin' $http_origin;
add_header 'Access-Control-Allow-Credentials' 'true';
add_header 'Access-Control-Allow-Headers' 'DNT,web-token,app-token,Authorization,Accept,Origin,Keep-Alive,User-Agent,X-Mx-ReqToken,X-Data-Type,X-Auth-Token,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range';
add_header Access-Control-Allow-Methods 'GET,POST,OPTIONS';
?
#如果預檢請求則返回成功,不需要轉發到后端
if ($request_method = 'OPTIONS') {
add_header 'Access-Control-Max-Age' 1728000;
add_header 'Content-Type' 'text/plain; charset=utf-8';
add_header 'Content-Length' 0;
return 200;
}
}
Nginx的location規則
- 正則表達式
^ 以什么開始
$ 以什么結束
?
例如:^/api/user$
- location 路徑匹配
語法: location [ = | ~ | ~* | ^~ ] uri { ...... }
- location = /uri
= 表示精準匹配,只要完全匹配上才能生效
- location /uri
不帶任何修飾符,表示前綴匹配
- location ^~ /uri/
匹配任何已 /uri/ 開頭的任何查詢并且停止搜索
- location /
通用匹配,任何未匹配到其他location的請求都會匹配到
- 正則匹配
區分大小寫匹配(~)
不區分大小寫匹配(~*)
- 優先級(不要寫復雜,容易出問題和遺忘)
精準匹配 > 字符串匹配(若有多個匹配項匹配成功,那么選擇匹配長的并記錄) > 正則匹配
- 案例
server {
?
server_name vincent.com;
?
location ~^/api/pub$ {
...
}
?
}
?
^/api/pub$ 這個正則表達式表示字符串必須以/開始,以b$結束,中間必須是/api/pub
?
http://vincent.com/api/v1 匹配(完全匹配)
?
http://vincent.com/API/PUB 不匹配,大小寫敏感
?
http://vincent.com/api/pub?key1=value1 匹配
?
http://vincent.com/api/pub/ 不匹配
?
http://vincent.com/api/public 不匹配,不能匹配正則表達式
- 測試
location = /img/test.png {
return 1;
}
?
location /img/test.png {
return 2;
}
?
location ^~/img/ {
return 3;
}
?
location = / {
return 4;
}
?
location / {
return 5;
}
Nginx的rewrite規則和應用
- rewrite 地址重定向,實現URL重定向的重要指令,他根據regex(正則表達式)來匹配內容跳轉到相應的頁面
語法: rewrite regex replacement[flag]
rewrite ^/(.*) https://vincent.com/$1 permanent
# 這是一個正則表達式,匹配完整的域名和后面的路徑地址
# replacement部分是https://xdclass.net/$1,$1是取自regex部分()里的內容
- 常用正則表達式
字符 | 描述 |
---|---|
^ | 匹配輸入字符串的起始位置 |
$ | 匹配輸入字符串的結束位置 |
* | 匹配前面的字符零次或者多次 |
+ | 匹配前面字符串一次或者多次 |
? | 匹配前面字符串的零次或者一次 |
. | 匹配除“\n”之外的所有單個字符 |
(pattern) | 匹配括號內的pattern |
- rewrite 最后一項flag參數
標記符號 | 說明 |
---|---|
last | 本條規則匹配完成后繼續向下匹配新的location URI規則 |
break | 本條規則匹配完成后終止,不在匹配任何規則 |
redirect | 返回302臨時重定向 |
permanent | 返回301永久重定向 |
- 應用場景
- 非法訪問跳轉,防盜鏈
- 網站更換新域名
- http跳轉https
- 不同地址訪問同一個虛擬主機的資源
Nginx 配置websocket反向代理
- 配置
server {
listen 80;
server_name vincent.com;
location / {
proxy_pass http://lbs;
proxy_read_timeout 300s; //websocket空閑保持時長
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_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
}
}
- 核心是下面的配置 其他和普通反向代理沒區別, 表示請求服務器升級協議為WebSocket
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
- 服務器處理完請求后,響應如下報文 # 狀態碼為101
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: upgrade
Nginx的配置服務端緩存核心配置
- 常見的開發人員控制的緩存分類
- 數據庫緩存
- 應用程序緩存
- Nginx網關緩存
- 前端緩存
- 讓后端結果緩存離用戶更進一步
/root/cache
本地路徑,用來設置Nginx緩存資源的存放地址levels=1:2
默認所有緩存文件都放在上面指定的根路徑中,可能影響緩存的性能,推薦指定為 2 級目錄來存儲緩存文件;1和2表示用1位和2位16進制來命名目錄名稱。第一級目錄用1位16進制命名,如a;第二級目錄用2位16進制命名,如3a。所以此例中一級目錄有16個,二級目錄有16*16=256個,總目錄數為16 * 256=4096個。
當levels=1:1:1時,表示是三級目錄,且每級目錄數均為16個
key_zone
在共享內存中定義一塊存儲區域來存放緩存的 key 和 metadatamax_size
最大緩存空間, 如果不指定會使用掉所有磁盤空間。當達到 disk 上限后,會刪除最少使用的 cacheinactive
某個緩存在inactive指定的時間內如果不訪問,將會從緩存中刪除proxy_cache_valid
配置nginx cache中的緩存文件的緩存時間,proxy_cache_valid 200 304 2m 對于狀態為200和304的緩存文件的緩存時間是2分鐘use_temp_path
建議為 off,則 nginx 會將緩存文件直接寫入指定的 cache 文件中proxy_cache
啟用proxy cache,并指定key_zone,如果proxy_cache off表示關閉掉緩存add_header Nging-Cache "$upstream_cache_status"
用于前端判斷是否是緩存,miss、hit、expired(緩存過期)、updating(更新,使用舊的應答)
proxy_cache_path /root/cache levels=1:2 keys_zone=vincent_cache:10m max_size=1g inactive=60m use_temp_path=off;
?
server {
?
location / {
...
proxy_cache vincent_cache;
proxy_cache_valid 200 304 10m;
proxy_cache_valid 404 1m;
proxy_cache_key $host$uri$is_args$args;
add_header Nginx-Cache "$upstream_cache_status";
}
}
- 還原nginx配置,只保留upstream模塊
- 配置實操
請求后端json接口,通過控制臺日志判斷是否有到后端服務
注意
- nginx緩存過期影響的優先級進行排序為:inactvie > 源服務器端Expires/max-age > proxy_cache_valid
- 如果出現 Permission denied 修改nginx.conf,將第一行修改為 user root
- 默認情況下GET請求及HEAD請求會被緩存,而POST請求不會被緩存,并非全部都要緩存,可以過濾部分路徑不用緩存
- 緩存清空
直接rm刪除
ngx_cache_purge
- 緩存命中率統計
前端打點日志上報
nginx日志模板增加信息
- $upstream_cache_status
Nginx的壓縮配置和實操
- 對文本、js和css文件等進行壓縮,一般是壓縮后的大小是原始大小的25%
#開啟gzip,減少我們發送的數據量
gzip on;
gzip_min_length 1k;
?
#4個單位為16k的內存作為壓縮結果流緩存
gzip_buffers 4 16k;
?
#gzip壓縮比,可在1~9中設置,1壓縮比最小,速度最快,9壓縮比最大,速度最慢,消耗CPU
gzip_comp_level 4;
?
#壓縮的類型
gzip_types application/javascript text/plain text/css application/json application/xml text/javascript;
?
#給代理服務器用的,有的瀏覽器支持壓縮,有的不支持,所以避免浪費不支持的也壓縮,所以根據客戶端的HTTP頭來判斷,是否需要壓縮
gzip_vary on;
?
#禁用IE6以下的gzip壓縮,IE某些版本對gzip的壓縮支持很不好
gzip_disable "MSIE [1-6].";
- 壓縮前后區別(上傳js文件進行驗證)
location /static {
alias /usr/local/software/static;
}
- 壓縮是時間換空間,還是空間換時間?
web層主要涉及瀏覽器和服務器的網絡交互,而網絡交互顯然是耗費時間的
要盡量減少交互次數
降低每次請求或響應數據量
開啟壓縮
- 在服務端是時間換空間的策略,服務端需要犧牲時間進行壓縮以減小響應數據大小
- 壓縮后的內容可以獲得更快的網絡傳輸速度,時間是得到了優化
- 所以是雙向的
智能推薦
Nginx的簡介
Nginx介紹 Nginx是一款輕量級的Web 服務器/反向代理服務器及電子郵件(IMAP/POP3)代理服務器,在BSD-like 協議下發行。其特點是占有內存少,并發能力強,事實上nginx的并發能力在同類型的網頁服務器中表現較好,中國大陸使用nginx網站用戶有:百度、京東、新浪、網易、騰訊、淘寶等。 內存: 不到2M 并發能力強: 3-5萬次/秒 理想環境下 /tomcat服務器 150-...
nginx簡介和使用
Nginx 的代名詞就是 “高負載均衡服務器”。 官網地址:http://nginx.org/en/download.html 1 簡介 nginx (“engine x”) 是一個高性能的 HTTP 和 反向代理 服務器,也是一個 IMAP/POP3/SMTP 代理服務器。 Nginx 是由 Igor Sysoev 為俄羅斯訪問量第二的 Rambl...
Nginx簡介---01
反向代理機制 反向代理服務器位于用戶與目標服務器之間,但是對于用戶而言,反向代理服務器就相當于目標服務器,即用戶直接訪問反向代理服務器就可以獲得目標服務器的資源。同時,用戶不需要知道目標服務器的地址,也無須在用戶端作任何設定。反向代理服務器通常可用來作為Web加速,即使用反向代理作為Web服務器的前置機來降低網絡和服務器的負載,提高訪問效率。 概括: 1.位于用戶(客戶端)-服務器之間. 2.用戶...
freemarker + ItextRender 根據模板生成PDF文件
1. 制作模板 2. 獲取模板,并將所獲取的數據加載生成html文件 2. 生成PDF文件 其中由兩個地方需要注意,都是關于獲取文件路徑的問題,由于項目部署的時候是打包成jar包形式,所以在開發過程中時直接安照傳統的獲取方法沒有一點文件,但是當打包后部署,總是出錯。于是參考網上文章,先將文件讀出來到項目的臨時目錄下,然后再按正常方式加載該臨時文件; 還有一個問題至今沒有解決,就是關于生成PDF文件...
猜你喜歡
電腦空間不夠了?教你一個小秒招快速清理 Docker 占用的磁盤空間!
Docker 很占用空間,每當我們運行容器、拉取鏡像、部署應用、構建自己的鏡像時,我們的磁盤空間會被大量占用。 如果你也被這個問題所困擾,咱們就一起看一下 Docker 是如何使用磁盤空間的,以及如何回收。 docker 占用的空間可以通過下面的命令查看: TYPE 列出了docker 使用磁盤的 4 種類型: Images:所有鏡像占用的空間,包括拉取下來的鏡像,和本地構建的。 Con...
requests實現全自動PPT模板
http://www.1ppt.com/moban/ 可以免費的下載PPT模板,當然如果要人工一個個下,還是挺麻煩的,我們可以利用requests輕松下載 訪問這個主頁,我們可以看到下面的樣式 點每一個PPT模板的圖片,我們可以進入到詳細的信息頁面,翻到下面,我們可以看到對應的下載地址 點擊這個下載的按鈕,我們便可以下載對應的PPT壓縮包 那我們就開始做吧 首先,查看網頁的源代碼,我們可以看到每一...
Linux C系統編程-線程互斥鎖(四)
互斥鎖 互斥鎖也是屬于線程之間處理同步互斥方式,有上鎖/解鎖兩種狀態。 互斥鎖函數接口 1)初始化互斥鎖 pthread_mutex_init() man 3 pthread_mutex_init (找不到的情況下首先 sudo apt-get install glibc-doc sudo apt-get install manpages-posix-dev) 動態初始化 int pthread_...
統計學習方法 - 樸素貝葉斯
引入問題:一機器在良好狀態生產合格產品幾率是 90%,在故障狀態生產合格產品幾率是 30%,機器良好的概率是 75%。若一日第一件產品是合格品,那么此日機器良好的概率是多少。 貝葉斯模型 生成模型與判別模型 判別模型,即要判斷這個東西到底是哪一類,也就是要求y,那就用給定的x去預測。 生成模型,是要生成一個模型,那就是誰根據什么生成了模型,誰就是類別y,根據的內容就是x 以上述例子,判斷一個生產出...