Nginx工具
Web網路服務
我們平時訪問的網站服務就是 Web 網路服務,一般是指允許使用者透過瀏覽器訪問到網際網路中各種資源的服務。
web網路服務是被動的網路服務,透過網路傳輸資源,流程如下:
使用者發起網路請求 --> 網路伺服器接受到請求 --> 網路伺服器取資源 --> 將資源透過http(超文字傳輸協議)和https(安全超檔案傳輸協議)返回。
web伺服器與web框架的關係
- web伺服器:接受http/https請求,返回資料。
- web框架:開發web應用程式,處理得到的資料。
nginx是什麼
優點:
- 開源
- 高效能,高併發
- 資源消耗少
- 可以做http反向代理
- 負載均衡
- 支援非同步網路i/o事件模型epoll
- Tengine是由淘寶網發起的Web伺服器專案。它在Nginx的基礎上,針對大訪問量網站的需求,新增了很多高階功能和特性。Tengine的效能和穩定性已經在大型的網站如淘寶網,天貓商城等得到了很好的檢驗。它的最終目標是打造一個高效、穩定、安全、易用的Web平臺。
nginx下載安裝
- 可以直接npm安裝,這裡介紹原始碼包安裝
-
原始碼包下載
摘一句話:淘寶網是開源軟體的使用者和受益者,我們也想成為開源軟體的貢獻者。這就是我們決定開源Tengine的原因。
tengine:http://tengine.taobao.org/download/tengine.tar.gz、https://tengine.taobao.org/download/tengine-3.0.0.tar.gz
nginx:http://hg.nginx.org/nginx.org/archive/tip.tar.gz
官網:https://nginx.p2hp.com/en/download.html
-
安裝依賴:
# 其中有一些重要的庫:gcc、pcre(正規表示式庫)、zlib、OpenSSL yum install gcc patch libffi-devel python-devel zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel openssl openssl-devel -y # ubuntu apt install openssl libssl-dev libpcre3 libpcre3-dev zlib1g-dev make
-
釋放Makefile
./configure --prefix=/opt/tengine12/
-
編譯安裝
make && make install
-
設定環境變數,並記一些常用命令
nginx #啟動
nginx -s stop #關閉
nginx -s reload #重新載入
nginx目錄結構
[root@iZ2vchdoid8iit383hsodtZ tengine12]# ls
client_body_temp conf fastcgi_temp html include logs modules proxy_temp sbin scgi_temp uwsgi_temp
- conf 存放nginx配置檔案
- html 存放前端檔案目錄
- logs 存放nginx執行日誌,錯誤日誌
- sbin nginx執行指令碼
nginx主要配置
參考文章:nginx配置
配置的位置處於conf當中的nginx.conf
# 核心配置模組
user nginx; # nginx程序所用的使用者
worker_processes 1; # nginx佔幾個程序
error_log /var/log/nginx/error.log; # 錯誤日誌在哪
pid /run/nginx.pid; # 程序生成的pid放哪
events # 事件模組
http # 核心模組
event模組:
#事件模型:use [ kqueue | rtsig | epoll | /dev/poll | select | poll ];
#epoll模型是Linux 2.6以上版本核心中的高效能網路I/O模型,linux建議epoll,如果跑在FreeBSD上面,就用kqueue模型。
use epoll;
#根據硬體調整,和前面工作程序配合起來用,儘量大,但是別把cpu跑到100%就行。每個程序允許的最多連線數,理論上每臺nginx伺服器的最大連線數為。
worker_connections 65535;
http模組:
#副檔名與檔案型別對映表,基本上不變
include mime.types;
# include /etc/nginx/conf.d/*.conf; #包含/etc/nginx/conf.d/目錄下所有以.conf結尾的檔案
#日誌格式設定
#$remote_addr與$http_x_forwarded_for用以記錄客戶端的ip地址;
#$remote_user:用來記錄客戶端使用者名稱稱;
#$time_local: 用來記錄訪問時間與時區;
#$request: 用來記錄請求的url與http協議;
#$status: 用來記錄請求狀態;成功是200,
#$body_bytes_sent :記錄傳送給客戶端檔案主體內容大小;
#$http_referer:用來記錄從那個頁面連結訪問過來的;
#$http_user_agent:記錄客戶瀏覽器的相關資訊;
#通常web伺服器放在反向代理的後面,這樣就不能獲取到客戶的IP地址了,透過$remote_add拿到的IP地址是反向代理伺服器的iP地址。反向代理伺服器在轉發請求的http頭資訊中,可以增加x_forwarded_for資訊,用以記錄原有客戶端的IP地址和原來客戶端的請求的伺服器地址。
log_format access '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" $http_x_forwarded_for';
#定義本虛擬主機的訪問日誌
access_log /usr/local/nginx/logs/host.access.log main;
access_log /usr/local/nginx/logs/host.access.404.log log404;
#開啟限制IP連線數的時候需要使用
#limit_zone crawler $binary_remote_addr 10m;
#負載均衡配置
upstream jh.w3cschool.cn {
......
}
# 虛擬主機,也就是服務配置(可以多個)
server
{
#監聽埠
listen 80;
#域名可以有多個,用空格隔開,ip或者localhost(本機地址)
server_name www.w3cschool.cn w3cschool.cn;
index index.html index.htm index.php;
#對 "/" 啟用反向代理
location / {
root html; # 定義root根目錄
index index.html index.htm; # 主頁
proxy_pass http://127.0.0.1:88;
proxy_redirect off;
proxy_set_header X-Real-IP $remote_addr;
#後端的Web伺服器可以透過X-Forwarded-For獲取使用者真實IP
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
#以下是一些反向代理的配置,可選。
proxy_set_header Host $host;
#允許客戶端請求的最大單檔案位元組數
client_max_body_size 10m;
#高負荷下緩衝大小(proxy_buffers*2)
proxy_busy_buffers_size 64k;
#設定在寫入proxy_temp_path時資料的大小,預防一個工作程序在傳遞檔案時阻塞太長
#設定快取資料夾大小,大於這個值,將從upstream伺服器傳
proxy_temp_file_write_size 64k;
}
#設定檢視Nginx狀態的地址
location /NginxStatus {
stub_status on;
access_log on;
auth_basic "NginxStatus";
auth_basic_user_file confpasswd;
#htpasswd檔案的內容可以用apache提供的htpasswd工具來產生。
}
# 錯誤頁面,當頁面返回404時返回404.html(/指的網頁根目錄)
error_page 404 /404.html;
}
nginx限制訪問功能
在nginx.conf當中,編輯server當中新增
deny ip; # 把某ip禁用訪問,寫在location底下
nginx狀態資訊
狀態資訊功能,監測當前有多少連線數。
使用如下(在server當中新增一個location):
location /status {
stub_status on;
- 壓測命令ab
yum install httpd-tools
# 1000個併發,100000次請求
ab -kc 1000 -n 100000 http://192.168.119.10/
基於域名和更改server_name實現基於域名的虛擬主機
新增http模組當中server引數:
- 例如我有兩個域名:www.htsp.com、www.djsidsjd.com
可以這樣修改配置檔案
server {
listen 80;
server_name www.htsp.com;
location /{
root html/gtsp;
index index.html index.htm;
}
}
server {
listen 80;
server_name www.djsidsjd.com;
location /{
root html/djsidsjd;
index index.html index.htm;
}
}
這樣的話,重啟以後,透過域名的不同,我可以訪問不同的頁面。同樣暴露在80埠。
路徑url的正則匹配
匹配符 | 匹配規則 | 優先順序 |
---|---|---|
= | 精確匹配 | 1 |
^~ | 以某個字串開頭 | 2 |
~ | 區分大小寫的正則匹配 | 3 |
~* | 不區分大小寫的正則匹配 | 4 |
!~ | 區分大小寫不匹配的正則 | 5 |
!~* | 不區分大小寫不匹配的正則 | 6 |
/ | 通用匹配,任何請求都會匹配到 | 7 |
舉個例子:
server {
listen 80;
server_name pythonav.cn;
#優先順序1,精確匹配,根路徑
location =/ {
return 400;
}
#優先順序2,以某個字串開頭,以av開頭的,優先匹配這裡,區分大小寫
location ^~ /av {
root /data/av/;
}
#優先順序3,區分大小寫的正則匹配,匹配/media*****路徑
location ~ /media {
alias /data/static/;
}
#優先順序4 ,不區分大小寫的正則匹配,所有的****.jpg|gif|png 都走這裡
location ~* .*\.(jpg|gif|png|js|css)$ {
root /data/av/;
}
#優先7,通用匹配
location / {
return 403;
}
}
負載均衡
什麼是叢集
指一組或者若干個相互獨立的計算機,利用高速通訊網路組成一個較大的計算機服務系統。(一堆伺服器共同做一件事)
簡單地說,叢集就是指一組(若干個)相互獨立的計算機,利用高速通訊網路組成的一個較大的計算機服務系統,每個叢集節點(即叢集中的每臺計算機)都是執行各自服務的獨立伺服器。這些伺服器之間可以彼此通訊,協同向使用者提供應用程式、系統資源和資料,並以單一系統的模式加以管理。當使用者客戶機清求叢集系統時,叢集給使用者的感覺就是一個單一獨立的伺服器,而實際上使用者請求的是一組叢集伺服器。
開啟谷歌、百度的頁面,看起來好簡單,也許你覺得用幾分鐘就可以製作出相似的網頁,而實際上,這個頁面的背後是由成千上萬臺伺服器叢集協同工作的結果。而這麼多的伺服器維護和管理,以及相互協調工作也許就是讀者你未來的工作職責了。
若要用一句話描述叢集,即一堆伺服器合作做同一件事,這些機器可能需要整個技術團隊架構、設計和統一協調管理,這些機器可以分佈在一個機房,也可以分佈在全國全球各個地區的多個機房。
優點
-
高效能
一些需要大量計算的業務,即便是一臺算力很強的計算機,計算能力也是有限的。但是,集中幾十臺甚至萬-十萬臺的伺服器,可以極大的提高效能。
-
價格有效性
透過幾臺效能較低的伺服器叢集,可以媲美較高配置的伺服器,具有更高的價效比。
-
可伸縮性
當系統效能不足時,對叢集中的較低效能機器進行升配,比提高一個高效能伺服器的效能,相對來說更加簡單,花銷也較少
-
高可用性
單一計算機可能會面臨裝置損壞的情況,一旦損壞,業務全掛。而計算機叢集,其中一臺計算機的失效,不會使得所有業務都掛了。幾乎可以實現7*24的服務。
-
透明性(安全性)
對於伺服器叢集,使用者訪問叢集系統時,就像訪問一臺高效能伺服器一樣,不會暴露所有伺服器的情況。同時,部分伺服器的上下線,也不會中斷整個系統服務。
負載均衡
可以透過下文詳細瞭解:https://www.cnblogs.com/funcquery/p/16009094.html
-
工作情況:透過叢集,將web伺服器分為多個,從而減少單個伺服器的負擔
-
工作原理
使用者對負載均衡器傳送請求(大流量,多使用者),透過均衡器(根據演算法將流量分發)。以輪詢(一個一個發)或者加入權重的方式分發請求,讓多個服務共同工作,減少單臺伺服器的負荷,提高響應效率。
-
負載均衡和代理
從圖中看,代理與負載均衡幾乎是一樣的。最大的區別是:- 代理將請求轉發給了一臺伺服器。
- 負載均衡是透過演算法,將請求轉發到了多臺一模一樣的伺服器,從而實現單臺裝置負載的減少。(upstream虛擬代理池)
實現負載均衡、動靜分離的效果
-
將程式碼/服務跑在不同的機器,或者是跑在不同的埠。(相同的服務)
- 負載均衡(被分配的伺服器跑相同的服務。)
- 動靜分離(分為跑動態頁面和跑靜態頁面的伺服器組。)
-
對於不同的伺服器組(提供相同服務的伺服器)
配置:
# 動態頁面伺服器 upstream django { server 10.0.0.10:8000; # 也可以是自己伺服器的不同埠 # server 127.0.0.1:2481; server 10.0.0.11:9000; } # 靜態頁面伺服器 upstream static { server 192.168.119.11:80; }
- 預設的情況下,對伺服器組的分發是輪詢規則。
所有的規則如下:排程演算法 概述 輪詢 按時間順序逐一分配到不同的後端伺服器(預設) weight 加權輪詢,weight值越大,分配到的訪問機率越高 ip_hash 每個請求按訪問IP的hash結果分配,這樣來自同一IP的固定訪問一個後端伺服器 url_hash 按照訪問URL的hash結果來分配請求,是每個URL定向到同一個後端伺服器 least_conn 最少連結數,那個機器連結數少就分發
例子:
# 輪詢 upstream django { server 10.0.0.10:8000; server 10.0.0.11:9000; } # 權重 upstream django { server 10.0.0.10:8000 weight=5; server 10.0.0.11:9000 weight=10;#這個節點訪問比率是大於8000的 } # ip_hash # 每個請求按訪問ip的hash結果分配,這樣每個訪客固定訪問一個後端伺服器 upstream django { ip_hash; server 10.0.0.10:8000; server 10.0.0.11:9000; } # backup # 在非backup機器繁忙或者當機時,請求backup機器,因此機器預設壓力最小 upstream django { server 10.0.0.10:8000 weight=5; server 10.0.0.11:9000; server node.oldboy.com:8080 backup; }
- 在虛擬主機當中設定規則
這裡以動靜分離為例子
server { listen 80; server_name 192.168.119.12; # 當請求到達192.168.119.12:80/時,轉發給flask的8080應用 location / { proxy_pass http://django; include proxy_params; } # 當判斷資源請求是 192.168.119.12/girl.jpg時候,轉發請求給static地址池 # 的伺服器192.168.119.11/ location ~ .*\.(png|jpg|gif)$ { proxy_pass http://static; include proxy_params; } }
- 這樣就完成了負載均衡的配置。
- 預設的情況下,對伺服器組的分發是輪詢規則。