網(wǎng)站建設(shè)屬于前端還是后臺(tái)今日小說(shuō)百度搜索風(fēng)云榜
一、nginx介紹
Nginx(“engine x”)是一款是由俄羅斯的程序設(shè)計(jì)師Igor Sysoev所開(kāi)發(fā)高性能的 Web和 反向代理服務(wù)器,也是一個(gè) IMAP/POP3/SMTP 代理服務(wù)器。和apache一樣,都是web服務(wù)器軟件,因?yàn)槠湫阅軆?yōu)異,所以被廣大運(yùn)維喜歡。又因?yàn)閚ginx是一個(gè)輕量級(jí)的web服務(wù)器,相比apache來(lái)說(shuō)資源消耗更低。
nginx官網(wǎng):http://nginx.org/
nginx與apache的比較,Nginx適合處理靜態(tài)頁(yè)面,apache處理動(dòng)態(tài)頁(yè)面
Web服務(wù)器 | Nginx | Apache |
反向代理 | 非常好 |
|
Rewrite規(guī)則 | 非常好 | 好 |
系統(tǒng)壓力比較 | 很小 | 小 |
內(nèi)存消耗 | 非常小 | 很大 |
靜態(tài)文件處理 | 非常好 | 一般 |
穩(wěn)定性 | 非常好 | 好 |
安全性 | 一般 | 好 |
技術(shù)資料 | 很少 | 非常多 |
虛擬主機(jī) | 支持 | 支持 |
熱部署 | 支持 | 不支持 |
FastCGI | 好 | 差 |
二、nginx部署
安裝部署
下載nginx源碼包
wget http://nginx.org/download/nginx-1.19.3.tar.gz -P /usr/src
安裝依賴包
yum -y install gcc pcre-devel zlib-devel openssl-dev
- gcc: 源碼編譯工具
- pcre-devel: nginx url_rewrite 功能提供包,支持nginx的正則表達(dá)
- zlib-devel: nginx 壓縮功能提供包
- openssl-dev:安全網(wǎng)絡(luò)功能
解壓nginx源碼包
tar xf nginx-1.19.3.tar.gz
cd nginx-1.19.3/
配置nginx源碼
./configure --prefix=/usr/local/nginx
配置目的:
(1)檢查環(huán)境是否滿足安裝條件,依賴解決
(2)指定安裝方式,配置文件、命令文、各種文件放哪里
(3)開(kāi)啟模塊功能【內(nèi)置模塊 三方模塊】
(4)指定軟件安裝在那里
編繹源碼
make
安裝
make install
相關(guān)目錄
—安裝目錄:/usr/local/nginx/
—主配置文件:conf/nginx.conf
—網(wǎng)頁(yè)目錄:html
—日志文件:logs
—啟動(dòng)腳本:sbin/nginx
—模塊目錄:modules
—進(jìn)程目錄:pid
nginx啟動(dòng)管理
配置文件測(cè)試:/usr/local/nginx/sbin/nginx -t
啟動(dòng):/usr/local/nginx/sbin/nginx
停止:/usr/local/nginx/sbin/nginx -s stop
關(guān)閉:/usr/local/nginx/sbin/nginx -s quit 【優(yōu)雅關(guān)閉,在退出前完成已經(jīng)接受的連接請(qǐng)求】
關(guān)閉:killall -s QUIT nginx
加載:/usr/local/nginx/sbin/nginx -s reload 【重新加載配置文件】
2.啟動(dòng)測(cè)試
nginx安裝完畢,接下來(lái)就可以啟動(dòng)nginx了,nginx啟動(dòng)后如何測(cè)試nginx的啟動(dòng)狀態(tài)呢?可以通過(guò)以下三種方式去測(cè)試,這個(gè)可以根據(jù)自己的習(xí)慣選擇一種測(cè)試就行了。
使用netstat命令查看啟動(dòng)端口
netstat -ntpl
使用losf命令查看啟動(dòng)端口
lsof -i :80
使用文本瀏覽器訪問(wèn)nignx默認(rèn)網(wǎng)站
elinks http://192.168.65.21
3.編輯服務(wù)腳本
vim /usr/lib/systemd/system/nginx.service [Unit]
Description=nginx - web server
After=network.target remote-fs.target nss-lookup.target[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStartPre=/usr/local/nginx/sbin/nginx -t -c /usr/local/nginx/conf/nginx.conf
ExecStart=/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/usr/local/nginx/sbin/nginx -s stop
ExecQuit=/usr/local/nginx/sbin/nginx -s quit
PrivateTmp=true[Install]
WantedBy=multi-user.target
重新加載系統(tǒng)服務(wù)
systemctl daemon-reload
啟動(dòng)服務(wù)
systemctl start nginx
開(kāi)機(jī)自啟
systemctl enable nginx.service
三、nginx配置
最基本配置
worker_processes 1; # 默認(rèn)為1,表示開(kāi)戶一個(gè)業(yè)務(wù)進(jìn)程
events { # 事件驅(qū)動(dòng)模塊worker_connections 1024; # 單個(gè)業(yè)務(wù)進(jìn)程可接受連接數(shù)
}
http {include mime.types; # 引入http mime類型default_type application/octet-stream;# 如果mime類型沒(méi)匹配上,默認(rèn)使用二進(jìn)制流的方式傳輸sendfile on; # 使用linux的sendfile(socket,file,len)高效網(wǎng)絡(luò)傳輸,也就是數(shù)據(jù)0拷貝。未開(kāi)戶senfilekeepalive_timeout 65; # 保持連接配置server { # 虛擬主機(jī) listen 80; # 監(jiān)聽(tīng)的端口號(hào)server_name localhost; # 主機(jī)名、域名location / { # location是匹配用戶輸入的路徑,urlroot html; # 默認(rèn)存放網(wǎng)頁(yè)的目錄路徑index index.html index.htm; # 默認(rèn)網(wǎng)頁(yè)}error_page 500 502 503 504 /50x.html; # 發(fā)生錯(cuò)誤展示的頁(yè)面location = /50x.html {root html;}}
}
nginx默認(rèn)配置文件大概分為幾個(gè)區(qū)域:
沒(méi)有被 {} 包裹的部分為全局配置:
—如worker_processes 1; 設(shè)置工作進(jìn)程(子進(jìn)程)數(shù)為 1
events {} 為 nginx 連接配置的模塊:
—如worker_connections 1024; 設(shè)置每一個(gè)子進(jìn)程最大允許連 接 1024 個(gè)連接
http {} 為 nginxhttp 核心配置模塊
—而 http {} 中還有 server {},以及 server {} 中的 location {}
server {} 為虛擬主機(jī)配置模塊,包括監(jiān)聽(tīng)端口、監(jiān)聽(tīng)域名、IP等內(nèi)容
—在一個(gè) Nginx 的配置文件里面,我們是可以指定多個(gè) Sever 區(qū)塊的配置的。
location {} URI 匹配
—細(xì)分到針對(duì)不同的路徑和請(qǐng)求而進(jìn)行的配置。一個(gè)站點(diǎn)中 URI 通常會(huì)很多,在 Location 區(qū)塊設(shè)置,可以寫多個(gè) Location 的配置的。
虛擬主機(jī)
原本一臺(tái)服務(wù)器只能對(duì)應(yīng)一個(gè)站點(diǎn),通過(guò)虛擬主機(jī)技術(shù)可以虛擬化成多個(gè)站點(diǎn)同時(shí)對(duì)外提供服務(wù)。
2.1、域名解析、端口監(jiān)聽(tīng)
基于域名的虛擬主機(jī),實(shí)現(xiàn)兩個(gè)基于域名的虛擬主機(jī),可以在server_name匹配多個(gè)域名
基于端口的虛擬主機(jī),實(shí)現(xiàn)兩個(gè)基于端口的虛擬主機(jī),可以listen監(jiān)聽(tīng)多個(gè)端口
http框架是定義與nginx網(wǎng)站相關(guān)的配置
server:虛擬主機(jī)
listen:端口
server_name:主機(jī),可以填I(lǐng)P或域名
location:網(wǎng)頁(yè)地址
http {include mime.types;default_type application/octet-stream;sendfile on;keepalive_timeout 65;server { # 第一個(gè)虛擬主機(jī) listen 80; # 端口 server_name www.s.com; # 主機(jī)、域名location / {root /www/www;index index.html index.htm;}}server { # 第二個(gè)虛擬主機(jī)listen 88; # 端口server_name vod.s.com; # 主機(jī)、域名location / {root /www/vod;index index.html index.htm;}}
ServerName匹配規(guī)則
ServerName匹配是從上往下的順序,前面匹配成功了,就不會(huì)向下匹配了。
完整匹配:可以在同一個(gè)servername中匹配多個(gè)域名
server_name vod.s.com vod1.s.com;
通配符匹配
server_name *.s.com; # *通配符匹配,*.s.com域名匹配同一個(gè)網(wǎng)頁(yè)
通配符結(jié)束匹配
server_name vod.*; # *通配符匹配,不管vod.*域名訪問(wèn)都是同一個(gè)網(wǎng)頁(yè)
正則匹配:比較適用于二級(jí)域名系統(tǒng),符合哪些規(guī)則就進(jìn)入到對(duì)應(yīng)的server里面進(jìn)行轉(zhuǎn)發(fā)。
server_name ~^[0-9]+\.s\.com$;
2.2、location
相同類型的表達(dá)式,字符串長(zhǎng)的會(huì)優(yōu)先匹配
按優(yōu)先級(jí)排列
① = 類型
② ^~類型表達(dá)式
③ 正則表達(dá)式 (~和 ~*) 類型
④常規(guī)字符串匹配類型,按前綴匹配
⑤ 通用匹配(/),如果沒(méi)有其他匹配,任何請(qǐng)求都會(huì)匹配到
location優(yōu)先級(jí)規(guī)則
①匹配某個(gè)具體文件:(location=完整路徑) >(location ~ 完整路徑) > (location ~ *完整路徑) >(location~完整路徑) > (location完整路徑) > (location /)
②用目錄做匹配訪問(wèn)某個(gè)文件:(location=目錄) >(location ^ ~ 目錄/) > (location ~ 目錄 ) > (location~*目錄) > (location目錄) > (location /)
反向代理
正向代理:搭建一個(gè)屬于自己的代理服務(wù)器
①用戶發(fā)送請(qǐng)求到自己的代理服務(wù)器
②自己的代理服務(wù)器發(fā)送請(qǐng)求到服務(wù)器
③服務(wù)器將數(shù)據(jù)返回到自己的代理服務(wù)器
④自己的代理服務(wù)器再將數(shù)據(jù)返回給用戶
反向代理:七層代理,調(diào)度作用,該功能可以通過(guò)組建后臺(tái)集群提高網(wǎng)站性能
①用戶發(fā)送請(qǐng)求到服務(wù)器(訪問(wèn)的其實(shí)是反向代理服務(wù)器,但用戶不知道)
②反向代理服務(wù)器發(fā)送請(qǐng)求到真正的服務(wù)器
③真正的服務(wù)器將數(shù)據(jù)返回給反向代理服務(wù)器
④反向代理服務(wù)器再將數(shù)據(jù)返回給用戶
3.1、代理服務(wù)器
proxy_pass:location模塊內(nèi)配置,和網(wǎng)頁(yè)目錄同級(jí)別,定義的服務(wù)器列表,可以填寫域名、IP。不支持代理https服務(wù)器
location / {proxy_pass http://www.baidu.com; # 請(qǐng)求轉(zhuǎn)向baidu,proxy_pass和root目錄二選一
}
集群代理
upstream:http模塊內(nèi)配置,模塊內(nèi)的server是服務(wù)器列表,和server模塊同級(jí)別。
proxy_pass:調(diào)用集群,在location模塊內(nèi)配置,和upstream集群名保持一致。
upstream jiangying { # 創(chuàng)建集群,定義代理的服務(wù)器列表server 192.168.65.22:80; # 是IP、端口、狀態(tài)的配置server 192.168.65.10:80;}server {listen 80;server_name localhost;location / {proxy_pass http://jiangying; # 請(qǐng)求轉(zhuǎn)向到j(luò)iangying定義的服務(wù)器列表 }error_page 500 502 503 504 /50x.html;location = /50x.html {root html;}}
3.2、UpStream
3.2.1、上游服務(wù)器
UpStream工作流程:proxy_pass 向上游服務(wù)器請(qǐng)求數(shù)據(jù)共有6個(gè)階段
- 初始化
- 與上游服務(wù)器建立連接
- 向上游服務(wù)器發(fā)送請(qǐng)求
- 處理響應(yīng)頭
- 處理響應(yīng)體
- 結(jié)束
配置說(shuō)明
參 數(shù) | 作 用 | 案 例 |
set_header | 設(shè)置header | |
proxy_connect_timeout | 與上游服務(wù)器連接超時(shí)時(shí)間、快速失敗 | |
proxy_send_timeout | 定義nginx向后端服務(wù)發(fā)送請(qǐng)求的間隔時(shí)間(不是耗時(shí))。默認(rèn)60秒,超過(guò)這個(gè)時(shí)間會(huì)關(guān)閉連接 | |
proxy_read_timeout | 后端服務(wù)給nginx響應(yīng)的時(shí)間,規(guī)定時(shí)間內(nèi)后端服務(wù)沒(méi)有給nginx響應(yīng),連接會(huì)被關(guān)閉,nginx返回504 Gateway Time-out。默認(rèn)60秒 | |
proxy_requset_buffering | 緩沖區(qū),是否完全讀到請(qǐng)求體之后再向上游服務(wù)器發(fā)送請(qǐng)求,on打開(kāi),off關(guān)閉 | |
proxy_buffering | 是否緩沖上游服務(wù)器數(shù)據(jù),on打開(kāi),off關(guān)閉 | |
proxy_buffers | 緩沖區(qū)大小 32個(gè)128k大小內(nèi)存緩沖塊 | proxy_buffers 32 128k; |
proxy_buffer_size | header緩沖區(qū)大小 | proxy_buffer_size 64k; |
proxy_busy_buffers_size | ||
proxy_max_temp_file_size | 臨時(shí)文件最大值 | proxy_max_temp_file_size 1024m; |
proxy_temp_file_write_size | 當(dāng)啟用從代理服務(wù)器到臨時(shí)文件的響應(yīng)的緩沖時(shí),一次限制寫入臨時(shí)文件的數(shù)據(jù)的大小。默認(rèn)情況下,大小由proxy_buffer_size和proxy_buffers指令設(shè)置的兩個(gè)緩沖區(qū)限制。臨時(shí)文件的最大大小由proxy_max_temp_file_size指令設(shè)置。 |
3.2.1、負(fù)載均衡策略
輪詢
最基本的配置方法,它是upstream模塊默認(rèn)的負(fù)載均衡默認(rèn)策略。每個(gè)請(qǐng)求會(huì)按時(shí)間順序逐一分配到不同的后端服務(wù)器。在輪詢中,如果服務(wù)器down掉了,會(huì)自動(dòng)剔除該服務(wù)器。此策略適合服務(wù)器配置相當(dāng),無(wú)狀態(tài)且短平快的服務(wù)使用。
weight:權(quán)重方式,在輪詢策略的基礎(chǔ)上指定輪詢的幾率。權(quán)重越高分配到需要處理的請(qǐng)求越多,此策略可以與least_conn和ip_hash結(jié)合使用,適合服務(wù)器的硬件配置差別比較大的情況。
upstream jiangying {
server 192.168.65.22:80 weight=8;
server 192.168.65.10:80 weight=2;
}
down:標(biāo)記服務(wù)器永久停機(jī)了。
upstream jiangying {
server 192.168.65.22:80 down;
server 192.168.65.10:80;
}
backup:標(biāo)記該服務(wù)器為備用服務(wù)器。當(dāng)主服務(wù)器停止時(shí),請(qǐng)求會(huì)被發(fā)送到它這里。
upstream jiangying {
server 192.168.65.22:80;
server 192.168.65.10:80 backup;
}
健康檢查
max_fails:允許失敗的次數(shù)
fail_timeout:與max_fails結(jié)合使用。檢查失敗后,需要等30s,再重新連接
fail_time:失敗后,暫停服務(wù)的時(shí)間,服務(wù)器會(huì)被認(rèn)為停機(jī)的時(shí)間長(zhǎng)度,默認(rèn)為10s。
upstream jiangying {
server 192.168.65.22:80;
server 192.168.65.10:80 max_fails=2 fail_timeout=30;
}
3.2.3、least_conn
最少連接訪問(wèn)。輪詢算法是把請(qǐng)求平均的轉(zhuǎn)發(fā)給各個(gè)后端,使它們的負(fù)載大致相同;但是,有些請(qǐng)求占用的時(shí)間很長(zhǎng),會(huì)導(dǎo)致其所在的后端負(fù)載較高。這種情況下,least_conn這種方式就可以達(dá)到更好的負(fù)載均衡效果。此負(fù)載均衡策略適合請(qǐng)求處理時(shí)間長(zhǎng)短不一造成服務(wù)器過(guò)載的情況。
upstream jiangying {least_conn;server 192.168.65.22:80;server 192.168.65.10:80;}
3.2.4、第三方策略
第三方的負(fù)載均衡策略的實(shí)現(xiàn)需要安裝第三方插件。
fair:根據(jù)后端服務(wù)器響應(yīng)時(shí)間來(lái)分配請(qǐng)求,響應(yīng)時(shí)間短的優(yōu)先分配。
url_hash:按訪問(wèn)url的hash結(jié)果來(lái)分配請(qǐng)求,使每個(gè)url定向到同一個(gè)后端服務(wù)器,要配合緩存命中來(lái)使用。同一個(gè)資源多次請(qǐng)求,可能會(huì)到達(dá)不同的服務(wù)器上,導(dǎo)致不必要的多次下載,緩存命中率不高,以及一些資源時(shí)間的浪費(fèi)。而使用url_hash,可以使得同一個(gè)url(也就是同一個(gè)資源請(qǐng)求)會(huì)到達(dá)同一臺(tái)服務(wù)器,一旦緩存住了資源,再此收到請(qǐng)求,就可以從緩存中讀取?!?/span>
總結(jié):以上便是6種負(fù)載均衡策略的實(shí)現(xiàn)方式,其中除了輪詢和輪詢權(quán)重外,都是Nginx根據(jù)不同的算法實(shí)現(xiàn)的。在實(shí)際運(yùn)用中,需要根據(jù)不同的場(chǎng)景選擇性運(yùn)用,大都是多種策略結(jié)合使用以達(dá)到實(shí)際需求。
3.4、四層代理
其他業(yè)務(wù)集群:nginx四層代理(TCP/UDP高度),nginx從1.9版本才開(kāi)始支持該功能
模塊查詢
./configure --help
配置四層代理模塊--with-stream
./configure --with-stream
make && make install
http之外配置集群
stream { # 四層代理模塊
upstream backend { # 創(chuàng)建集群
server 192.168.65.22:22;
server 192.168.65.10:22;
}server {
listen 12345;
proxy_pass backend; # 調(diào)用集群
}
}
驗(yàn)證:遠(yuǎn)程業(yè)務(wù),可以輪詢登錄到后方集群的服務(wù)器
ssh 192.168.65.21 -p 12345
動(dòng)靜分離
因nginx的靜態(tài)處理能力很強(qiáng),但動(dòng)態(tài)處理能力不足,所以在企業(yè)中常采用動(dòng)靜分離技術(shù),針對(duì)PHP,將靜態(tài)頁(yè)面交給nginx處理,動(dòng)態(tài)頁(yè)面交給PHP-FPM模塊或Apache處理。在nginx的配置文件中,是通過(guò)location配置段配合正則匹配來(lái)實(shí)現(xiàn)靜態(tài)與動(dòng)態(tài)頁(yè)面的不同處理方式。在企業(yè)信息化應(yīng)用環(huán)境中,服務(wù)器的安全性和響應(yīng)速度需要根據(jù)實(shí)際情況進(jìn)行相應(yīng)參數(shù)配置,以達(dá)到最優(yōu)的用戶體驗(yàn)。默認(rèn)的nginx安裝參數(shù)只能供最基本的服務(wù),還需要調(diào)整如網(wǎng)頁(yè)緩存時(shí)間,連接超時(shí),網(wǎng)頁(yè)壓縮等相應(yīng)參數(shù),餐能發(fā)揮出服務(wù)器的最大作用。
4.1、動(dòng)靜分離原理
Nginx動(dòng)靜分離概述
Nginx的靜態(tài)處理能力很強(qiáng),但是動(dòng)態(tài)處理能力不足,因此,在企業(yè)中常用動(dòng)靜分離技術(shù)
針對(duì)PHP的動(dòng)靜分離
靜態(tài)頁(yè)面交給 Nginx處理
動(dòng)態(tài)頁(yè)面交給 PHP-FPM模塊或 Apache處理
在 Nginx的配置中,是通過(guò) ocation配置段配合正則匹配實(shí)現(xiàn)靜態(tài)與動(dòng)態(tài)頁(yè)面的不同處理方式
Nginx實(shí)現(xiàn)動(dòng)靜分離配置
我們根據(jù)需要,將配置Nginx實(shí)現(xiàn)動(dòng)靜分離,對(duì)php頁(yè)面的請(qǐng)求轉(zhuǎn)發(fā)給LAMP或LNMP處理,而靜態(tài)頁(yè)面交給Nginx處理,從而實(shí)現(xiàn)動(dòng)靜分離。
部署 LNMP環(huán)境任務(wù)要求
— 安裝Linux(操作系統(tǒng))、Nginx(網(wǎng)站服務(wù))、Mysql(數(shù)據(jù)庫(kù))、PhP( 編寫動(dòng)態(tài)網(wǎng)站的語(yǔ)言工具,pythen也可以)環(huán)— 境啟動(dòng)Nginx、MySQL、PHP服務(wù)
— 測(cè)試Nginx及MySQL、PHP是否工作正常
LNMP常見(jiàn)問(wèn)題
Nginx的默認(rèn)訪問(wèn)日志文件為/usr/local/nginx/logs/access.log
Nginx的默認(rèn)錯(cuò)誤日志文件為/usr/local/nginx/logs/error.log
PHP默認(rèn)錯(cuò)誤日志文件為/var/log/php-fpm/www-error.log
4.2、動(dòng)靜分離部署(LNMP)
4.2.1、環(huán)境配置
安裝相關(guān)軟件,軟件倉(cāng)庫(kù)沒(méi)有mysql,安裝mariadb
yum -y install mariadb mariadb-server mariadb-devel php php-mysql php-fpm
動(dòng)態(tài)網(wǎng)站創(chuàng)建需要安裝的軟件
mariadb:數(shù)據(jù)庫(kù)包
mariadb-server:客戶端數(shù)據(jù)庫(kù)包
mariadb-devel:數(shù)據(jù)庫(kù)的依賴包,開(kāi)發(fā)環(huán)境軟件包
php(FastCGI):開(kāi)發(fā)語(yǔ)言解釋器
php-fpm:關(guān)聯(lián)nginx與php的服務(wù)
php-mysql:關(guān)聯(lián)php與數(shù)據(jù)庫(kù)的服務(wù)
啟動(dòng)服務(wù)
systemctl start php-fpm
systemctl start mariadb
修改Nginx配置文件并啟動(dòng)服務(wù)
vim /usr/local/nginx/conf/nginx.confserver {listen 80;server_name localhost;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.conf;}}
注:
~ \.php$:~是開(kāi)啟正則表達(dá)式,\轉(zhuǎn)義作用,匹配.php結(jié)尾的文件,動(dòng)態(tài)網(wǎng)頁(yè)設(shè)置
fastCGI:快速公共網(wǎng)關(guān)接口,可以連接網(wǎng)站程序(nginx)到網(wǎng)站的語(yǔ)言解釋器(如php),php-fpm為fastCGI的管理者。fastcgi.conf:fastcgi_params改成fastcgi.conf,更改擴(kuò)展名稱,安裝php-fpm生成的文件,要比原有文件可靠。
4.2.2、案例1:php網(wǎng)頁(yè)配置
查看php-fpm配置文件
vim /etc/php-fpm.d/www.conf
[www]
listen = 127.0.0.1:9000 # PHP端口號(hào)
listen.allowed_clients = 127.0.0.1
group = apache
pm = dynamic
pm.max_children = 50 # 最大進(jìn)程數(shù)量
pm.start_servers = 5 # 最小進(jìn)程數(shù)量
pm.min_spare_servers = 5
pm.max_spare_servers = 35
slowlog = /var/log/php-fpm/www-slow.log
php_admin_value[error_log] = /var/log/php-fpm/www-error.log
php_admin_flag[log_errors] = on
php_value[session.save_handler] = files
php_value[session.save_path] = /var/lib/php/session
創(chuàng)建PHP頁(yè)面
vim /usr/local/nginx/html/test.php
<html>
<body>
This is HTML message
</br>
<?php
$c = 12;
$d = 2;
if($c > $d){echo "c is bigger";}
else{ echo "d is bigger";}
?>
</body>
</html>
瀏覽器驗(yàn)證php網(wǎng)頁(yè):IP/test.php
4.2.3、案例2:動(dòng)態(tài)網(wǎng)站調(diào)用數(shù)據(jù)庫(kù)
創(chuàng)建PHP測(cè)試頁(yè)面,連接并查詢MariaDB數(shù)據(jù)庫(kù)。
vim /usr/local/nginx/html/mysql.php
<?php
$mysqli = new mysqli('localhost','root','','mysql');
#注意:root為mysql數(shù)據(jù)庫(kù)的賬戶名稱,密碼需要修改為實(shí)際mysql密碼,無(wú)密碼則留空即可
#localhost是數(shù)據(jù)庫(kù)的域名或IP,mysql是數(shù)據(jù)庫(kù)的名稱
if (mysqli_connect_errno()){die('Unable to connect!'). mysqli_connect_error();
}
$sql = "select * from user";
$result = $mysqli->query($sql);
while($row = $result->fetch_array()){printf("Host:%s",$row[0]);printf("</br>");printf("Name:%s",$row[1]);printf("</br>");
}
?>
進(jìn)入數(shù)據(jù)庫(kù),創(chuàng)建新的用戶‘jy’
systemctl restart mariadb.service
mysql
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 3
Server version: 5.5.68-MariaDB MariaDB ServerCopyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.MariaDB [(none)]> create user jy@localhost identified by '123';
Query OK, 0 rows affected (0.00 sec)
驗(yàn)證:瀏覽器訪問(wèn)IP/mysql.php,會(huì)看到Name:jy
安全配置
5.1、登錄認(rèn)證
在HTTP中,HttpAuthBasic模塊可以使用用戶名和密碼基于 HTTP 基本認(rèn)證(Basic access authentication),這是一種用來(lái)允許網(wǎng)頁(yè)瀏覽器或其他客戶端程序在請(qǐng)求時(shí)提供用戶名和口令形式的身份憑證的一種登錄驗(yàn)證方式。
默認(rèn)值: auth_basic off 作用域: http, server, location, limit_except 該指令包含用于 HTTP 基本認(rèn)證 的測(cè)試名和密碼
在server模塊中添加以下配置信息,開(kāi)啟認(rèn)證提示
vim /usr/local/nginx/conf/nginx.conf
auth_basic "password"; # 自定義提示語(yǔ)句,開(kāi)啟認(rèn)證提示
auth_basic_user_file "/usr/local/nginx/pass"; # 密碼文件存放位置在pass文件中
注:
auth_basic 可設(shè)置為off或其它字符串,為off時(shí)表示不開(kāi)啟密碼驗(yàn)證,或者#注釋效果一樣
auth_basic_user_file 為包含用戶名和密碼的文件,具體位置就是htpasswd生成賬號(hào)及密碼的存放路徑
安裝創(chuàng)建加密文件軟件
yum -y install httpd-tools
首次創(chuàng)建加密文件、用戶,增加用戶不用-c
htpasswd -c /usr/local/nginx/pass tom # pass是加密文件,tom是用戶,提示輸入密碼
驗(yàn)證:瀏覽器登錄網(wǎng)頁(yè),輸入用戶和密碼
5.2、https證書(shū)配置
--with-http_ssl_module是安全網(wǎng)站模塊,源碼安裝Nginx時(shí)必須使用–with-http_ssl_module參數(shù),啟用加密模塊,對(duì)于需要進(jìn)行SSL加密處理的站點(diǎn)添加ssl相關(guān)指令(設(shè)置網(wǎng)站需要的私鑰和證書(shū))。
openssl:包含SSL協(xié)議庫(kù)、應(yīng)用程序以及密碼處法庫(kù),自簽名openssl系統(tǒng)內(nèi)置
加密算法
對(duì)稱算法:AES、DES,使用相同的字符串加密和解密,主要應(yīng)用在單機(jī)數(shù)據(jù)加密。應(yīng)用案例 :RAR、ZIP壓縮加密
非對(duì)稱算法:RSA、DSA,利用公鑰(鎖)加密,私鑰(鑰匙)解密,主要應(yīng)用在網(wǎng)絡(luò)數(shù)據(jù)加密。應(yīng)用案例:https、ssh
信息摘要:MD5、sha256、sha512,數(shù)據(jù)校驗(yàn),主要應(yīng)用在數(shù)據(jù)完整性校驗(yàn)。
5.2.1、加密網(wǎng)站設(shè)置
更改配置文件
vim /usr/local/nginx/conf/nginx.confserver {listen 443 ssl;server_name localhost; # IP或域名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;}}
創(chuàng)建私鑰,用來(lái)解密的
openssl genrsa > /usr/local/nginx/conf/cert.key # genrsa使用rsa非對(duì)稱算法
創(chuàng)建證書(shū)(正式的證書(shū)需要花費(fèi),證明https是合規(guī)的),里面包含公鑰
openssl req -x509 -key /usr/local/nginx/conf/cert.key > /usr/local/nginx/conf/cert.pemYou are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:JY # 國(guó)家
State or Province Name (full name) []:JY # 省份
Locality Name (eg, city) [Default City]:JY # 城市
Organization Name (eg, company) [Default Company Ltd]:JY # 公司
Organizational Unit Name (eg, section) []:JY # 部門
Common Name (eg, your name or your server's hostname) []:JY # 服務(wù)器
Email Address []:JY@163.com # 郵箱
注:
req -x509:請(qǐng)求創(chuàng)建-x509格式的證書(shū),-x509證書(shū)是國(guó)際通用標(biāo)準(zhǔn)。
-key /usr/local/nginx/conf/cert.key:指定私鑰創(chuàng)建公鑰
重新加載文件
systemctl reload nginx.service
驗(yàn)證
mkdir /usr/local/nginx/html_c
echo "nginx-c~~~~" > /usr/local/nginx/html_c/index.html
curl -k https://www.jiangying.com # -k忽略風(fēng)險(xiǎn)提示
6.地址重寫
6.1、URL重寫介紹
和apache等web服務(wù)軟件一樣,rewrite的主要功能是實(shí)現(xiàn)URL地址的重定向。Nginx的rewrite功能需要PCRE軟件的支持,即通過(guò)perl兼容正則表達(dá)式語(yǔ)句進(jìn)行規(guī)則匹配的。默認(rèn)參數(shù)編譯nginx就會(huì)支持rewrite的模塊,但是也必須要PCRE的支持。
Rewrite功功能是Nginx服務(wù)器提供的一個(gè)重要功能。幾乎是所有的web產(chǎn)品必備技能,用于實(shí)現(xiàn)URL重寫。URL重寫是非常有用的功能,比如它可以在我們?cè)诟淖兙W(wǎng)站結(jié)構(gòu)后,不需要客戶端修改原來(lái)的書(shū)簽,也不需要其他網(wǎng)站修改對(duì)我們網(wǎng)站的友情鏈接,還可以在一定程度上提高網(wǎng)站的安全性,能夠讓我們的網(wǎng)站顯得更專業(yè)。
6.2、應(yīng)用場(chǎng)景
域名變更(京東)
用戶跳轉(zhuǎn) (從某個(gè)連接跳到另一個(gè)連接)
偽靜態(tài)場(chǎng)景 (便于CDN緩存動(dòng)態(tài)頁(yè)面數(shù)據(jù))
rewrite地址重寫
可以定義用戶的訪問(wèn)路徑可以看到的實(shí)際內(nèi)容。相同網(wǎng)站間的調(diào)轉(zhuǎn),獲得一個(gè)來(lái)訪的URL請(qǐng)求,然后改寫成服務(wù)器可以的另一個(gè)URL的過(guò)程。地址重寫可以是網(wǎng)頁(yè)、域名、瀏覽器。
重寫優(yōu)點(diǎn):縮短URL,隱藏實(shí)際路徑提高安全性,易于用戶記錄和鍵入,易于被搜索引擎收錄
正則表達(dá)式:區(qū)分大小寫匹配~;不區(qū)分大小寫匹配~*;區(qū)分大小寫不區(qū)配!~;不區(qū)分大小寫不匹配~!*。
語(yǔ)法格式:
— 寬松匹配:rewrite 匹配路徑(A) 實(shí)際頁(yè)面(B) 選項(xiàng) # 瀏覽器輸入路徑A,看到頁(yè)面B,網(wǎng)頁(yè)名前后可以加?xùn)|西
— 精確匹配:rewrite ^匹配路徑$(A) 實(shí)際頁(yè)面(B) 選項(xiàng) # 網(wǎng)頁(yè)名前后不可以加?xùn)|西
— 條件判斷:if(條件){任務(wù)} # 滿足什么條件,就執(zhí)行重定向到哪個(gè)地址
—選項(xiàng)有:
last:本條規(guī)則匹配完成后,繼續(xù)向下匹配新的location url規(guī)則
Break:本條規(guī)則匹配完成既終止,不再匹配后面的任何規(guī)則
redirect:臨時(shí)重定向,狀態(tài)碼302,爬蟲(chóng)不敢興趣
permanent:永久重定向,狀態(tài)碼301,爬蟲(chóng)感興趣
6.2.1、相同網(wǎng)站不同頁(yè)面
rewrite ^/a.html$ /b.html redirect; # 臨時(shí),打開(kāi)a網(wǎng)站轉(zhuǎn)到b網(wǎng)站,加上^和$符號(hào)嚴(yán)格匹配,否則可以在前后加字符符號(hào)。
rewrite ^/a.html$ /b.html permanent; # 永久,但是redirect為臨時(shí)重定向,permanent為永久重定向
6.2.2、不同網(wǎng)站之間的跳轉(zhuǎn)
rewrite /(.*) 新網(wǎng)站網(wǎng)址/$1 ; # 將舊網(wǎng)站調(diào)轉(zhuǎn)到新網(wǎng)站,()保留/理解為復(fù)制,(.*)保留/復(fù)制任意值,$1相當(dāng)于將前面保留的內(nèi)容粘貼/復(fù)制到新網(wǎng)站之后
6.2.3、不同瀏覽器或訪問(wèn)端之間的調(diào)轉(zhuǎn)
if ($http_user_agent ~* firefox){rewrite /(.*) /firefox/$1;}
注:條件判斷,如果用戶使用了火狐瀏覽器,就進(jìn)行地址重寫操作,讓用戶看到火狐專屬頁(yè)面。
if:判斷語(yǔ)句
():放條件
$http_user_agent:是nginx的內(nèi)置變量,存儲(chǔ)了用戶的信息,比如用的什么瀏覽器
~* firefox:~匹配正則,*忽略大小寫,包含有firefox字樣;
{}:放的任務(wù)
6.2.4、針對(duì)同一個(gè)范圍
同一個(gè)范圍有多個(gè)rewrite之后,系統(tǒng)會(huì)整體分析跳轉(zhuǎn)最終位置,需要在語(yǔ)句結(jié)尾添加last,同一個(gè)范圍的rewrite不發(fā)生混淆。
rewrite ^/a.html$ /b.html last;
rewrite ^/b.html$ /c.html ;
6.2.5、針對(duì)不同范圍
在不同的location下面有多個(gè)rewrite之后,地址重寫B(tài)reak:不再讀其他的語(yǔ)句結(jié)束請(qǐng)求,不同范圍的rewrite不發(fā)生混淆。
rewrite ^/a.html$ /b.html break;
7.錯(cuò)誤頁(yè)面
HTTP常見(jiàn)錯(cuò)誤代碼列表
200:一切正常
301:表示網(wǎng)址的重定向,臨時(shí)重定向
302:臨時(shí)重定向
400:請(qǐng)求語(yǔ)法錯(cuò)誤,客戶端方面的問(wèn)題
401:訪問(wèn)被拒絕(賬戶或密碼錯(cuò)誤)
403:資源不可用,通常由于服務(wù)器上文件或目錄的權(quán)限設(shè)置導(dǎo)致,禁止訪問(wèn)(客戶端額IP地址被拒絕)
404:無(wú)法找到指定位置的資源(Not Found),服務(wù)端不知道客戶端請(qǐng)求的資源有哪個(gè)
410:服務(wù)端知道客戶端請(qǐng)求的資源曾經(jīng)存在但是現(xiàn)在不存在了
414:請(qǐng)示UIR頭部太長(zhǎng)
500:服務(wù)器內(nèi)部錯(cuò)誤
502:web服務(wù)器沒(méi)有回應(yīng),沒(méi)有接受到有效信息。服務(wù)器作為網(wǎng)關(guān)或者代理時(shí),為了完成請(qǐng)求訪問(wèn)下一個(gè)服務(wù)器,但該服務(wù)器返回了非法的應(yīng)
更改nginx404報(bào)錯(cuò)的頁(yè)面顯示
error_page 404 /test.jpg; # 配置錯(cuò)誤頁(yè)面,然后存儲(chǔ)一個(gè)test.jpg圖片到/usr/local/nginx/html/目錄下。
8.狀態(tài)頁(yè)面
status模塊,可以查看網(wǎng)站后臺(tái)數(shù)據(jù),如Nginx連接數(shù)等信息,--with-http_stub_status_module開(kāi)啟模塊功能。
安裝模塊--with-http_stub_status_module
./configure --with-http_stub_status_module
make && make install
狀態(tài)頁(yè)面設(shè)置
location /status {
stub_status on; # 顯示后臺(tái)數(shù)據(jù)
allow 192.168.65.21; # 允許查看的數(shù)據(jù)的服務(wù)器
deny all; # 禁止其他服務(wù)器查看
}
訪問(wèn)狀態(tài)status頁(yè)面:curl http://IP/status
Activeconnections:當(dāng)前活動(dòng)的連接數(shù)量(當(dāng)前有多少用戶訪問(wèn)該網(wǎng)站)。
Accepts:已經(jīng)接受客戶端的連接總數(shù)量。
Handled:已經(jīng)處理客戶端的連接總數(shù)量。
Requests:客戶端發(fā)送的請(qǐng)求數(shù)量。
Reading:當(dāng)前服務(wù)器正在讀取客戶端請(qǐng)求頭的數(shù)量。
Writing:當(dāng)前服務(wù)器正在寫響應(yīng)信息的數(shù)量。
Waiting:當(dāng)前多少客戶端在等待服務(wù)器的響應(yīng)。
9.優(yōu)化配置
9.1、緩存優(yōu)化
解決客戶端訪問(wèn)頭部信息過(guò)長(zhǎng)的問(wèn)題,還要以緩存文件到客戶,緩存服務(wù)器,還可以通過(guò)varnish,squid緩存文件,搭建緩存服務(wù)器。增加用戶訪問(wèn)速度 。當(dāng)客戶端在訪問(wèn)服務(wù)器時(shí),由服務(wù)器決定將生么文件緩存在客戶端。
緩存優(yōu)化配置
location ~* \.(jpg|html|txt)$ { # 緩存文件類型
expires 30d; # 緩存時(shí)長(zhǎng)
}
訪問(wèn)網(wǎng)站,通過(guò)瀏覽器緩存(Expires)過(guò)期時(shí)間是一個(gè)月,說(shuō)明緩存成功。
9.2、超長(zhǎng)地址
nginx是一個(gè)強(qiáng)大的http服務(wù)器,但是在使用過(guò)程中發(fā)現(xiàn),當(dāng)遇到超長(zhǎng)的post請(qǐng)求或者get請(qǐng)求時(shí),nginx會(huì)返回413、400、414等狀態(tài)碼,這是因?yàn)檎?qǐng)求串長(zhǎng)度超過(guò)了nginx默認(rèn)的緩存大小或者請(qǐng)求串大小。
超長(zhǎng)地址訪問(wèn)設(shè)置,在主配置文件中server之外,http之內(nèi)。
client_header_buffer_size 200k; # 改為200K
large_client_header_buffers 4 200k; # 如果200k不夠用,再添加4個(gè)200k
注:
client_header_buffer_size:可以定義將識(shí)別的頭部信息(包含地址欄)的大小
large_client_header_buffers:定義個(gè)數(shù)
9.2、并發(fā)優(yōu)化
9.2.1、開(kāi)發(fā)和并行的區(qū)別
「并發(fā)」強(qiáng)調(diào)的是可以一起「出『發(fā)』」,「并行」強(qiáng)調(diào)的是可以一起「執(zhí)『行』」。
并發(fā):與可以一起出發(fā)的并發(fā)(concurrent)相對(duì)的是不可以一起出發(fā)的順序(sequential)
順序:上一個(gè)開(kāi)始執(zhí)行的任務(wù)完成后,當(dāng)前任務(wù)才能開(kāi)始執(zhí)行
并發(fā):無(wú)論上一個(gè)開(kāi)始執(zhí)行的任務(wù)是否完成,當(dāng)前任務(wù)都可以開(kāi)始執(zhí)行
(也就是說(shuō),A B 順序執(zhí)行的話,A 一定會(huì)比 B 先完成,而并發(fā)執(zhí)行則不一定。)
并行:與可以一起執(zhí)行的并行(parallel)相對(duì)的是不可以一起執(zhí)行的串行(serial)
串行:有一個(gè)任務(wù)執(zhí)行單元,從物理上就只能一個(gè)任務(wù)、一個(gè)任務(wù)地執(zhí)行
并行:有多個(gè)任務(wù)執(zhí)行單元,從物理上就可以多個(gè)任務(wù)一起執(zhí)行
(也就是說(shuō),在任意時(shí)間點(diǎn)上,串行執(zhí)行時(shí)必然只有一個(gè)任務(wù)在執(zhí)行,而并行則不一定。)
總結(jié)
綜上,并發(fā)與并行并不是互斥的概念,只是前者關(guān)注的是任務(wù)的抽象調(diào)度、后者關(guān)注的是任務(wù)的實(shí)際執(zhí)行。而它們又是相關(guān)的,比如并行一定會(huì)允許并發(fā)。
單核 CPU 多任務(wù):并發(fā)(不必等上一個(gè)任務(wù)完成才開(kāi)始下一個(gè)任務(wù))、串行(只有一個(gè)實(shí)際執(zhí)執(zhí)行任務(wù)的 CPU 核)
多線程:并發(fā)、串行(所有線程都在同一個(gè)核上執(zhí)行);并發(fā)、并行(不同線程在不同的核上執(zhí)行)
9.2.2、優(yōu)化nginx并發(fā)
worker_processes 2;
events {worker_connections 500000;
}
注:
worker_processes:定義后臺(tái)開(kāi)啟nginx的進(jìn)程數(shù)量,與CPU數(shù)量一致
worker_connections:限制訪問(wèn)用戶,一個(gè)nginx可以允許訪問(wèn)的用戶數(shù)
9.2.3、文件訪問(wèn)
Linux系統(tǒng)默認(rèn)打開(kāi)文件的個(gè)數(shù)最大不得超過(guò)1024,客戶端訪問(wèn)一個(gè)頁(yè)面,相當(dāng)于打開(kāi)了一個(gè)文件,需要改動(dòng)linux的配置文件。
臨時(shí)配置
ulimit -n # 查看同時(shí)打開(kāi)文件的數(shù)量
ulimit -n 100000 # 配置同時(shí)打開(kāi)文件的數(shù)量
永久配置
vim /etc/security/limits.conf
* soft nofile 10000
* hard nofile 10000
注:
*:服務(wù)器
nofile:打開(kāi)文件的限制
soft:軟限制達(dá)到之,想要打開(kāi)設(shè)置。
hard:硬限制,最多打開(kāi)限制,后有硬限制報(bào)警。
9.2.4、壓測(cè)
ab -c 2000 -n 2000 http://192.168.65.21/ # -c訪問(wèn)人數(shù),-n訪問(wèn)次數(shù),100%證明測(cè)試成功
9.3、會(huì)話管理
9.3.1、hash
根據(jù)客戶端的IP地址轉(zhuǎn)發(fā)同一臺(tái)服務(wù)器,可以保持回話。這個(gè)方法確保了相同的客戶端的請(qǐng)求一直發(fā)送到相同的服務(wù)器,以保證session會(huì)話。這樣每個(gè)訪客都固定訪問(wèn)一個(gè)后端服務(wù)器,可以解決session不能跨服務(wù)器的問(wèn)題。
upstream jiangying {
ip_hash;
server 192.168.65.22:80;
server 192.168.65.10:80;
}
其他:
【hash $cookie_jsessionid; 】:根據(jù)jsessionid地址轉(zhuǎn)發(fā)同一臺(tái)服務(wù)器;
【hash $request_uri;】:根據(jù)uri地址轉(zhuǎn)發(fā)同一臺(tái)服務(wù)器,適用于訪問(wèn)不同的服務(wù)器資源;
注意:
在nginx版本1.3.1之前,不能在ip_hash中使用權(quán)重(weight)。
ip_hash不能與backup同時(shí)使用。
此策略適合有狀態(tài)服務(wù),比如session。
當(dāng)有服務(wù)器需要剔除,必須手動(dòng)down掉。
9.3.2、緩存
客戶登錄:session與Cookie,作用避免客戶重復(fù)登錄??蛻舳说顷憰r(shí)由服務(wù)器端的session與客戶端的cookies的id作對(duì)比。
—Session:【服務(wù)端】存儲(chǔ)在服務(wù)器端,保存用戶名、登陸狀態(tài)等信息,
—Cookies:【客戶端】由服務(wù)器下發(fā)給客戶端,保存在客戶端/var/lib/php/session。保存的內(nèi)容主要包括:SessionID
memcached簡(jiǎn)介:可以利用內(nèi)存讀寫數(shù)據(jù)的數(shù)據(jù)庫(kù)服務(wù),創(chuàng)建分布式緩存服務(wù)器,高性能的分布式緩存服務(wù)器,集中緩存數(shù)據(jù)庫(kù)查詢結(jié)果,減少數(shù)據(jù)庫(kù)訪問(wèn)次數(shù),以提高動(dòng)態(tài)web應(yīng)用的響應(yīng)速度;官方網(wǎng)站:http://memcached.org/
9.3.2.1、環(huán)境配置
關(guān)閉防火墻和selinux
部署有登錄界面的LNMP動(dòng)態(tài)網(wǎng)站,配置代理集群
在后端服務(wù)器 /usr/local/nginx/html/存儲(chǔ)PHP網(wǎng)頁(yè)
部署memcached(存儲(chǔ)服務(wù)器)、telnet(遠(yuǎn)程登錄工具)
yum -y install memcached telnet
systemctl start memcached.service
systemctl enable memcached.service
查看memcached的端口
cat /etc/sysconfig/memcached
PORT="11211"
USER="memcached"
MAXCONN="1024"
CACHESIZE="64"
OPTIONS=""
telnet測(cè)試memcached
telnet 127.0.0.1 11211
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
memcached常用指令
set name 0 180 10 # 添加或替換變量,創(chuàng)建變量name,0不壓縮,存活190s,存放10個(gè)字符
get name # 讀取變量
delete name # 刪除變量
add name 0 180 10 # 變量不存在則添加
replace name 0 180 10 # 替換
flush_all # 清空所有
quit # 退出登記
9.3.2.2、session共享配置
安裝php-pecl-memcache工具,關(guān)聯(lián)PHP和memcache
yum -y install php-pecl-memcache
systemctl start php-fpm
登錄后端服務(wù)器節(jié)點(diǎn),配置session存儲(chǔ)
vim /etc/php-fpm.d/www.conf
php_value[session.save_handler] = memcache # 存儲(chǔ)的方式
php_value[session.save_path] = tcp://192.168.65.21:11211 # 存儲(chǔ)的地址
測(cè)試session共享
瀏覽器訪問(wèn)服務(wù)器,刷新頁(yè)面后,登錄賬戶會(huì)被記錄在memcached服務(wù)器,再次刷新頁(yè)面,調(diào)度器切換服務(wù)器后,賬戶信息還在,兩臺(tái)后端服務(wù)器使用的是同一個(gè)帳戶。
9.3.2、sticky模塊
Sticky是nginx的一個(gè)模塊,它是基于cookie的一種nginx的負(fù)載均衡解決方案,通過(guò)分發(fā)和識(shí)別cookie,來(lái)使同一個(gè)客戶端的請(qǐng)求落在同一臺(tái)服務(wù)器上,默認(rèn)標(biāo)識(shí)名為route。
官網(wǎng):https://bitbucket.org/nginx-goodies/nginx-sticky-module-ng/src/master/
工作原理:
1.客戶端首次發(fā)起訪問(wèn)請(qǐng)求,nginx接收后,發(fā)現(xiàn)請(qǐng)求頭沒(méi)有cookie,則以輪詢方式將請(qǐng)求分發(fā)給后端服務(wù)器。
2.后端服務(wù)器處理完請(qǐng)求,將響應(yīng)數(shù)據(jù)返回給nginx。
3.此時(shí)nginx生成帶route的cookie,返回給客戶端。route的值與后端服務(wù)器對(duì)應(yīng),可能是明文,也可能是md5、sha1等Hash值
4.客戶端接收請(qǐng)求,并保存帶route的cookie。
5.當(dāng)客戶端下一次發(fā)送請(qǐng)求時(shí),會(huì)帶上route,nginx根據(jù)接收到的cookie中的route值,轉(zhuǎn)發(fā)給對(duì)應(yīng)的后端服務(wù)器。
安裝依賴
yum -y install openssl
上傳解壓
unzip nginx-goodies-nginx-sticky-module-ng-c78b7dd79d0d.zip
進(jìn)到源碼目錄重新編譯
./configure --prefix=/usr/local/nginx --add-module=/root/nginx-goodies-nginx-sticky-module-ng-c78b7dd79d0d
備注:
--add-module:添加第三方模塊
錯(cuò)誤:make報(bào)錯(cuò)

解決:修改源碼,修改后重新執(zhí)行編譯
vim /root/nginx-goodies-nginx-sticky-module-ng-c78b7dd79d0d/ngx_http_sticky_misc.h
#include <ngx_config.h>
#include <ngx_core.h>
#include <ngx_http.h>
#include <ngx_string.h>
#include <openssl/sha.h>
#include <openssl/md5.h>
備份之前的程序
mv /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.old
編譯好的Nginx程序替換到原來(lái)的目錄里
cp nginx-1.19.3/objs/nginx /usr/local/nginx/sbin/
升級(jí)檢測(cè)
make upgrade
檢查程序
/usr/local/nginx/sbin/nginx -V
配置sticky模塊的使用
upstream jiangying {
sticky;
server 192.168.65.21;
server 192.168.65.22;
}
備注:
每臺(tái)后端真實(shí)服務(wù)器都會(huì)有一個(gè)唯一的route值,所以不管你真實(shí)服務(wù)器前端有幾個(gè)裝了sticky的nginx代理,他都是不會(huì)變化的。
參數(shù):
sticky [name=route] [domain=.foo.bar] [path=/] [expires=1h] [hash=index|md5|sha1] [no_fallback] [secure] [httponly];
—[name=route]:設(shè)置用來(lái)記錄會(huì)話的cookie名稱
—[domain=.foo.bar]:設(shè)置cookie作用的域名
—[path=/]:設(shè)置cookie作用的URL路徑,默認(rèn)根目錄
—[expires=1h]:設(shè)置cookie的生存期,默認(rèn)不設(shè)置,瀏覽器關(guān)閉即失效,需要是大于1秒的值
—[hash=index|md5|sha1]:設(shè)置cookie中服務(wù)器的標(biāo)識(shí)是用明文還是使用md5值,默認(rèn)使用md5
—[no_fallback]:設(shè)置該項(xiàng),當(dāng)sticky的后端機(jī)器掛了以后,nginx返回502 (Bad Gateway or Proxy Error) ,而不轉(zhuǎn)發(fā)到其他服務(wù)器,不建議設(shè)置
—[secure]:設(shè)置啟用安全的cookie,需要HTTPS支持
—[httponly]:允許cookie不通過(guò)JS泄漏,沒(méi)用過(guò)
9.4、防盜鏈
防盜鏈簡(jiǎn)單來(lái)說(shuō)就是存在我們服務(wù)中的一些資源,只有我們規(guī)定的合法的一類人才能去訪問(wèn),其他人就不能去訪問(wèn)的資源
(如css,js,img等資源)。
具體點(diǎn)就是用戶發(fā)送請(qǐng)求給nginx服務(wù)器,nginx服務(wù)器根據(jù)請(qǐng)求去尋找資源,請(qǐng)求的比如說(shuō)是有個(gè)index.html文件,這個(gè)文件中會(huì)包含很多js,css,img等資源,這些文件在這個(gè)骨架中會(huì)被二次請(qǐng)求,在第二次請(qǐng)求時(shí),會(huì)在請(qǐng)求頭部上加上有個(gè)referer,這個(gè)referer只會(huì)在第二次請(qǐng)求時(shí)才會(huì)被加上。(referer表示第二次資源的來(lái)源地址)
9.4.1、防盜鏈配置
valid_referers:nginx會(huì)通過(guò)查看referer自動(dòng)和valid_referers后面的內(nèi)容進(jìn)行匹配,如果匹配到了就將$invalid_referer變量置0,如果沒(méi)有匹配到,則將$invalid_referer變量置為1,匹配的過(guò)程不區(qū)分大小寫
語(yǔ)法:valiad_referers none|blocked|server_names|string
— none:如果header中的referer為空,允許訪問(wèn)
— blocked:在header中的referer不為空,但是該值被防火墻或代理服務(wù)器進(jìn)行偽裝過(guò),如不帶“http://”、“https://”等協(xié)議頭的資源允許訪問(wèn)。
— server_names:指定具體的域名或者IP
默認(rèn)值:-
位置(可以書(shū)寫的地方):server,location
在需要防盜鏈的location中配置
valid_referers 192.168.65.21;
if ($invalid_referer){
rewrite ^/ /image/x.png break; # 匹配的提示頁(yè)面
return 403; # 返回的提示碼
}
9.5、curl
安裝curl
yum -y install curl
使用curl測(cè)試,顯示head的信息
curl -I http://192.168.65.21
HTTP/1.1 200 OK
Server: nginx/1.19.3
Date: Mon, 13 Mar 2023 08:12:30 GMT
Content-Type: text/html
Content-Length: 5
Connection: keep-alive
Last-Modified: Fri, 03 Mar 2023 03:56:47 GMT
ETag: "64016fff-5"
Accept-Ranges: bytes
9.6、keepalive
HTTP協(xié)議的Keep-Alive意圖在于短時(shí)間內(nèi)連接復(fù)用,希望可以短時(shí)間內(nèi)在同一個(gè)連接上進(jìn)行多次請(qǐng)求/響應(yīng),在http協(xié)議header中可以看到當(dāng)前連接狀態(tài)。
TCP的KeepAlive機(jī)制意圖在于?;?、心跳,檢測(cè)連接錯(cuò)誤。當(dāng)一個(gè)TCP連接兩端長(zhǎng)時(shí)間沒(méi)有數(shù)據(jù)傳輸時(shí)(通常默認(rèn)配置是2小時(shí)),發(fā)送keepalive探針,探測(cè)鏈接是否存活。
應(yīng)用場(chǎng)景:明顯的預(yù)知用戶會(huì)在當(dāng)前連接上有下一步操作,復(fù)用連接,有效減少握手次數(shù),尤其是https建立一次連接開(kāi)銷會(huì)更大。
關(guān)閉場(chǎng)景: 訪問(wèn)內(nèi)聯(lián)資源一般用緩存,不需要keepalive,長(zhǎng)時(shí)間的tcp連接容易導(dǎo)致系統(tǒng)資源無(wú)效占用。
9.6.1、客戶端
客戶端使用keepalive,在http區(qū)域配置。
vim /usr/local/nginx/conf/nginx.conf
keepalive_timeout 65;
keepalive_time 1h;
keepalive_request 1000;
send_timeout 60;
備注:
keepalive_timeout:超過(guò)配置時(shí)間沒(méi)有活動(dòng),會(huì)讓keepalive失效,用于設(shè)置Nginx服務(wù)器與客戶端保持連接的超時(shí)時(shí)間,0即關(guān)閉,默認(rèn)65s
keepalive_time:一個(gè)tcp連接總時(shí)長(zhǎng),超過(guò)之后強(qiáng)制失效,默認(rèn)1h
keepalive_request:單個(gè)連接中可處理的請(qǐng)求數(shù),一個(gè)tcp復(fù)用中可以并發(fā)接收的請(qǐng)求個(gè)數(shù),默認(rèn)1000
keepalive_disable:不對(duì)某些瀏覽器建立長(zhǎng)連接,默認(rèn)msie6
send_timeout:【注意:準(zhǔn)備過(guò)程中,不是傳輸過(guò)程】,系統(tǒng)中若有耗時(shí)操,超過(guò)時(shí)間強(qiáng)制斷開(kāi)連接,默認(rèn)60s
9.6.2、上游服務(wù)器
upstream中配置
vim /usr/local/nginx/conf/nginx.conf
keepalive 100;
keepalive_timeout 65;
keepalive_request 1000;
備注:
keepalive:向上游服務(wù)器的保留連接數(shù)
keepalive_timeout:連接保留時(shí)間
keepalive_requests:一個(gè)tcp復(fù)用中 可以并發(fā)接收的請(qǐng)求個(gè)數(shù)
server中配置
首先需要配置使用http1.1協(xié)議。以便建立更高效的傳輸,默認(rèn)使用http1.0,默認(rèn)使用http1.0協(xié)議,需要在request中增加”Connection: keep-alive“ header才能在Upstream中所配置的上游服務(wù)器默認(rèn)都是用短連接,即每次請(qǐng)求都會(huì)在完成之后斷開(kāi),而HTTP1.1默認(rèn)支持。
vim /usr/local/nginx/conf/nginx.conf
proxy_http_version 1.1;
proxy_set_header Connection ""; # 清除close信息
9.6.3、驗(yàn)證
AB安裝
yum install httpd-tools
參數(shù):
- -n 即requests,用于指定壓力測(cè)試總共的執(zhí)行次數(shù)。
- -c 即concurrency,用于指定的并發(fā)數(shù)。
- -t 即timelimit,等待響應(yīng)的最大時(shí)間(單位:秒)。
- -b 即windowsize,TCP發(fā)送/接收的緩沖大小(單位:字節(jié))。
- -p 即postfile,發(fā)送POST請(qǐng)求時(shí)需要上傳的文件,此外還必須設(shè)置-T參數(shù)。
- -u 即putfile,發(fā)送PUT請(qǐng)求時(shí)需要上傳的文件,此外還必須設(shè)置-T參數(shù)。
- -T 即content-type,用于設(shè)置Content-Type請(qǐng)求頭信息,例如:application/x-www-form-urlencoded,默認(rèn)值為text/plain。
- -v 即verbosity,指定打印幫助信息的冗余級(jí)別。
- -w 以HTML表格形式打印結(jié)果。
- -i 使用HEAD請(qǐng)求代替GET請(qǐng)求。
- -x 插入字符串作為table標(biāo)簽的屬性。
- -y 插入字符串作為tr標(biāo)簽的屬性。
- -z 插入字符串作為td標(biāo)簽的屬性。
- -C 添加cookie信息,例如:"Apache=1234"(可以重復(fù)該參數(shù)選項(xiàng)以添加多個(gè))。
- -H 添加任意的請(qǐng)求頭,例如:"Accept-Encoding:gzip",請(qǐng)求頭將會(huì)添加在現(xiàn)有的多個(gè)請(qǐng)求頭之后(可以重復(fù)該參數(shù)選項(xiàng)以添加多個(gè))。
- -A 添加一個(gè)基本的網(wǎng)絡(luò)認(rèn)證信息,用戶名和密碼之間用英文冒號(hào)隔開(kāi)。
- -P 添加一個(gè)基本的代理認(rèn)證信息,用戶名和密碼之間用英文冒號(hào)隔開(kāi)。
- -X 指定使用的和端口號(hào),例如:"126.10.10.3:88"。
- -V 打印版本號(hào)并退出。
- -k 使用HTTP的KeepAlive特性。
- -d 不顯示百分比。
- -S 不顯示預(yù)估和警告信息。
- -g 輸出結(jié)果信息到gnuplot格式的文件中。
- -e 輸出結(jié)果信息到CSV格式的文件中。
- -r 指定接收到錯(cuò)誤信息時(shí)不退出程序。
- -h 顯示用法信息,其實(shí)就是ab -help。