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