史上最全的技術實踐之nginx,反向代理、防盜鏈、高速緩存

今天說說nginx, 其實有老鐵比較奇怪,nginx不是運維來搞的嗎?確實是的,大部分情況下,公司比較大的話,存在運維的話,這個鍋肯定是運維來做的。但是現在有個趨勢叫devops之前我也說過,開發運維一體化,開發也要懂一定的運維知識。在一些互聯網的創業公司剛開始技術的工種,並不是分的那麼清楚,可能都要會的。環境的搭建,運維,框架搭建,開發都必須拿得下來。

源碼:https://github.com/limingios/netFuture/tree/master/nginx


史上最全的技術實踐之nginx,反向代理、防盜鏈、高速緩存


Nginx服務搭建與基礎演示(一)

Nginx

  • 官網

http://nginx.org/


史上最全的技術實踐之nginx,反向代理、防盜鏈、高速緩存


  • 介紹

Nginx是一個輕量級、高性能、穩定性高、併發性好的HTTP和反向代理服務器。也是由於其的特性,其應用非常廣。

  • 歷史

由俄羅斯的程序設計師Igor Sysoev所開發,最初供俄國大型的入口網站及搜尋引擎Rambler(俄文:Рамблер)使用。 其特點是佔有內存少,併發能力強,事實上nginx的併發能力確實在同類型的網頁伺服器中表現較好.目前中國大陸使用nginx網站用戶有:新浪、網易、 騰訊,另外知名的微網誌Plurk也使用nginx。

  • 理解代理的概念

1.正向代理:某些情況下,代理我們用戶去訪問服務器,需要用戶手動的設置代理服務器的ip和端口號。

2.反向代理:是用來代理服務器的,代理我們要訪問的目標服務器。代理服務器接受請求,然後將請求轉發給內部網絡的服務器(集群化),並將從服務器上得到的結果返回給客戶端,此時代理服務器對外就表現為一個服務器。

  • 根據源碼配置的機器


史上最全的技術實踐之nginx,反向代理、防盜鏈、高速緩存


系統類型IP地址節點角色CPUMemoryHostnameCentos7192.168.66.110nginx12GnginxCentos7192.168.66.111tomcat12Gtomcat1Centos7192.168.66.112tomcat12Gtomcat2


史上最全的技術實踐之nginx,反向代理、防盜鏈、高速緩存


  • 三臺機器

準備工作

yum -y install make zlib zlib-devel gcc-c++ libtool openssl openssl-devel


史上最全的技術實踐之nginx,反向代理、防盜鏈、高速緩存


史上最全的技術實踐之nginx,反向代理、防盜鏈、高速緩存


史上最全的技術實踐之nginx,反向代理、防盜鏈、高速緩存


  • nginx主機安裝pcre的安裝包(192.168.66.110)

https://sourceforge.net/projects/pcre/files/pcre/

nginx rewrite依賴於PCRE庫,所以需要在linux系統中編譯安裝PCRE庫


史上最全的技術實踐之nginx,反向代理、防盜鏈、高速緩存


wget https://nchc.dl.sourceforge.net/project/pcre/pcre/8.41/pcre-8.41.tar.gz
tar zxvf pcre-8.41.tar.gz
cd image.png
./configure
make && make install
pcre-config --prefix


史上最全的技術實踐之nginx,反向代理、防盜鏈、高速緩存


史上最全的技術實踐之nginx,反向代理、防盜鏈、高速緩存


史上最全的技術實踐之nginx,反向代理、防盜鏈、高速緩存


  • 安裝nginx
cd ..
wget http://nginx.org/download/nginx-1.13.10.tar.gz
tar zxvf nginx-1.13.10.tar.gz
mkdir nginx
cd nginx-1.13.10
./configure --prefix=/root/nginx --with-http_stub_status_module --with-http_ssl_module --with-pcre=/root/pcre-8.41
make && make install

cd ~
cd nginx/sbin/
./nginx -v
./nginx -t


史上最全的技術實踐之nginx,反向代理、防盜鏈、高速緩存


史上最全的技術實踐之nginx,反向代理、防盜鏈、高速緩存


  • 啟動nginx
cd ~/nginx/sbin/
./nginx

其實沒有權限


史上最全的技術實踐之nginx,反向代理、防盜鏈、高速緩存


修改配置文件

vi ~/nginx/conf/nginx.conf
#修改成user root
#wq保存
#重新加載nginx新的配置
./sbin/nginx -s reload


史上最全的技術實踐之nginx,反向代理、防盜鏈、高速緩存


史上最全的技術實踐之nginx,反向代理、防盜鏈、高速緩存


史上最全的技術實踐之nginx,反向代理、防盜鏈、高速緩存


  • 111 和112 兩個機器安裝tomcat
java -version
wget http://mirrors.hust.edu.cn/apache/tomcat/tomcat-8/v8.5.37/bin/apache-tomcat-8.5.37.tar.gz


史上最全的技術實踐之nginx,反向代理、防盜鏈、高速緩存


史上最全的技術實踐之nginx,反向代理、防盜鏈、高速緩存


tar zxvf apache-tomcat-8.5.37.tar.gz 
cd apache-tomcat-8.5.37
cd bin
./startup.sh
curl 127.0.0.1:8080


史上最全的技術實踐之nginx,反向代理、防盜鏈、高速緩存


史上最全的技術實踐之nginx,反向代理、防盜鏈、高速緩存


史上最全的技術實踐之nginx,反向代理、防盜鏈、高速緩存


史上最全的技術實踐之nginx,反向代理、防盜鏈、高速緩存


  • 111 和112 添加一個index.jsp文件方法查看
cd /root/apache-tomcat-8.5.37/webapps/ROOT
>index.jsp
vi index.jsp
cat index.jsp


史上最全的技術實踐之nginx,反向代理、防盜鏈、高速緩存


史上最全的技術實踐之nginx,反向代理、防盜鏈、高速緩存


史上最全的技術實踐之nginx,反向代理、防盜鏈、高速緩存


史上最全的技術實踐之nginx,反向代理、防盜鏈、高速緩存


upstream 與location 模塊參數與案例講解(二)

未來軟件其實都是趨於模塊化的。拼裝完成。

upstream

  • 官網的介紹

http://nginx.org/en/docs/


史上最全的技術實踐之nginx,反向代理、防盜鏈、高速緩存


  • upstream實例

http://nginx.org/en/docs/http/ngx_http_upstream_module.html


史上最全的技術實踐之nginx,反向代理、防盜鏈、高速緩存


  • upstream 參數

參數名稱描述service反向服務地址 加端口weight權重max_fails失敗多少次 認為主機已掛掉則,踢出,默認是1次,企業一般配置2到3次,但是電商更加重視用戶體驗所以就是1次。前提這個機器供給比較多。fail_timeout踢出後重新探測時間backup備用服務max_conns允許最大連接數slow_start當節點恢復,不立即加入

修改66.110 那個nginx配置文件

vi /root/nginx/conf/nginx.conf
cat /root/nginx/conf/nginx.conf


史上最全的技術實踐之nginx,反向代理、防盜鏈、高速緩存


史上最全的技術實踐之nginx,反向代理、防盜鏈、高速緩存


因為權重相同,所以輪播111 和 112 2個tomcat


史上最全的技術實踐之nginx,反向代理、防盜鏈、高速緩存



史上最全的技術實踐之nginx,反向代理、防盜鏈、高速緩存


yu

*負載均衡算法

1.ll+weight

默認的負載算法,其實就是根據權重才分配服務請求。

2.ip_hash

基於Hash 計算 應用場景:保持session 一至性,第一次訪問那臺,一直是同一臺。hash(ip)%3 =index。弊端小區或者學校集中化的地方,他們出去的ip都是一致的,某個節點負載會非常非常的大。成為熱點,有了ip_hash導致weight權重就失效了。

3.url_hash

(第三方)應用場景:靜態資源緩存,節約存儲,加快速度

4.least_conn

最少鏈接

5.least_time

最小的響應時間,計算節點平均響應時間,然後取響應最快的那個,分配更高權重。

6.keeplive

佔用連接數。內存消耗比較大,但是響應速度很快,應該保持這socket連接。

  • location
  • 1.root

後面的配置相當於把瀏覽器中的輸入路徑進行了重指

2.index

在前後端分離的基礎上,指定網站初始頁

3.proxy_set_header

用來重定義發往後端服務器的請求頭

4.proxy_pass

如果在proxy_pass後面的url加/,表示絕對根路徑;如果沒有/,表示相對路徑,把匹配的路徑部分也給代理走


史上最全的技術實踐之nginx,反向代理、防盜鏈、高速緩存


動靜分離方案

一般動靜分離兩種方式

  1. 靜態文件放入nginx
  2. 靜態文件放入指定的服務器,通過請求地址來區別跳轉到那個服務器。
  • 靜態文件放入nginx
#思路:動、靜態的文件,請求時匹配不同的目錄當訪問gif,jpeg時 直接訪問e:wwwroot;
server {
listen 80;
server_name localhost;
location / {
root e:wwwroot;
index index.html;
}
# 所有靜態請求都由nginx處理,存放目錄為html
location ~ .(gif|jpg|jpeg|png|bmp|swf|css|js)$ {
root e:wwwroot;
}
# 所有動態請求都轉發給tomcat處理
location ~ .(jsp|do)$ {
proxy_pass http://test;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {

root e:wwwroot;
}
}
  • 靜態服務器的方式

多個upstream,多個location, location的名稱不一樣。

史上最全的技術實踐之nginx,反向代理、防盜鏈、高速緩存

Nginx如何實現高速緩存(三)

場景介紹

假設在做一個大型項目,面向全國的,公司對架構師的要求是做到700+的QPS,如何去處理。

  • 介紹幾個開發網站需要了解的關鍵字
  1. 響應時間(RT)

響應時間是指系統對請求作出響應的時間。

  1. 吞吐量(TPS)

系統在單位時間內處理請求的數量

  1. 併發用戶數

系統可以同時承載的正常使用系統功能的用戶的數量

  1. QPS每秒查詢率

對一個特定的查詢服務器在規定時間內所處理流量多少的衡量標準

  • 瞭解下一個網站一般的實際html大小

打開一個技術博客:idig8.com


史上最全的技術實踐之nginx,反向代理、防盜鏈、高速緩存


查看源代碼


史上最全的技術實踐之nginx,反向代理、防盜鏈、高速緩存


保存在文件大小:45kb,700QPS/s = 700*45/1024 = 30MB,單個頁面如果700QPS的話需要吐出來30MB/s的量,畢竟是個人博客肯定承受不了。


史上最全的技術實踐之nginx,反向代理、防盜鏈、高速緩存


史上最全的技術實踐之nginx,反向代理、防盜鏈、高速緩存


image.png

咱們在拿某東為例,保存在文件大小:186kb,700QPS/s = 700*186/1024 = 100MB+,單個頁面如果700QPS的話需要吐出來100MB/s的量,某東好牛逼。


史上最全的技術實踐之nginx,反向代理、防盜鏈、高速緩存


史上最全的技術實踐之nginx,反向代理、防盜鏈、高速緩存


史上最全的技術實踐之nginx,反向代理、防盜鏈、高速緩存


如果讓咱們來設計京東這麼大的體諒如何設計。

  • 對於商品詳情 頁涉及瞭如下主要服務:
  1. 商品詳情頁HTML頁面渲染
  2. 價格服務
  3. 促銷服務 庫存狀態/配送至服務 廣告詞服務
  4. 預售/秒殺服務
  5. 評價服務
  6. 試用服務
  7. 推薦服務
  8. 商品介紹服務 各品類相關的一些特殊服務

上邊的全部搞成微服務。

  1. 採用Ajax 動態加載 價格、廣告、庫存等服務
  2. 採用key value 緩存詳情頁主體html。

很多比較大型的內部系統都是這樣來設計的。


史上最全的技術實踐之nginx,反向代理、防盜鏈、高速緩存


微服務和微服務之前都是內網都是千兆帶寬,第一次從微服務中取。之後都是通過redis直接過去。特殊的數據通過ajax的方式。從redis來獲取肯定會有大大的提升。如果用這種情況500qps還是可以的,如果想往上走,基本很難得。但是我們的要求走到700qps。

當達到500QPS 的時候很難繼續壓測上去。


史上最全的技術實踐之nginx,反向代理、防盜鏈、高速緩存


分析原因:一個詳情頁html 主體達平均150 kb 那麼在500QPS 已接近局域網寬帶極限。75MB+,內網一般都是千兆帶寬,千年帶寬128MB/s,其實這個也是在往內網IO的一個瓶頸上邊走。在上邊圖的架構,其實內網走了2次,一個是通過nginx訪問商品的詳情服務,一個是詳情服務訪問redis。

  • 如果想解決上邊的2次內網的通信最理想的方式,上圖中的2個節點都不要就可以了。

不走redis緩存,也不通過nginx來請求商品詳情頁服務,直接從nginx本地的硬盤緩存來走。內網通信的瓶頸是不是就解決了。


史上最全的技術實踐之nginx,反向代理、防盜鏈、高速緩存


  • 解決方式

減少內網的通信,nginx本身也可以通過配置將數據緩存到本地硬盤上,下次請求直接請求nginx內部的硬盤緩存數據,這樣也減少了內網的通信。


史上最全的技術實踐之nginx,反向代理、防盜鏈、高速緩存


正常情況下是這樣的流程,有緩存的情況。


史上最全的技術實踐之nginx,反向代理、防盜鏈、高速緩存


正常情況下沒有緩存的情況,nginx自動添加緩存


史上最全的技術實踐之nginx,反向代理、防盜鏈、高速緩存


商品變更怎麼辦,思路是通過MQ消息服務,通過詳情頁服務,由詳情頁服務統一的來請求直接的地址的,來清空nginx下的緩存。


史上最全的技術實踐之nginx,反向代理、防盜鏈、高速緩存


nginx的緩存配置

  • nginx如何配置緩存

proxy_cache 是用於 proxy 模式(一般也可稱為反代)的緩存功能

events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
#配置緩存
proxy_cache_path /data/nginx/cache_item levels=1:2 keys_zone=cache_item:200m inactive=30d max_size=10g;

upstream idig8 {
server 192.168.66.111:8080 weight=5;
server 192.168.66.112:8080 weight=5;
}
server {
listen 80;
server_name localhost;
location / {
root html;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}

#配置緩存
location ~*\\.(html|htm)$ {
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_pass http://idig8;

proxy_cache cache_item;
proxy_cache_key $host$uri$is_args$args;
proxy_cache_valid 200 304 12h;
expires 7d;
}
}
}


史上最全的技術實踐之nginx,反向代理、防盜鏈、高速緩存


image.png

  • 在tomcat目錄下新建立一個index.html

tomcat1

idig8.com
192.168.66.111


史上最全的技術實踐之nginx,反向代理、防盜鏈、高速緩存


tomcat2

idig8.com
192.168.66.112


史上最全的技術實踐之nginx,反向代理、防盜鏈、高速緩存


  • 重啟nginx
./sbin/nginx -s stop
mkdir -p /data/nginx/cache_item
./sbin/nginx
  • 查看緩存路徑
pwd
cd /data/nginx/cache_item/3/cf
ls


史上最全的技術實踐之nginx,反向代理、防盜鏈、高速緩存


  • 清空緩存

看看效果


史上最全的技術實踐之nginx,反向代理、防盜鏈、高速緩存


史上最全的技術實踐之nginx,反向代理、防盜鏈、高速緩存


修改了index.html


史上最全的技術實踐之nginx,反向代理、防盜鏈、高速緩存


請求還是緩存裡面的數據


史上最全的技術實踐之nginx,反向代理、防盜鏈、高速緩存


回顧如何配置,該方案Nginx 配置實現

1、在http元素下添加緩存區聲明。
proxy_cache_path /data/nginx/cache_item levels=1:1:2 keys_zone=cache_item:500m
inactive=30d max_size=10g;
2、為指定location 設定緩存策略。
proxy_cache cache_item;
proxy_cache_key $host $uri$is_args$args;#以全路徑md5值做做為Key
proxy_cache_valid 200 304 12h; #對不同的HTTP狀態碼設置不同的緩存時間
expires 7d; #總體緩存時間

演示緩存生效過程

  1. 配置聲明緩存路徑
  2. 為location 配置緩存策略
  3. 重啟nginx(修改了)
  4. 查看緩存目錄生成

父元素名稱描述httpproxy_cache_path指定緩存區的根路徑levels緩存目錄層級最高三層,每層1~2個字符表示。如1:1:2 表示三層。keys_zone緩存塊名稱 及內存塊大小。如cache_item:500m 。表示聲明一個名為cache_item 大小為500m。超出大小後最早的數據將會被清除。inactive最長閒置時間 如:10d 如果一個數據被閒置10天將會被清除max_size緩存區硬盤最大值。超出閒置數據將會被清除locationproxy_cache指定緩存區,對應keys_zone 中設置的值proxy_cache_key通過參數拼裝緩存key 如:host uri is_args args 則會以全路徑md5值做做為Keyproxy_cache_valid為不同的狀態碼設置緩存有效期

  • 緩存的清除:

該功能可以採用第三方模塊 ngx_cache_purge 實現。將ngx_cache_purge編譯到到Nginx中,用來清除指定URL的緩存。

  • 為nginx 添加 ngx_cache_purge 模塊
cd ~
wget http://labs.frickle.com/files/ngx_cache_purge-2.3.tar.gz
#查看已安裝模塊
~/nginx/sbin/nginx -V
#進⼊nginx安裝包⽬錄 重新安裝 --add-module為模塊解壓的全路徑
cd ~/nginx-1.13.10
./configure --prefix=/root/nginx --with-http_stub_status_module --with-http_ssl_module --add-module=/root/ngx_cache_purge-2.3
#重新編譯
make
cp /root/nginx-1.13.10/sbin/nginx ~/nginx/sbin/nginx
#查看是否安裝成功
./nginx/sbin/nginx -t


史上最全的技術實踐之nginx,反向代理、防盜鏈、高速緩存


史上最全的技術實踐之nginx,反向代理、防盜鏈、高速緩存


史上最全的技術實踐之nginx,反向代理、防盜鏈、高速緩存


清除配置

location ~ /purge(/.*) {
#允許訪問的IP
allow 127.0.0.1;
allow 192.168.0.193;
#禁⽌訪問的IP
deny all;
#配置清除指定緩存區和路徑(與proxy_cache_key⼀⾄)
proxy_cache_purge cache_item $host$1$is_args$args;
}

Nginx如何防盜鏈(四)

提問:

什麼是圖片防盜鏈?意思是指本站內圖片、CSS等資源只有本站點可以訪問,不允許其它站點打開!

該功能如果用JAVA如何實現?很單簡單,只要判斷一下 請求頭當中的referer 屬性是否為 指定域名即可。

Nginx原理類似。

location ~* \\.(gif|png|jpg|swf|flv)$ {
root html;
valid_referers none *.tl.com;
if ($invalid_referer) {
rewrite ^/ http://www.tl.com/image/403.png;
#return 404;
}
}

說明:如果 valid_referers 條件判斷未通過,nginx 則會賦值 invalid_referer 為true

語法: valid_referers none | blocked | server_names | string ...;

參數說明:

none

不允許 “Referer” 來源頭部為空的情況

blocked

不允許“Referer”值為空情況,有可能Referer被的值被代理或者防火牆刪除

server_names

“Referer”來源頭部包必須含當前的server_names (當前域名)可以多個

Nginx如何實現子域名站點配置,類似趕緊網城市站點的配置(三)

有時會有這樣的需求,每個子域名對應一個靜態站點(類似58到家、有贊商城等)。如果每天增加一個域名

的會相當麻煩。在nginx 當中可直接基於$host 連接到對應目錄。具體配置實現如下:

server {
listen 80;
server_name *.tl.com;

root /data/www/$host;
access_log logs/$host.access.log;
location / {
index index.html;
}
}

一定要修改下,主機的host文件,它依靠host文件的。

PS:一般用nginx比較多就是反向代理,其實很多特殊的配置也是在大型互聯網電商經常使用的。所以這個高速緩存和防盜鏈也是一個不錯的功能。


分享到:


相關文章: