nginx

假如前端是LVS或者nginx,後端是Apache服務器

nginx反向代理服務器,lvs代理服務器

nginx的LVS的區別

如果是lvs,lvs只是把用戶發來的請求數據包轉到後端的服務器,後端的服務器看到是用戶請求是來自於客戶端

如果是nginx,nginx不是轉發用戶發來的請求,而是代替用戶去後端的Apache服務器去訪問,後端Apache服務器看到的用戶請求是來自nginx服務器,這叫反向代理

lvs 工作在內核級,支持併發400萬

nginx工作在應用級,支持併發3萬

nginx代替遠程主機訪問服務器

nginx的併發是30000

nginx新版本支持動態部署模塊

支持高可用

支持熱部署,不停機升級版本,新發起的請求,在新版本響應,如果是一個連接舊版本,就在舊版本響應,當舊的訪問結束了,新發起的請求我們就可以連接新的版本。也加平滑升級

低內存消耗

支持的模塊 event-driven ,aio,mmap,sendfile

nginx是一個優秀的靜態資源的web服務器,用來存放一些靜態的頁面

例如:html,圖片,js,css,txt等靜態資源

nginx還可以充當http協議的反向代理服務器

nginx還可以充當郵件的反向代理服務器

nginx支持fastcgi

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的架構

nginx是一個master開多個worker,但是worker不多。但是每個worker可以併發支持很多人的訪問,worker中沒有線程,用的是I/O複用,

一個worker就可以支持上萬的用戶請求,

worker支持很多模塊,每個模塊有特定的功能,例如:web服務,代理服務,fastcgi

當用戶發來請求,用worker提供服務

master和worker之間的關係:master管理worker進程,例如:銷燬,會加載一個worker,平滑升級,都是master進程來負責的,master相當老闆,用戶發來請求,master不會提供服務

nginx支持反向代理:nginx可以將用戶的請求調度到後端的web服務器,或者fastcgi服務器

nginx還支持緩存功能:用戶將請求發給nginx,nginx可以緩存一份數據,下次用戶訪問就可以直接在緩存中響應請求,就不用到後端服務器去重新查找數據。nginx基於緩存加載,緩存管理的功能。這個緩存放在內存中也可能放在nginx磁盤裏

nginx的特性

multiplexing 多路複用

via kevent/epoll

event-drivent 異步

asynchronous 事件驅動

non-blocking 非阻塞

clip_image002

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

clip_image004

3.worker進程的優先級,worker優先級的 -20,19

查看worker的優先級,默認的優先級是0

watch -n 0.5 'ps axo pid,cmd,psr,nice |grep nginx' 注:nice就是優先級

vim /etc/nginx/nginx.conf

worker_priority -10;

clip_image006

4.worker進程能打開的文件數量上限,支持多少個用戶併發

vim /etc/nginx/nginx.conf

worker_rlimit_nofile 30000; 代表worker的總值

clip_image008

5. events 事件驅動,我們在nginx用的是epoll模型

vim /etc/nginx/nginx.conf

我們可以定義一個worker的併發連接是15000,兩個worker的併發就是30000

clip_image010

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的配置

ngx_http_core_module 模塊,模塊中的指令

server 語句塊,這個server語句塊是放在http語句塊裏面的

listen 監聽的端口

server_name 主機名

root 指定網站的路徑

clip_image012

我們可以建多個虛擬主機,建每個虛擬主機放在不同的.conf文件裏面,方便管理

default_server 代表默認的網站

clip_image014

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裏面設置

clip_image016

location:可以定義某個位置,根據這個位置來單獨的做額外的處理

根據具體的路徑,定義相應的規則

clip_image018

當我們訪問news的url的時候,訪問的是/data/sitea/

clip_image020

當訪問url的news的上,訪問的是/app/sitea/下news目錄下的index.html

clip_image022

我們也可以在url前面加一些符號

location = / 精確匹配 /根

訪問www.a.com 的根站點 /www/sitea/目錄

clip_image024

還可以支持

^~ 對url的最左邊部分做匹配檢測,不區分大小寫

~ 對url做正則表達式模式匹配,區分字符大小寫

~*對url做正則表達式模式匹配,不區分字符大小寫

不帶符號 :匹配起始於此uri的所有uri

匹配優先級從高到第

=,^~,~/~*,不帶符號

alias別名

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/ 頁面

clip_image026

防止流氓網站,盜取我們的錯誤頁面

當我們訪問一個錯誤頁面,我們將404響應改成200的響應碼,我們看到的還是404報錯的頁面

clip_image028

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

clip_image030

如果找不到我們也可以返回404

clip_image032

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訪問,不允許其他人訪問

clip_image034

ngx_http_access_module 控制用戶誰能訪問,誰不能訪問

默認是不限制的

allow 允許

deny 拒絕

clip_image036

ngx_http_auth_basic_module 用戶身份驗證

創建賬號

yum install httpd-tools -y

htpasswd -cm nginxuser httpuser1 創建用戶httpuser1,第一次創建要加 c

htpasswd -cm nginxuser httpuser2 創建用戶httpuser2,第二次創建不用加 c

在配置文件中告訴用戶和密碼的文件位置

vim /etc/nginx/conf.d/a.com.conf

auth_basic "login info" 提示符

auth_basic_user_file 用戶密碼文件的位置

clip_image038

ngx_http_stub_status_module 狀態頁

啓用狀態頁

爲了安全限制用戶的訪問

clip_image040

clip_image042

ngx_http_log_module 指定日誌格式的記錄請求

日誌只能在主配置文件http語句塊裏面寫

vim /etc/nginx/nginx.conf

clip_image044

[$time_iso8601] 更改日期格式

調用日誌

access_log /var/log/nginx/a.com_access.log testlog;

調用的日誌是 testlog

日誌的存放位置 /var/log/nginx/a.com_access.log

clip_image046

ngx_http_gzip_module 壓縮 注:必須使用在生產中

用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充當登錄服務器,是否對後端服務器的響應報文在某中條件下壓縮,根據後端服務器發的信息決定壓縮不壓縮

clip_image048

gzip on; 啓用壓縮

gzip_comp_level 9; 壓縮級別

gzip_min_length 64; 壓縮的大小 單位字節

gzip_proxied any; 反向代理

gzip_types text/xml text/css application/javascript text/plain; 壓縮的資源

ngx_http_ssl_module 加密

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加密的虛擬主機

clip_image050

測試

clip_image052

可以創建多https加密虛擬主機,因爲nginx支持SNI名稱空間,要創建新的證書,祕鑰

查看證書信息

openssl s_client -connect www.c.com:443

ngx_http_rewrite_module

nginx第二天視頻的第一節課第60分鐘

rewrite 重寫地址

例如:我們平常訪問http:/www/baidu.com 會跳到https:/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

clip_image054

rewrite ^/bbs/(.*)$ /froum/$1 last

如果訪問^/bbs/開頭的index.html文件就跳轉到froum下的index.html文件

clip_image056

redirect 臨時重定向,代表是302

clip_image058

代表是302

clip_image060

permanent 永久重定向,代碼是301

clip_image062

代碼是301

clip_image064

當訪問不加密的網站,跳轉到加密的網站

rewrite / https://www.a.com/ redirect;

如果訪問/根網站,就轉到https://www.a.com/

clip_image066

clip_image068

我們也可以用一個虛擬主機

location / {

if ( $scheme = http ){ 如果是http就跳轉到https://www.a.com/

rewrite / https://www.a.com/ redirect;

}

}

clip_image070

clip_image072

如果訪問文本文件txt,就跳轉到html

clip_image074

break 到這就結束循環,避免死循環出現

clip_image076

如果訪問txt文件,就跳轉到magedu網站

clip_image078

跳轉的時候返回指定的響應碼

如果訪問www.a.com/admin/就返回拒絕,顯示這是一個非法地址

if如果 url ~* 不區分大小寫,包含admin的就返回403拒絕訪問,並返回一個提示DENY ACCESS

clip_image080

clip_image082

ngx_http_referer_module 防盜鏈

有兩個網站www.a.com 和 www.b.com

clip_image084

在a的網站主頁目錄/data/sitea/目錄下創建一個daolian.html

在a網站盜取了b網站的圖片,爲a網站服務

clip_image086

我們要避免這種情況,來避免自己網站的圖片被別的網站盜取我們的圖片

跳轉,當我們點擊www.b.com的時候。從當前站點跳轉到www.b.com

clip_image088

varid_referer有效的訪問, 根據跳轉的網站,是非法的還是合法的,假如,是從百度跳過來的就是合法的,從別的地方跳過來的就是非法的。

我們用varid_referer決定誰是合法的,誰是非法的

定義referer首部的合法值,不能匹配的將是非法的

none :請求報文首部沒有referer首部

blocked:請求報文有referer首部,但沒有有效值,可能是反向代理服務器吧referer清空了

server_names 參數,將來帶有的值是某一個域名,當然也有可能是某一個模式

arbitrary_string 可以寫通配符

regular expression 可以寫正則表達式,但是有一個要求,要用~波浪符表示開頭,後面纔是正則表達式

clip_image090

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 ;

}

ngx_http_proxy_module 反向代理

當訪問www.a.com 的根時候就代理到後端的192.168.63.131服務器

clip_image092

當訪問特定的url,進行反向代理

clip_image094

因爲/bbs 比/ 更精確,優先級更高,所以先查找/bbs目錄的url下的數據,發現一bbs開頭的目錄下的文件都轉換成/froun目錄下的文件,然後在查找/根發現,代理到192.168.63.131後端的服務器上,就變成了http://192.168.63.131//froun/.*

如果後端服務器的端口發生改變,會發現報錯502

如果後端的服務器端口是8080

clip_image096

如果是隻有/bbs才反向代理,其他都不代理

clip_image098

注意:加/斜杆和不加/斜杆的區別

clip_image100

加/斜杆: 就是當訪問/bbs的時候,就置換成http://192.168.63.131/

不加/斜杆:當訪問/bbs的時候,就在http://192.168.63.131/後面加/bbs目錄充當我的URL,變成http://192.168.63.131/bbs

proxy_pass 前面加斜杆是不允許有正則表達式的,否則會有語法錯誤

例如:如下

clip_image102

如果不加加斜杆是允許有正則表達式

例如:如下

clip_image104

只有圖片文件的時候例如 .jpg .gif 等文件的時候,才調度到http://192.168.63.131 服務器

clip_image106

動靜分離

一臺後端服務器安裝apache服務器

一臺後端服務器安裝Apache,php-fpm ,php-mysql連接數據庫

一臺後端服務器安裝數據庫,mariadb-server,創建允許遠程連接的用戶

一臺代理服務器安裝nginx

動態就調度到131服務器,如果是其他就調度到132服務器

clip_image108

注意:後端服務器收到的請求的ip地址來源於nginx代理服務器的ip,並不是真正的遠程客戶端的ip

解決方法:是在數據報文的頭部在添加一個新的頭,數據報文的結構有首行,首部字段行,還有實體行,其中我們可以在首部字段添加一個新的報文頭部。就是在請求報文的頭部加上客戶端的ip

proxy_set_header 給請求報文添加首部

但是後端的web服務器默認記錄日誌,記錄的是還是客戶端也就是nginx代理服務器的地址,不會記錄加的報文頭部的地址,因爲web服務器的日誌格式是預先定義好的,所以我們要更改日誌的格式

%h 就是客戶端的地址

clip_image110

1. 在nginx代理服務器

用proxy_set_header添加一個新的報文頭部

proxy_set_header remoteclientip $remote_addr

remoteclientip 自己定義

$remote_addr 代表客戶端地址

clip_image112

2.在後端Apache服務器端修改日誌格式

vim /etc/httpd/conf/httpd.conf

LogFormat "%{remoteclientip}i

remoteclientip是在nginx代理服務器上新加的頭部

clip_image114

這樣就就可以看見遠程客戶端的ip地址

proxy_add_x_forwarded_for 解決多層代理

在生產中可能有多臺代理服務器,我們可以將多臺代理服務器地址累加在一起

例如:有兩層代理

如果在兩層代理服務器上都加proxy_set_header 會在後端服務器上看到所有疊加的代理服務器的ip,還有真實的客戶端ip

如果只在最外層的代理服務器上加proxy_setheader,在後端服務器上的日誌只會顯示真實客戶端的ip,看不到中間發現代理服務器的地址

clip_image116

在後端日誌服務器上更改日誌格式

clip_image118

proxy_cache_path 可以定義反向代理緩存的功能

我們可以將一些頁面緩存到服務器上,下次客戶端就不需要跑到後端服務器去找數據了,直接在代理服務器進行數據的響應,進而提高速度

緩存只能放在主配置文件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;

注意: keys_zone指定的20m,說的是在內存中佔20m的空間,但是這個緩存存的不是數據,真正的數據放在/var/cache/nginx/proxy_cache 磁盤路徑裏面,這個緩存放在內存中是key鍵和metadata源數據,所謂的key鍵就是用戶訪問的url,值就是文件名,但是值不放在緩存的內存中,它是放在磁盤空間上max_size=1g; 最大1g

問:nginx的緩存裏面內存中的緩存放的是什麼?

放的是key和metadata源數據,比如說源數據訪問了多少次

/var/cache/nginx/proxy_cache 這個路徑放的的是頁面文件,放在磁盤裏面

vim /etc/nginx/nginx.conf 主配置文件

clip_image120

在我們的虛擬主機記錄 在哪個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分鐘

clip_image122

nginx代理服務的緩存大概的原理是什麼

緩存的是什麼

緩存是放在什麼地方

緩存分兩塊

一部分放在內存裏面

內存裏面放的是,訪問的url也就是key鍵,還有metadata源數據,訪問了幾次也就是緩存命中率

一部分放在磁盤裏面

真正的數據是存放在磁盤上的,而且存放磁盤的時候他是把文件做了一個哈希運算,放到文件上

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的名稱

clip_image124

ngx_http_fastcgi_module

讓nginx支持fastcgi

搭建lnmp nginx+mysql+php-fpm

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測試是否存活

啓動服務並查看監聽的端口

clip_image126

讓nginx發請求到php-fpm

創建一個用於存放php頁面的目錄

mkdir /data/php -p

創建php測試頁面

clip_image128

創建連接數據庫的php文件

clip_image130

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哪個文件夾上

clip_image132

在客戶端測試

clip_image134

獲取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;

}

clip_image136

測試

clip_image138

配置fastcgi的緩存

在主配置文件http語句塊插入,緩存的存放的路徑,還有定義緩存的名字fcgicache,內存的大小20m,這個內存存放的是key鍵和源數據和源數據的次數。緩存的值是放在磁盤裏面

clip_image140

fastcgi_cache fcgicache;

fastcgi_cache_key $request_uri;

fastcgi_cache_valid 200 302 10m;

fastcgi_cache_valid 301 1h;

fastcgi_cache_valid any 1m;

clip_image142

ngx_http_upstream_module 調度

nginx自帶健康性檢查功能,如果發現有一臺後端服務器down機,可以實現不給down的服務器調度

例如後端有多臺服務器,可以用nginx的upstream模塊實現調度

upstream模塊只能在主配置文件的http語句塊設置

vim /etc/nginx/nginx.conf

在upstream模塊指定要調度的server的服務器地址

clip_image144

我們還要在我們自定義的虛擬主機定義怎麼轉發

我們針對的這個網站

location / 當訪問根的時候,訪問的www代表的兩個主機

www是在主配置文件定義的upstream模塊的名字

clip_image146

測試

clip_image148

clip_image150

我們還可以實現權重

weight=

還可以設置連接後端服務器最大的併發活動連接數

max_conns

還可以設置連接後端服務器失敗幾次,超出這個數字,就是出故障了,就不調度了

max_fails=

還可以設置超時時長,多長時間連接不了後端服務器,後端服務器就故障了

fail_timeout= 默認10s

可以將後端服務器標記爲備用,只有後端的所有服務器都不能用了,才啓用備用服務器

backup

還可以吧後端服務器標記爲不可用,就不往這個服務器上調度,例如要更新的時候,可以先把這個服務器下線,進行更新

down

進行源地址進行哈希運算,只要是同一個ip地址來的請求,始終往一個服務器上調度

ip_hash

在主配置文件的http語句塊

clip_image152

最少連接調度算法,如果後端的連接少,就給誰調度

least_conn

clip_image154

哈希,根據用戶請求報文中的一些首部字段來做調度

hash key

hash $request_uri 根據uri進行調度,例如我們有一臺調度服務器,後端有2臺服務器,用戶發來請求,我們查看uri是什麼,如果一個url就向後端其中以個服務器進行調度,如果是另一個uri就向另外一個服務器調度,這2個服務器的權重還不一樣,第一臺服務器的權重是1,第二臺服務器的權重是2,我們可以根據權重進行哈希運算並和權重的總和取模,

只要uri固定,就始終往一個服務器上調度

clip_image156

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章