假如前端是LVS或者nginx,後端是Apache伺服器
nginx反向代理伺服器,lvs代理伺服器
<b>nginx的LVS的差別</b>
如果是lvs,lvs隻是把使用者發來的請求資料包轉到後端的伺服器,後端的伺服器看到是使用者請求是來自于用戶端
如果是nginx,nginx不是轉發使用者發來的請求,而是代替使用者去後端的Apache伺服器去通路,後端Apache伺服器看到的使用者請求是來自nginx伺服器,這<b>叫反向代理</b>
lvs 工作在核心級,支援并發400萬
nginx工作在應用級,支援并發3萬
nginx代替遠端主機通路伺服器
nginx的并發是30000
nginx新版本支援動态部署子產品
支援高可用
支援熱部署,不停機更新版本,新發起的請求,在新版本響應,如果是一個連接配接舊版本,就在舊版本響應,當舊的通路結束了,新發起的請求我們就可以連接配接新的版本。也加平滑更新
低記憶體消耗
<b>支援的子產品 event-driven ,aio,mmap,sendfile</b>
<b>nginx是一個優秀的靜态資源的web伺服器,用來存放一些靜态的頁面</b>
<b>例如:html,圖檔,js,css,txt等靜态資源</b>
<b>nginx還可以充當http協定的反向代理伺服器</b>
nginx還可以充當郵件的反向代理伺服器
<b>nginx支援fastcgi</b>
nginx支援動态加載子產品
lnmp :linux nginx mysql php-fpm php-mysql 注:php-fpm是fastcgi
nginx充當的是fastcgi的用戶端,nginx要監聽fastcgi的9000端口
用戶端連接配接nginx,nginx連接配接php-fastcgi,php-fastcgi連接配接php-mysql,php-mysql在連接配接mysql資料庫
web伺服器的功能
支援室内主機
支援keep-alive和管道連接配接
通路日志
url rewirte 位址重寫
路徑别名
基于ip及使用者的通路控制
支援速率限制及并發數字限制
支援平滑更新
nginx處理并發使用者請求
事件驅動或異步模型,
主程序master負責生成子程序并讀取重載配置檔案等等
而子程序worker連接配接各種所需要的子產品來處理使用者請求,而處理請求時基于事件驅動模型能實作單程序處理多路請求,單個程序能處理連接配接數由worker kenaiks定義,而一共能啟用的程序數隻有worker_processes定義,二者的乘級就是他能處理的并發連接配接請求數量
nginx的架構
<b>nginx是一個master開多個worker</b>,但是worker不多。但是每個worker可以并發支援很多人的通路,worker中沒有線程,用的是I/O複用,
<b>一個worker就可以支援上萬的使用者請求,</b>
<b>worker支援很多子產品</b>,每個子產品有特定的功能,例如:web服務,代理服務,fastcgi
<b>當使用者發來請求,用worker提供服務</b>
<b>master和worker之間的關系</b>:master管理worker程序,例如:銷毀,會加載一個worker,平滑更新,都是master程序來負責的,master相當老闆,使用者發來請求,master不會提供服務
<b>nginx支援反向代理</b>:nginx可以将使用者的請求排程到後端的web伺服器,或者fastcgi伺服器
<b>nginx還支援緩存功能</b>:使用者将請求發給nginx,nginx可以緩存一份資料,下次使用者通路就可以直接在緩存中響應請求,就不用到後端伺服器去重新查找資料。nginx基于緩存加載,緩存管理的功能。這個緩存放在記憶體中也可能放在nginx磁盤裡
<b>nginx的特性</b>
multiplexing 多路複用
via kevent/epoll
event-drivent 異步
asynchronous 事件驅動
non-blocking 非阻塞
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiI9s2RkBnVHFmb1clWvB3MaVnRtp1XlBXe0xCM581dvRWYoNHLwEzX5xCMx8FesU2cfdGLwATMfRHLGZkRGZkRfJ3bs92YskmNhVTYykVNQJVMRhXVEF1X0hXZ0xiNx8VZ6l2cssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49jZpdmLiJDZwImYiBDMygDM2EWY4UGZ3czYyMWOiJGMiZTO0kzLcRTMvwFOwgTMwIzLcd2bsJ2LcNXZnFWbp9CXt92Yu8GdjFTNuITavw1LcpDc0RHaiojIsJye.gif)
HTTP 和nginx的相同點和不同點
Apache支援多http虛拟主機,不支援多https虛拟主機
nginx支援多https虛拟主機,因為nginx支援SNI
apache的并發隻能達到10000,而nginx能輕松達到30000
nginx支援epoll
apache支援select
select 跨平台,在linux實作了,也在windows支援
epoll :epoll比select有巨大的差別,因為epoll具有信号驅動I/O模型的某些特性
epoll和select的差別
select和epoll都可以面對多個使用者的程序發請求,select和epoll相當代理人收集很多使用者的請求過來,然後收集完成,select和epoll去幫你從磁盤上發資料,得到資料方複制到核心中,來得到相應的資料,但是這個資料有沒有準備好,select和epoll的實作機制是不一樣的
select和poll :周遊機制,一個一個的查找使用者的資料是否準備好
epoll :回調機制:相當于異步的機制,具有信号的一些特性,是以,當你的資料準備好以後epoll會主動通知你,相對來講epoll比select效率要高 。
select并發連接配接,接收的使用者請求是1024個,poll的并發連接配接無上限
epoll并發連接配接,接收的使用者請求是無上限
select 水準觸發
epoll支援水準觸發和邊緣觸發
select支援跨平台,支援windows和linux
epoll隻支援linux
水準觸發和邊緣觸發的差別
當我們的一個程式準備好以後,我是通知你一次還是多次
水準觸發:如果是水準觸發,是通知多次,這次資料沒有準備好,在通知
邊緣觸發:隻做一次的事,不分多次做,相對消耗資源少,邊緣觸發性能要更好
nginx的子產品,分為三類
核心子產品:core module
标準子產品:隻要描述了三個功能
HTTP功能子產品
mail郵件功能子產品
stream功能子產品,stream可以做的tcp協定的代理
第三方子產品
如果要安裝新版本的nginx可以在nginx的官方網站,進行拷貝官方提供的yum源
老版本 1.12.2 17年10月釋出的穩定版
nginx 重新啟動nginx服務
nginx -s stop 停止nginx服務
用什麼工具啟用的nginx服務,要用什麼工具停止服務
nginx -t 檢查配置檔案的文法
nginx -V 檢視版本和編譯選項
nginx -v 隻顯示版本
nginx -s reload 重載服務
nginx的功能
1.做web伺服器用
2.做web反向代理伺服器
3.和郵件相關
4.和tcp/udp轉發相關的
nginx在配置檔案中的指令都是由;分到結尾的
支援變量
内建變量:就是nginx自身的變量
自定義變量:
引用變量:
pstree -p 檢視線程
ab指令的包
yum install httpd-tools -y
并發測試
ab -c 1000 -n 2000 http://172.20.127.169/
nginx的優化
1.worker_processes auto; 根據CPU目前的情況自動定義worker的數量,最好和目前的CPU數量相等,例如:我們有兩個cpu就有2個worker,但是并不是worker越多性能就越好,因為每開一個程序都要消耗CPU,如果開的程序多,消耗的CPU就越多。nginx的一個worker就可以并發支援多個使用者的通路,是以nginx不是一個程序響應一個使用者
2.我們可以将一個worker和一個CPU綁定,這樣的好處是提高緩存的命中率,我們的CPU裡面也有緩存,如果一個worker和cpu綁定在一起,這樣CPU裡面的緩存就可以一直被這個worker重複使用,如果不綁定就有可能帶來問題,例如:支援跑在這個CPU,待會又可能跑在另一個CPU上,這樣原來CPU上的緩存就将失效了,由此會反過來影響我們的性能
我們可以用指令檢視worker程序在哪個CPU上
watch -n 0.5 'ps axo pid,cmd,psr |grep nginx'
worker綁定CPU的指令
vim /etc/nginx/nginx.conf
例如有兩個CPU,兩個worker,我們将worker綁定在第一個和第二個CPU上
01 代表第一個CPU
10 代表第二個CPU
如果有4個CPU就是0001和0010
3.worker程序的優先級,worker優先級的 -20,19
檢視worker的優先級,預設的優先級是0
watch -n 0.5 'ps axo pid,cmd,psr,nice |grep nginx' 注:nice就是優先級
worker_priority -10;
4.worker程序能打開的檔案數量上限,支援多少個使用者并發
worker_rlimit_nofile 30000; 代表worker的總值
5. events 事件驅動,我們在nginx用的是epoll模型
我們可以定義一個worker的并發連接配接是15000,兩個worker的并發就是30000
6. accept_mutex on |off 互斥 處理新請求的方法
如果啟用,如果有多個請求,第一個請求發送給第一個worker,第二個請求發送給第二個worker
如果不啟用,如果來了一個請求,就都喚醒所有的worker,最後還是一個worker提供服務的
7.調試和定位的問題
1. daemon on|off
是否以守護程序方式運作,預設是守護程序,守護程序就是前台執行還是背景執行
2. master_process on|off
是否以master/worker模型運作nginx,預設是on啟用的
3. error_log 錯誤日志
記錄的nginx的各種錯誤資訊
nginx的配置
<b>ngx_http_core_module </b>子產品,子產品中的指令
server 語句塊,這個server語句塊是放在http語句塊裡面的
listen 監聽的端口
server_name 主機名
root 指定網站的路徑
我們可以建多個虛拟主機,建每個虛拟主機放在不同的.conf檔案裡面,友善管理
default_server 代表預設的網站
server_name 也可以寫成
通配符 例: *.a.com
正規表達式 例:~^www\d+magedu\.com$
注:\d代表[0-9]
tcp_nodelay on|offf
是否當使用者發請求到http網站的時候,如果我們啟用keepalived伺服器狀态監測模式,意味着使用者發來請求不立即斷開,可以繼續發多個請求過來,一次tcp握手,可以連接配接多次請求
當是off時:延遲發送,合并多個請求後在發送
預設是on:不延遲發送
sendfile on|off
直接從磁盤把資料複制到核心空間,然後核心空間直接把資料複制到核心關于socket ba fe的緩沖區
server_tokens on |off | build |string
顯示伺服器的nginx版本
如果打開非常的危險,我們要把這個版本号隐藏了
我們要在配置檔案的http語句塊裡面設定,這樣隐藏全部的版本号,如果想隐藏單獨的虛拟主機我們可以虛拟主機的server裡面設定
location:可以定義某個位置,根據這個位置來單獨的做額外的處理
根據具體的路徑,定義相應的規則
當我們通路news的url的時候,通路的是/data/sitea/
當通路url的news的上,通路的是/app/sitea/下news目錄下的index.html
我們也可以在url前面加一些符号
location = / 精确比對 /根
通路www.a.com 的根站點 /www/sitea/目錄
還可以支援
^~ 對url的最左邊部分做比對檢測,不區分大小寫
~ 對url做正規表達式模式比對,區分字元大小寫
~*對url做正規表達式模式比對,不區分字元大小寫
不帶符号 :比對起始于此uri的所有uri
比對優先級從高到第
=,^~,~/~*,不帶符号
<b>alias别名</b>
location /bbs/{
alias /web/forum/;
}
alias和root不同
alias 例如:當我們通路網站url的/bbs/目錄時,得到的資料是來自于/web/forum/index.html
location /bbs/ {
root /web/forum/;
root 例如:當我們通路網站url的/bbs/目錄時,的到的資料是來自于/web/forum/bbs/index.html
root 相當于比對的是location左側的根
alias相當于比對的是location右側的根
error_page_code 錯誤頁面
如果通路的是一個不存在的頁面,我們可以定義把報錯轉到我們定義的位置頁面
如果404報錯就将報錯頁面轉到我們指定的/data/sitea/404.html/ 頁面
防止流氓網站,盜取我們的錯誤頁面
當我們通路一個錯誤頁面,我們将404響應改成200的響應碼,我們看到的還是404報錯的頁面
try_files :當我們找一個内容,按照什麼順序去尋找順序
location /images/ {
try_files $uri /images/default.gif;
當通路/images/目錄下的内容的時候,進到目錄挨個找,先找$uri(xx.html),如果找不到就通路/images/default.gif預設頁面
location / {
try_files $uri $uri/index.html $uri.html =404;
當通路根的時候,先找$uri,如果沒有就找$uri $uri/index.html,如果還找不到,就找$uri.html并傳回一個404頁面
當通路images目錄下的a.jpg就傳回a.jpg,如果沒有a.jpg就傳回default.jpg
如果找不到我們也可以傳回404
client_body_buffer_size
用于接收每個用戶端請求封包的body部分的緩沖區大小,預設是16k,超出此大小時,其将被暫存到磁盤上的由下面client_body_temp_path指令所定義的位置。
client_body_temp_path
把資料做哈希運算
limit_rate 限速
limit_except method 隻能用在location
限定用戶端的請求方法
GET ,POST 生産中使用
HEAD 測試的時候使用
OPTIONS 探測對方網站支援哪些方法
limit_except GET {
allow 192.168.1.0/24;
deny all;
隻能是内部管理者通路除了GET的其他方法,其他網際網路使用者都不能通路
隻允許192.168.63.141通路,不允許其他人通路
<b>ngx_http_access_module</b> 控制使用者誰能通路,誰不能通路
預設是不限制的
allow 允許
deny 拒絕
<b>ngx_http_auth_basic_module </b><b>使用者身份驗證</b>
建立賬号
htpasswd -cm nginxuser httpuser1 <b>建立使用者httpuser1,第一次建立要加 c</b>
htpasswd -cm nginxuser httpuser2 <b>建立使用者httpuser2,第二次建立不用加 c</b>
在配置檔案中告訴使用者和密碼的檔案位置
vim /etc/nginx/conf.d/a.com.conf
auth_basic "login info" 提示符
auth_basic_user_file 使用者密碼檔案的位置
<b>ngx_http_stub_status_module </b><b>狀态頁 </b>
啟用狀态頁
為了安全限制使用者的通路
<b>ngx_http_log_module </b><b>指定日志格式的記錄請求</b>
日志隻能在主配置檔案http語句塊裡面寫
[$time_iso8601] 更改日期格式
調用日志
access_log /var/log/nginx/a.com_access.log testlog;
調用的日志是 testlog
日志的存放位置 /var/log/nginx/a.com_access.log
<b>ngx_http_gzip_module </b><b>壓縮 注:必須使用在生産中</b>
用gzip方法壓縮響應資料,節約帶寬
gzip on |off 啟用或禁用壓縮
gzip_comp_level 壓縮的級别 1到9,預設是1
gzip_min_length 達到多大才進行壓縮
gzip_http_version 1.0 | 1.1 啟用壓縮功能時的協定版本,http一般是1.1
gzip_buffers 壓縮時緩沖區數量及每個緩沖區的大小
gzip_types 針對什麼資源壓縮 例如:text文本和html壓縮,預設對html壓縮
gzip_vary on|off 如果啟用壓縮是否在響應封包的首部插入一個專門表示壓縮的首部封包頭部
gzip_proxied 壓縮的時候,如果nginx充當登入伺服器,是否對後端伺服器的響應封包在某中條件下壓縮,根據後端伺服器發的資訊決定壓縮不壓縮
gzip on; 啟用壓縮
gzip_comp_level 9; 壓縮級别
gzip_min_length 64; 壓縮的大小 機關位元組
gzip_proxied any; 反向代理
gzip_types text/xml text/css application/javascript text/plain; 壓縮的資源
<b>ngx_http_ssl_module </b><b>加密</b>
https在nginx中的實作
隻要加密就需要證書
可以放在server和http中
ssl on|off 啟用或禁用加密
ssl_certificate 證書檔案
ssl_certificate_key 私鑰檔案
ssl_protocols ssl的協定支援的版本TLSv1;TLSv1.1;TLSv1.2
ssl_session_cache 我們通過http連接配接到網站 會有一些session會話消息,session消息為了加速通路可以考慮緩存cache
off 不啟用緩存
none 通知用戶端表面上是支援用戶端的,實際是不支援
builtin[:size] 所用的openssl内建緩存,每個worker程序它的ssl會話資訊是私有的,可以指定大小
[shared:name:size] 在多個worker之間使用一個共享的緩存。使用的時候要起名,并指定大小
ssl_session_timeout session會話的逾時時長,預設是5分鐘
建立證書
cd /etc/pki/tls/certs/ 進入目錄下
make a.crt 建立證書
會生成兩個檔案
a.crt a.key
我們是加密的,如果要啟用nginx分為要輸入密碼,我們可以解密密碼
openssl rsa -in a.key -out aa.key a.key解密成aa.key
将證書和秘鑰檔案拷貝到指定的目錄
cp a.crt aa.key /etc/nginx/conf.d/
建立基于https加密的虛拟主機
測試
可以建立多https加密虛拟主機,因為nginx支援SNI名稱空間,要建立新的證書,秘鑰
檢視證書資訊
openssl s_client -connect www.c.com:443
<b>ngx_http_rewrite_module</b>
nginx第二天視訊的第一節課第60分鐘
rewrite 重寫位址
例如:我們平常通路<b>http</b>:/www/baidu.com 會跳到<b>https</b>:/www/baidu.com,就是基于rewrite實作的
新的url代替舊的url的規則
last :url會按照正規表達式去查找,例如:如果找到符合的url2就會替換成新的url2,然後看到last就不會往下查找 ,建議不要在location中使用,會造成死循環
break : 如果發現break就在終止跳轉,不會在往下跳轉,不會造成死循環
redirect 臨時重定向代碼是302
permanent 永久重定向,代碼是301
rewrite regex1 url1
rewrite regex3 url2
rewrite regex3 url3
http://nginx/regex1 ---》http://nginx/url2
rewrite ^/bbs/(.*)$ /froum/$1 last
如果通路^/bbs/開頭的index.html檔案就跳轉到froum下的index.html檔案
redirect 臨時重定向,代表是302
代表是302
代碼是301
<b>當通路不加密的網站,跳轉到加密的網站</b>
rewrite / https://www.a.com/ redirect;
如果通路/根網站,就轉到https://www.a.com/
我們也可以用一個虛拟主機
if ( $scheme = http ){ 如果是http就跳轉到https://www.a.com/
如果通路文本檔案txt,就跳轉到html
break 到這就結束循環,避免死循環出現
如果通路txt檔案,就跳轉到magedu網站
<b>跳轉的時候傳回指定的響應碼</b>
如果通路www.a.com/admin/就傳回拒絕,顯示這是一個非法位址
if如果 url ~* 不區分大小寫,包含admin的就傳回403拒絕通路,并傳回一個提示DENY ACCESS
<b>ngx_http_referer_module </b><b>防盜鍊</b>
有兩個網站www.a.com 和 www.b.com
在a的網站首頁目錄/data/sitea/目錄下建立一個daolian.html
在a網站盜取了b網站的圖檔,為a網站服務
我們要避免這種情況,來避免自己網站的圖檔被别的網站盜取我們的圖檔
跳轉,當我們點選www.b.com的時候。從目前站點跳轉到www.b.com
varid_referer有效的通路, 根據跳轉的網站,是非法的還是合法的,假如,是從百度跳過來的就是合法的,從别的地方跳過來的就是非法的。
我們用varid_referer決定誰是合法的,誰是非法的
定義referer首部的合法值,不能比對的将是非法的
none :請求封包首部沒有referer首部
blocked:請求封包有referer首部,但沒有有效值,可能是反向代理伺服器吧referer清空了
server_names 參數,将來帶有的值是某一個域名,當然也有可能是某一個模式
arbitrary_string 可以寫通配符
regular expression 可以寫正規表達式,但是有一個要求<b>,要用~波浪符表示開頭,後面才是正規表達式</b>
valid_referers none block server_names *.b.com ~\.baidu\.; none 沒有referer的,block有referer但是沒值的,server_names帶有域名的,*.b.com以b.com結尾的,~\.baidu\包含baidu的都是合法的
if ($invalid_referer) { 其他的都是非法的,傳回403
return 403 ;
<b>ngx_http_proxy_module </b><b>反向代理</b>
當通路www.a.com 的根時候就代理到後端的192.168.63.131伺服器
當通路特定的url,進行反向代理
因為/bbs 比/ 更精确,優先級更高,是以先查找/bbs目錄的url下的資料,發現一bbs開頭的目錄下的檔案都轉換成/froun目錄下的檔案,然後在查找/根發現,代理到192.168.63.131後端的伺服器上,就變成了http://192.168.63.131//froun/.*
如果後端伺服器的端口發生改變,會發現報錯502
如果後端的伺服器端口是8080
如果是隻有/bbs才反向代理,其他都不代理
<b>注意:加/斜杆和不加/斜杆的差別</b>
加/斜杆: 就是當通路/bbs的時候,就置換成http://192.168.63.131/
不加/斜杆:當通路/bbs的時候,就在http://192.168.63.131/後面加/bbs目錄充當我的URL,變成http://192.168.63.131/bbs
proxy_pass 前面加斜杆是不允許有正規表達式的,否則會有文法錯誤
例如:如下
如果不加加斜杆是允許有正規表達式
隻有圖檔檔案的時候例如 .jpg .gif 等檔案的時候,才排程到http://192.168.63.131 伺服器
動靜分離
一台後端伺服器安裝apache伺服器
一台後端伺服器安裝Apache,php-fpm ,php-mysql連接配接資料庫
一台後端伺服器安裝資料庫,mariadb-server,建立允許遠端連接配接的使用者
一台代理伺服器安裝nginx
動态就排程到131伺服器,如果是其他就排程到132伺服器
注意:後端伺服器收到的請求的ip位址來源于nginx代理伺服器的ip,并不是真正的遠端用戶端的ip
解決方法:是在資料封包的頭部在添加一個新的頭,資料封包的結構有首行,首部字段行,還有實體行,其中我們可以在首部字段添加一個新的封包頭部。就是在請求封包的頭部加上用戶端的ip
proxy_set_header 給<b>請求封包</b>添加首部
但是後端的web伺服器預設記錄日志,記錄的是還是用戶端也就是nginx代理伺服器的位址,不會記錄加的封包頭部的位址,因為web伺服器的日志格式是預先定義好的,是以我們要更改日志的格式
%h 就是用戶端的位址
1. 在nginx代理伺服器
用proxy_set_header添加一個新的封包頭部
proxy_set_header remoteclientip $remote_addr
remoteclientip 自己定義
$remote_addr 代表用戶端位址
2.在後端Apache伺服器端修改日志格式
vim /etc/httpd/conf/httpd.conf
LogFormat "%{remoteclientip}i
remoteclientip是在nginx代理伺服器上新加的頭部
這樣就就可以看見遠端用戶端的ip位址
<b>proxy_add_x_forwarded_for 解決多層代理</b>
在生産中可能有多台代理伺服器,我們可以将多台代理伺服器位址累加在一起
例如:有兩層代理
如果在兩層代理伺服器上都加proxy_set_header 會在後端伺服器上看到所有疊加的代理伺服器的ip,還有真實的用戶端ip
如果隻在最外層的代理伺服器上加proxy_setheader,在後端伺服器上的日志隻會顯示真實用戶端的ip,看不到中間發現代理伺服器的位址
在後端日志伺服器上更改日志格式
<b>proxy_cache_path 可以定義反向代理緩存的功能</b>
我們可以将一些頁面緩存到伺服器上,下次用戶端就不需要跑到後端伺服器去找資料了,直接在代理伺服器進行資料的響應,進而提高速度
緩存隻能放在主配置檔案http語句塊
proxy_cache_path
緩存的位置
[levels=levels]存放緩存不是檔案名的方式,而是把檔案起哈希值做計算,把哈希值當檔案名,哈希值存的時候會按照一級,二級,三級,定義多少級來存,每一級就是安裝哈希值的數字來作為檔案夾名,是以要設定,分幾級,每一級占幾個16進制數
keys_zone=name:size 是否起一個名稱,這個名字是将來要在某個虛拟主機去用這個緩存,是以要起一個名字,調用這個名稱,接下來還要指定它的大小,緩存占多大空間
[inactive=time] 緩存失效的時間,當失效了就将緩存删掉
max_size=size:最多在磁盤占多大空間
例:
proxy_cache_path /var/cache/nginx/proxy_cache 将來要存放緩存的位置
levels=1:1:1 keys_zone=proxycache:20m
inactive=120s max_size=1g;
<b>注意: keys_zone指定的20m,說的是在記憶體中占20m的空間,但是這個緩存存的不是資料,真正的資料放在/var/cache/nginx/proxy_cache 磁盤路徑裡面,這個緩存放在記憶體中是key鍵和metadata源資料,所謂的key鍵就是使用者通路的url,值就是檔案名,但是值不放在緩存的記憶體中,它是放在磁盤空間上max_size=1g; 最大1g</b>
<b>問:nginx的緩存裡面記憶體中的緩存放的是什麼?</b>
<b>放的是key和metadata源資料,比如說源資料通路了多少次</b>
<b>/var/cache/nginx/proxy_cache </b><b>這個路徑放的的是頁面檔案,放在磁盤裡面</b>
vim /etc/nginx/nginx.conf 主配置檔案
在我們的虛拟主機記錄 在哪個location裡面轉發的時候反向代理伺服器緩存資訊放在過程指定的位置裡面
vim /etc/nginx/conf.d/c.conf
proxy_cache proxycache; 指定前面定義緩存的名字proxycache,要定義這個緩存
proxy_cache_key $request_uri; 調用的時候用$request_uri使用者通路的url當key,值是檔案内容
proxy_cache_valid 200 302 301 1h; 在200 302 301 這些響應嗎的時候才啟用緩存,緩存1小時
proxy_cache_valid any 1m; 其他的緩存1分鐘
nginx代理服務的緩存大概的原理是什麼
緩存的是什麼
緩存是放在什麼地方
<b>緩存分兩塊</b>
<b>一部分放在記憶體裡面</b>
<b>記憶體裡面放的是,通路的url也就是key鍵,還有metadata源資料,通路了幾次也就是緩存命中率</b>
<b>一部分放在磁盤裡面</b>
<b>真正的資料是存放在磁盤上的,而且存放磁盤的時候他是把檔案做了一個哈希運算,放到檔案上</b>
proxy_cache_use_stale
在某些場景下,可能還得做一些錯誤的緩存資訊,或過期的緩存
如果後端伺服器down機了,然後緩存的資訊又過期了,我們可以考慮用過期的緩存繼續提供服務
proxy_hide_header 隐藏後端伺服器的特定封包
預設将時間,後端伺服器的版本号等等隐藏了
ngx_http_headers_module子產品,加這個子產品有助于排除
添加首部
向由代理伺服器響應給用戶端的響應封包添加自定義首部,或修改指定首部的
值
add_header X-Via $server_addr; 中間的反向代理伺服器位址
add_header X-Cache $upstream_cache_status; 緩存的命中率情況
add_header X-Accel $server_name; server的名稱
<b>ngx_http_fastcgi_module</b>
讓nginx支援fastcgi
<b>搭建lnmp nginx+mysql+php-fpm</b>
192.168.63.131 nginx
192.168.63.132 php-fpm php-mysql
192.168.63.141 mysql
192.168.63.132
yum install php-fpm php-mysql -y
更改PHP的監聽ip
vim /etc/php-fpm.d/www.conf
listen = 9000 監聽本機的所有端口
listen.allowed_clients = 192.168.63.131 允許通路的ip
pm.status_path = /status 啟用測試頁面
ping.response = pong 測試PHP測試是否存活
啟動服務并檢視監聽的端口
讓nginx發請求到php-fpm
建立一個用于存放php頁面的目錄
mkdir /data/php -p
建立php測試頁面
建立連接配接資料庫的php檔案
192.168.63.131
yum install nginx -y
nginx連接配接fastcgi
nginx要啟用下面幾項
fastcgi_pass fastcgi伺服器的位址
fastcgi_index fastcgi的首頁程式
fastcgi_param nginx要充當fastcgi的用戶端要傳一些變量參數過去
在nginx的程式中已經有很多自帶的有關fastcgi變量在/etc/nginx/fastcgi_params
關鍵的參數有一項
fastcgi_param 就是fastcgi傳過去的具體路徑,将來将前端發來的PHP請求發送到後端fastcgi哪個檔案夾上
在用戶端測試
擷取php-fpm的狀态資訊
location ~* ^/(pm_status|ping)$ { 當通路fastcgi的pm_status或ping的時候就轉發大後端的fastcgi伺服器
include fastcgi_params;
fastcgi_pass 192.168.63.141:9000;
fastcgi_param SCRIPT_FILENAME $fastcgi_script_name;
配置fastcgi的緩存
在主配置檔案http語句塊插入,緩存的存放的路徑,還有定義緩存的名字fcgicache,記憶體的大小20m,這個記憶體存放的是key鍵和源資料和源資料的次數。緩存的值是放在磁盤裡面
fastcgi_cache fcgicache;
fastcgi_cache_key $request_uri;
fastcgi_cache_valid 200 302 10m;
fastcgi_cache_valid 301 1h;
fastcgi_cache_valid any 1m;
<b>ngx_http_upstream_module</b> 排程
nginx自帶健康性檢查功能,如果發現有一台後端伺服器down機,可以實作不給down的伺服器排程
例如後端有多台伺服器,可以用nginx的upstream子產品實作排程
upstream子產品隻能在主配置檔案的http語句塊設定
在upstream子產品指定要排程的server的伺服器位址
我們還要在我們自定義的虛拟主機定義怎麼轉發
我們針對的這個網站
location / 當通路根的時候,通路的www代表的兩個主機
www是在主配置檔案定義的upstream子產品的名字
我們還可以實作權重
weight=
還可以設定連接配接後端伺服器最大的并發活動連接配接數
max_conns
還可以設定連接配接後端伺服器失敗幾次,超出這個數字,就是出故障了,就不排程了
max_fails=
還可以設定逾時時長,多長時間連接配接不了後端伺服器,後端伺服器就故障了
fail_timeout= 預設10s
可以将後端伺服器标記為備用,隻有後端的所有伺服器都不能用了,才啟用備用伺服器
backup
還可以吧後端伺服器标記為不可用,就不往這個伺服器上排程,例如要更新的時候,可以先把這個伺服器下線,進行更新
down
進行源位址進行哈希運算,隻要是同一個ip位址來的請求,始終往一個伺服器上排程
ip_hash
在主配置檔案的http語句塊
最少連接配接排程算法,如果後端的連接配接少,就給誰排程
least_conn
哈希,根據使用者請求封包中的一些首部字段來做排程
hash key
hash $request_uri 根據uri進行排程,例如我們有一台排程伺服器,後端有2台伺服器,使用者發來請求,我們檢視uri是什麼,如果一個url就向後端其中以個伺服器進行排程,如果是另一個uri就向另外一個伺服器排程,這2個伺服器的權重還不一樣,第一台伺服器的權重是1,第二台伺服器的權重是2,我們可以根據權重進行哈希運算并和權重的總和取模,
隻要uri固定,就始終往一個伺服器上排程