欽州建站哪家好廣告投放
文章目錄
- 一、什么是Nginx
- 1、正向代理
- 2、反向代理
- 3、負(fù)載均衡
- 4、動(dòng)靜分離
- 二、centos7環(huán)境安裝Nginx
- 1、安裝依賴
- 2、下載安裝包
- 3、安裝
- 4、啟動(dòng)
- 5、停止
- 三、Nginx核心基礎(chǔ)知識(shí)
- 1、nginx核心目錄
- 2、常用命令
- 3、默認(rèn)配置文件講解
- 4、Nginx虛擬主機(jī)-搭建前端靜態(tài)服務(wù)器
- 5、使用nignx搭建圖片-文件服務(wù)器
- (1)root和alias的區(qū)別
- 四、挖掘accessLog日志
- 1、nginx訪問日志的用處
- 2、Nginx統(tǒng)計(jì)站點(diǎn)訪問量、高頻url統(tǒng)計(jì)
- 3、自定義日志格式,統(tǒng)計(jì)接口響應(yīng)耗時(shí)
- 五、nginx負(fù)載均衡
- 1、常見負(fù)載均衡策略
- (1)節(jié)點(diǎn)輪詢(默認(rèn))
- (2)weight 權(quán)重配置
- (3)ip_hash(固定分發(fā))
- 2、節(jié)點(diǎn)狀態(tài)配置
- 六、Nginx探測(cè)后端節(jié)點(diǎn)可用性
一、什么是Nginx
- Nginx (engine x) 是一個(gè)高性能的HTTP和反向代理web服務(wù)器,特點(diǎn)是占有內(nèi)存少,并發(fā)能力強(qiáng),事實(shí)上nginx的并發(fā)能力在同類型的網(wǎng)頁(yè)服務(wù)器中表現(xiàn)較好。使用C語(yǔ)言開發(fā)。
- Nginx專為性能優(yōu)化而開發(fā),性能是其重要的考量,實(shí)現(xiàn)上非常注重效率,能經(jīng)受高負(fù)載的考驗(yàn),能支持高達(dá)50000個(gè)并發(fā)連接數(shù)
1、正向代理
正向代理:代理的是客戶端,隱藏的客戶端。例如:VPN
- 客戶端和目標(biāo)服務(wù)器之間的服務(wù)器,客戶端向代理發(fā)送一個(gè)請(qǐng)求指定目標(biāo)服務(wù)器,然后代理向目標(biāo)服務(wù)器請(qǐng)求并獲得內(nèi)容,并返回給客戶端,平時(shí)說的代理服務(wù)器一般是正向代理服務(wù)器
- 核心:用戶知道自己訪問的目標(biāo)服務(wù)器
- 場(chǎng)景:跳板機(jī)、訪問原來無(wú)法訪問的網(wǎng)站, 比如國(guó)外的一些站點(diǎn)
2、反向代理
反向代理:代理的是服務(wù)端,隱藏的是服務(wù)端。例如:Nginx
- 客戶端和目標(biāo)服務(wù)器之間的服務(wù)器,客戶端向代理發(fā)送一個(gè)請(qǐng)求,然后代理向目標(biāo)服務(wù)器請(qǐng)求并獲得內(nèi)容,并返回給客戶端。反向代理隱藏了真實(shí)的服務(wù)器
- 核心:客戶端不知道要訪問的目標(biāo)服務(wù)器是哪臺(tái)服務(wù)器,代理會(huì)根據(jù)一定的策略選擇一個(gè)真實(shí)的服務(wù)器進(jìn)行請(qǐng)求
- 場(chǎng)景:訪問淘寶,知道訪問的域名是taobao.com, 但是后面提供數(shù)據(jù)的具體是什么域名或ip我們是不知道的
3、負(fù)載均衡
單個(gè)服務(wù)器解決不了,我們?cè)黾臃?wù)器的數(shù)量,然后將請(qǐng)求分發(fā)到各個(gè)服務(wù)器上,將原先請(qǐng)求集中到單個(gè)服務(wù)器上的情況改為將請(qǐng)求分發(fā)到多個(gè)服務(wù)器上,將負(fù)載分發(fā)到不同的服務(wù)器,也就是我們所說的負(fù)載均衡。
4、動(dòng)靜分離
為了加快網(wǎng)站的解析速度,可以把動(dòng)態(tài)頁(yè)面和靜態(tài)頁(yè)面由不同的服務(wù)器來解析,加快解析速度,降低原來單個(gè)服務(wù)器的壓力
二、centos7環(huán)境安裝Nginx
1、安裝依賴
nginx是使用C語(yǔ)言開發(fā)的,在安裝Nginx前需要安裝一些依賴。這些依賴可以給nginx增加很多應(yīng)用。
這些依賴可以一個(gè)個(gè)分開安裝,也可以一個(gè)命令全部搞定。如下:
$ sudo yum -y install gcc zlib zlib-devel pcre-devel openssl openssl-devel
2、下載安裝包
從官網(wǎng)上下載安裝包,上傳到服務(wù)器。或者結(jié)果通過wget命令下載到服務(wù)器。
我把它下載到了linux的 /usr/local/src/server目錄下
$ sudo wget http://nginx.org/download/nginx-1.18.0.tar.gz
然后解壓
$ sudo tar -zxvf nginx-1.18.0.tar.gz
3、安裝
進(jìn)入解壓目錄,檢測(cè)、編譯、安裝
$ cd nginx-1.18.0
$ ./configure # 檢測(cè)
$ make # 編譯
$ make install # 安裝
此次安裝使用的是默認(rèn)的配置安裝。
默認(rèn)安裝路徑:/usr/local/nginx
4、啟動(dòng)
進(jìn)入sbin目錄,啟動(dòng)
$ ./nginx
查看nginx進(jìn)程
$ ps -ef | grep "nginx"
或者通過80端口就可以訪問了。
5、停止
$ ./nginx -s stop
三、Nginx核心基礎(chǔ)知識(shí)
1、nginx核心目錄
conf #所有配置文件目錄nginx.conf #默認(rèn)的主要的配置文件nginx.conf.default #默認(rèn)模板html # 這是編譯安裝時(shí)Nginx的默認(rèn)站點(diǎn)目錄50x.html #錯(cuò)誤頁(yè)面index.html #默認(rèn)首頁(yè)logs # nginx默認(rèn)的日志路徑,包括錯(cuò)誤日志及訪問日志error.log #錯(cuò)誤日志nginx.pid #nginx啟動(dòng)后的進(jìn)程idaccess.log #nginx訪問日志sbin #nginx命令的目錄nginx #啟動(dòng)命令
2、常用命令
$ ./nginx #默認(rèn)配置文件啟動(dòng)
$ ./nginx -s reload #重啟,加載默認(rèn)配置文件
$ ./nginx -c /usr/local/nginx/conf/nginx.conf #啟動(dòng)指定某個(gè)配置文件
$ ./nginx -s stop #停止
#關(guān)閉進(jìn)程,nginx有master process 和worker process,關(guān)閉master即可
$ ps -ef | grep "nginx" # 查看進(jìn)程
$ kill -9 PID # 殺死進(jìn)程
3、默認(rèn)配置文件講解
# 每個(gè)配置項(xiàng)由配置指令和指令參數(shù) 2 個(gè)部分構(gòu)成
#user nobody; # 指定Nginx Worker進(jìn)程運(yùn)行以及用戶組
worker_processes 1; # #error_log logs/error.log; # 錯(cuò)誤日志的存放路徑 和錯(cuò)誤日志
#error_log logs/error.log notice;
#error_log logs/error.log info;#pid logs/nginx.pid; # 進(jìn)程PID存放路徑# 事件模塊指令,用來指定Nginx的IO模型,Nginx支持的有select、poll、kqueue、epoll 等。不同的是epoll用在Linux平臺(tái)上,而kqueue用在BSD系統(tǒng)中,對(duì)于Linux系統(tǒng),epoll工作模式是首選
events { use epoll;# 定義Nginx每個(gè)進(jìn)程的最大連接數(shù), 作為服務(wù)器來說: worker_connections * worker_processes,# 作為反向代理來說,最大并發(fā)數(shù)量應(yīng)該是worker_connections * worker_processes/2。因?yàn)榉聪虼矸?wù)器,每個(gè) 并發(fā)會(huì)建立與客戶端的連接和與后端服務(wù)的連接,會(huì)占用兩個(gè)連接worker_connections 1024;
}http {include mime.types;default_type application/octet-stream;# 自定義服務(wù)日志#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關(guān)閉sendfile on;#減少網(wǎng)絡(luò)報(bào)文段的數(shù)量#tcp_nopush on;#keepalive_timeout 0;# 客戶端連接保持活動(dòng)的超時(shí)時(shí)間,超過這個(gè)時(shí)間之后,服務(wù)器會(huì)關(guān)閉該連接keepalive_timeout 65;#gzip on;# 虛擬主機(jī)的配置server {listen 80; # 虛擬主機(jī)的服務(wù)端口server_name localhost; #用來指定IP地址或域名,多個(gè)域名之間用空格分開#charset koi8-r;#access_log logs/host.access.log main;#URL地址匹配location / {root html; # 服務(wù)默認(rèn)啟動(dòng)目錄index index.html index.htm; #默認(rèn)訪問文件,按照順序找}#error_page 404 /404.html; #錯(cuò)誤狀態(tài)碼的顯示頁(yè)面# 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# }#}
}
4、Nginx虛擬主機(jī)-搭建前端靜態(tài)服務(wù)器
什么是虛擬主機(jī)?
- 指在一臺(tái)物理主機(jī)服務(wù)器上劃分出多個(gè)磁盤空間,每個(gè)磁盤空間都是一個(gè)虛擬主機(jī),每臺(tái)虛擬主機(jī)都可以對(duì)外提供Web服務(wù),并且互不干擾,就類似虛擬機(jī)
- 利用虛擬主機(jī)把多個(gè)不同域名的網(wǎng)站部署在同一臺(tái)服務(wù)器上,節(jié)省了服務(wù)器硬件成本和相關(guān)的維護(hù)費(fèi)用
虛擬主機(jī)的配置如下:
server {listen 80;server_name aabbcc.com;location / {# aabbcc.com會(huì)訪問服務(wù)器的路徑 aabbcc.com:80/t9101.htmlroot /usr/local/src/nginx/html;index youyou.html;}
}
server {listen 80;server_name aabbccdd.com;location / {# aabbccdd.com會(huì)訪問nginx的root html;index youyou.html index.htm;}
}
這里需要在本機(jī)配置host域名:aabbcc.com和aabbccdd.com
我們開發(fā)的前端項(xiàng)目(例如:vue)就可以部署到這里。
5、使用nignx搭建圖片-文件服務(wù)器
現(xiàn)在的項(xiàng)目中,是很少在javaweb項(xiàng)目中存放圖片和文件。
公司一般會(huì)提供圖片服務(wù)器(fastdfs)或者云廠商的CDN(阿里云的oss存儲(chǔ))
(1)root和alias的區(qū)別
Nginx指定文件路徑有兩種方式root和alias,這兩者的用法區(qū)別在于對(duì)URI的處理方法不同。
區(qū)別:
- alias是一個(gè)目錄別名的定義,root則是最上層目錄的定義。
- 還有一個(gè)重要的區(qū)別是alias后面必須要用“/”結(jié)束,否則會(huì)找不到文件的。而root則可有可無(wú)
# alias
location /i/{alias /usr/local/nginx/html/admin/;
}
#若按照上述配置的話,則訪問/i/目錄里面的文件時(shí),nginx會(huì)自動(dòng)去/usr/local/nginx/html/admin目錄找文件。# root
location /i/ {root /usr/local/nginx/html/admin;
}
#若按照這種配置的話,則訪問/i/目錄下的文件時(shí),nginx會(huì)去/usr/local/nginx/html/admin/i下找文件。
圖片服務(wù)器配置:
server {listen 80;server_name aabbccdd.com;location /app/img {alias /usr/local/software/img/;}
}
圖片的訪問地址如下:http://aabbccdd.com:80/app/img/a.jpg
同一個(gè)請(qǐng)求地址,會(huì)有如下兩種訪問地址:
alias : /usr/local/software/img/a.jpg
root : /usr/local/software/img/app/img/a.jpg
四、挖掘accessLog日志
1、nginx訪問日志的用處
access.log日志用處
- 統(tǒng)計(jì)站點(diǎn)訪問ip來源、某個(gè)時(shí)間段的訪問頻率
- 查看訪問最頻的頁(yè)面、Http響應(yīng)狀態(tài)碼、接口性能
- 接口秒級(jí)訪問量、分鐘訪問量、小時(shí)和天訪問量
默認(rèn)配置:
#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
# '$status $body_bytes_sent "$http_referer" '
# '"$http_user_agent" "$http_x_forwarded_for"';
案例:
122.70.148.18 - - [04/Aug/2020:14:46:48 +0800] "GET /user/api/v1/product/order/query_state?product_id=1&token=xdclasseyJhbGciOJE HTTP/1.1" 200 48 "https://youyou.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 對(duì)應(yīng)的是真實(shí)日志里的122.70.148.18,即客戶端的IP。$remote_user 對(duì)應(yīng)的是第二個(gè)中杠“-”,沒有遠(yuǎn)程用戶,所以用“-”填充。[$time_local]對(duì)應(yīng)的是[04/Aug/2020:14:46:48 +0800]。“$request”對(duì)應(yīng)的是"GET /user/api/v1/product/order/query_state?product_id=1&token=xdclasseyJhbGciOJE HTTP/1.1"。$status對(duì)應(yīng)的是200狀態(tài)碼,200表示正常訪問。$body_bytes_sent對(duì)應(yīng)的是48字節(jié),即響應(yīng)body的大小?!?http_referer” 來源,防盜鏈接。對(duì)應(yīng)的是”https://youyou.com/“,若是直接打開域名瀏覽的時(shí),referer就會(huì)沒有值,為”-“。“$http_user_agent” 對(duì)應(yīng)的是”Mozilla/5.0 (Macintosh; Intel Mac OS X 10.12; rv:56.0) Gecko/20100101 Firefox/56.0”?!?http_x_forwarded_for” 對(duì)應(yīng)的是”-“或者空。
日志變量參考:https://www.cnblogs.com/wjoyxt/p/6178731.html
2、Nginx統(tǒng)計(jì)站點(diǎn)訪問量、高頻url統(tǒng)計(jì)
查看訪問最頻繁的前100個(gè)IP
awk '{print $1}' access_temp.log | sort -n |uniq -c | sort -rn | head -n 100
統(tǒng)計(jì)訪問最多的url 前20名
cat access_temp.log |awk '{print $7}'| sort|uniq -c| sort -rn| head -20 | more
命令基礎(chǔ)
awk 是文本處理工具,默認(rèn)按照空格切分,$N 是第切割后第N個(gè),從1開始
sort命令用于將文本文件內(nèi)容加以排序,-n 按照數(shù)值排,-r 按照倒序來排案例的sort -n 是按照第一列的數(shù)值大小進(jìn)行排序,從小到大,倒序就是 sort -rn
uniq 去除重復(fù)出現(xiàn)的行列, -c 在每列旁邊顯示該行重復(fù)出現(xiàn)的次數(shù)。
3、自定義日志格式,統(tǒng)計(jì)接口響應(yīng)耗時(shí)
日志格式增加$request_time
從接受用戶請(qǐng)求的第一個(gè)字節(jié)到發(fā)送完響應(yīng)數(shù)據(jù)的時(shí)間,即包括接收請(qǐng)求數(shù)據(jù)時(shí)間、程序響應(yīng)時(shí)間、輸出響應(yīng)數(shù)據(jù)時(shí)間
$upstream_response_time:指從Nginx向后端建立連接開始到接受完數(shù)據(jù)然后關(guān)閉連接為止的時(shí)間
$request_time一般會(huì)比upstream_response_time大,因?yàn)橛脩艟W(wǎng)絡(luò)較差,或者傳遞數(shù)據(jù)較大時(shí),前者會(huì)耗時(shí)大很多
配置自定義日志格式
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 aabbcc.com;location / {root /usr/local/nginx/html;index xdclass.html;}#charset koi8-r;#access_log logs/host.access.log main;
}
統(tǒng)計(jì)耗時(shí)接口, 列出傳輸時(shí)間超過 2 秒的接口,顯示前5條
cat time_temp.log|awk '($NF > 2){print $7}'|sort -n|uniq -c|sort -nr|head -5
備注:$NF 表示最后一列, awk '{print $NF}'
五、nginx負(fù)載均衡
負(fù)載均衡介紹
- 負(fù)載均衡(Load Balance)
- 分布式系統(tǒng)中一個(gè)非常重要的概念,當(dāng)訪問的服務(wù)具有多個(gè)實(shí)例時(shí),需要根據(jù)某種“均衡”的策略決定請(qǐng)求發(fā)往哪個(gè)節(jié)點(diǎn),這就是所謂的負(fù)載均衡,
- 原理是將數(shù)據(jù)流量分?jǐn)偟蕉鄠€(gè)服務(wù)器執(zhí)行,減輕每臺(tái)服務(wù)器的壓力,從而提高了數(shù)據(jù)的吞吐量
- 負(fù)載均衡的種類
- 通過硬件來進(jìn)行解決,常見的硬件有NetScaler、F5、Radware和Array等商用的負(fù)載均衡器,但比較昂貴的
- 通過軟件來進(jìn)行解決,常見的軟件有LVS、Nginx等,它們是基于Linux系統(tǒng)并且開源的負(fù)載均衡策略
- 目前性能和成本來看,Nginx是目前多數(shù)公司選擇使用的
配置案例
upstream lbs {server 192.168.0.106:8080;server 192.168.0.106:8081;
}
server {listen 80;server_name aabbcc.com;location /api/ {proxy_pass http://lbs;proxy_redirect default;}
}
http://aabbcc.com:80/api/test/hello
訪問流程如下:
瀏覽器輸入:http://aabbcc.com:80/api/v1/getUser
匹配 域名 server_name aabbcc.com
匹配 端口 listen 80
匹配 資源路徑 location api
默認(rèn)輪詢轉(zhuǎn)發(fā) 服務(wù)列表 lbs
最終訪問的地址:http://192.168.0.106:8080/api/v1/getUser 或者h(yuǎn)ttp://192.168.0.106:8081/api/v1/getUser
1、常見負(fù)載均衡策略
(1)節(jié)點(diǎn)輪詢(默認(rèn))
- 簡(jiǎn)介:每個(gè)請(qǐng)求按順序分配到不同的后端服務(wù)器
- 場(chǎng)景:會(huì)造成可靠性低和負(fù)載分配不均衡,適合靜態(tài)文件服務(wù)器
(2)weight 權(quán)重配置
- 簡(jiǎn)介:weight和訪問比率成正比,數(shù)字越大,分配得到的流量越高
- 場(chǎng)景:服務(wù)器性能差異大的情況使用
upstream lbs {server 192.168.159.133:8080 weight=5;server 192.168.159.133:8081 weight=10;
}
(3)ip_hash(固定分發(fā))
- 簡(jiǎn)介:根據(jù)請(qǐng)求按訪問ip的hash結(jié)果分配,這樣每個(gè)用戶就可以固定訪問一個(gè)后端服務(wù)器
- 場(chǎng)景:服務(wù)器業(yè)務(wù)分區(qū)、業(yè)務(wù)緩存、Session需要單點(diǎn)的情況
upstream lbs {ip_hash;server 192.168.159.133:8080;server 192.168.159.133:8081;
}
2、節(jié)點(diǎn)狀態(tài)配置
upstream還可以為每個(gè)節(jié)點(diǎn)設(shè)置狀態(tài)值
- down 表示當(dāng)前的server暫時(shí)不參與負(fù)載
server 192.168.159.133:8080 down;
- backup 其它所有的非backup機(jī)器down的時(shí)候,會(huì)請(qǐng)求backup機(jī)器,這臺(tái)機(jī)器壓力會(huì)最輕,配置也會(huì)相對(duì)低
server 192.168.159.133:8080 backup;
六、Nginx探測(cè)后端節(jié)點(diǎn)可用性
- max_fails 允許請(qǐng)求失敗的次數(shù),默認(rèn)為1.當(dāng)超過最大次數(shù)時(shí)就不會(huì)請(qǐng)求
- fail_timeout : max_fails次失敗后,暫停的時(shí)間,默認(rèn):fail_timeout為10s
- 參數(shù)解釋
- max_fails=N 設(shè)定Nginx與后端節(jié)點(diǎn)通信的嘗試失敗的次數(shù)。
- 在fail_timeout參數(shù)定義的時(shí)間內(nèi),如果失敗的次數(shù)達(dá)到此值,Nginx就這個(gè)節(jié)點(diǎn)不可用。
- 在下一個(gè)fail_timeout時(shí)間段到來前,服務(wù)器不會(huì)再被嘗試。
- 失敗的嘗試次數(shù)默認(rèn)是1,如果設(shè)為0就會(huì)停止統(tǒng)計(jì)嘗試次數(shù),認(rèn)為服務(wù)器是一直可用的。
- 具體什么是nginx認(rèn)為的失敗呢
- 可以通過指令proxy_next_upstream來配置什么是失敗的嘗試。
- 注意默認(rèn)配置時(shí),http_404狀態(tài)不被認(rèn)為是失敗的嘗試。
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;
}server {location /api/ {proxy_pass http://lbs;proxy_next_upstream error timeout http_500 http_503 http_404;}
}